如何抓取imdb网页?

数据挖掘 数据挖掘 Python
2021-09-17 03:45:29

作为学习数据分析的一部分,我正在尝试自己学习使用 Python 进行网络抓取。我正在尝试抓取imdb 网页

我正在使用 BeautifulSoup 模块。以下是我正在使用的代码:

r = requests.get(url) # where url is the above url    
bs = BeautifulSoup(r.text)
for movie in bs.findAll('td','title'):
    title = movie.find('a').contents[0]
    genres = movie.find('span','genre').findAll('a')
    genres = [g.contents[0] for g in genres]
    runtime = movie.find('span','runtime').contents[0]
    year = movie.find('span','year_type').contents[0]
    print title, genres,runtime, rating, year

我得到以下输出:

The Shawshank Redemption [u'Crime', u'Drama'] 142 mins. (1994)

使用此代码,我可以抓取标题、流派、运行时间和年份,但我无法抓取 imdb 电影 ID,也无法抓取评级。检查元素后(在 chrome 浏览器中),我无法找到可以让我使用与上面类似的代码的模式。

谁能帮我写一段代码,让我刮取电影ID和收视率?

4个回答

您可以尝试直接在此处获取数据,而不是抓取。看起来他们可以通过 ftp 获取电影、演员等的数据。

我已经能够想出一个解决方案。我想张贴以防万一它对任何人有任何帮助,或者如果有人想提出不同的建议。

bs = BeautifulSoup(r.text)
for movie in bs.findAll('td','title'):
    title = movie.find('a').contents[0]
    genres = movie.find('span','genre').findAll('a')
    genres = [g.contents[0] for g in genres]
    runtime = movie.find('span','runtime').contents[0]
    rating = movie.find('span','value').contents[0]
    year = movie.find('span','year_type').contents[0]
    imdbID = movie.find('span','rating-cancel').a['href'].split('/')[2]
    print title, genres,runtime, rating, year, imdbID

输出如下所示:

The Shawshank Redemption [u'Crime', u'Drama'] 142 mins. 9.3 (1994) tt0111161

作为一些一般性的反馈,我认为你会很好地改进你的输出格式。现有格式的问题在于没有一种透明的方式来以编程方式获取数据。考虑改为尝试:

print "\t".join([title, genres,runtime, rating, year])

制表符分隔文件的好处是,如果您最终放大,它可以很容易地读入像 impala 之类的东西(或者在较小的比例下,简单的 mySql 表)。此外,您可以使用以下方式以编程方式读取 python 中的数据:

 line.split("\t")

第二点建议是,我建议您在最初的抓取中获取比您认为需要的更多信息。磁盘空间比处理时间便宜,因此每次扩展分析时重新运行爬虫将不会很有趣。

您可以从 div 中获取所有内容 class="rating rating-list"

您需要做的就是检索属性 id:[id="tt1345836|imdb|8.5|8.5|advsearch"] 当您拥有此内容时,您将此字符串拆分为'|',然后您会得到:

  1. 参数:电影id
  2. 参数:电影分数