首页 > 解决方案 > 使用 BeautifulSoup 抓取数据时出错

问题描述

我想从 IMDB 用户页面抓取会员年数数据。

链接

对于这个页面,有多个徽章,一个徽章对所有用户都是通用的,即最后一个。

我的代码:

def getYear(review_url):

    response = requests.get(review_url, headers = { 
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
    })
    soup = BeautifulSoup(response.text, 'html.parser')
    year = soup.find_all('div', attrs={'class': 'value'})
    ## year = soup.select('.value')

    return year[-1].get_text() 

我参考了各种来源,发现在标题中添加用户代理已经解决了他们的问题,但我添加了相同的但没有工作。

函数调用:

getYear('https://www.imdb.com/user/ur102180396')

错误:

IndexError                                Traceback (most recent call last)
<ipython-input-24-dc3ce3a7e637> in <module>()
----> 1 getYear('https://www.imdb.com/user/ur102180396')

<ipython-input-23-5871162c538d> in getYear(review_url)
      6     year = soup.find_all('div', attrs={'class': 'value'})
      7 
----> 8     return year[-1].get_text()

IndexError: list index out of range

这个错误是因为 soup.find_all() 方法返回空列表。我不知道为什么会这样,我对beautifulsoup 很陌生。可以看到奇怪的行为,有时这个函数工作正常并给出输出,但是一旦我对所有数据(2136 个用户链接)调用这个函数,就会得到这个错误。

所有用户的函数调用:

years = [getYear(url) for url in user_links]

这里 user_links 是包含 2136 个用户 url 的列表。

标签: pythonweb-scrapingbeautifulsoupfind

解决方案


可以看到奇怪的行为,有时这个函数工作正常并给出输出,但是一旦我对所有数据(2136 个用户链接)调用这个函数,就会得到这个错误。

这可能是因为 IMDB 没有响应您的请求,因为您一次发出了太多请求(在本例中为 2136 个)。


推荐阅读