如何抓取imdb网页?


10

我正在尝试自己使用Python学习网络抓取,作为学习数据分析的一部分。我正在尝试抓取网址为以下内容的imdb网页:http : //www.imdb.com/search/title? sort=num_votes,desc&start=1&title_type=feature&year=1950,2012

我正在使用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和等级的代码吗?


1
我稍微编辑了您的代码,但由于rating未定义而失败。如果您解决了该问题,也可以添加from BeautifulSoup import BeautifulSoupimport requests。而且为什么不同时展示,url="http://etc"让我们不必自己做呢?
Spacedman

Answers:


12

除了尝试抓取,您还可以尝试直接在此处获取数据:http : //www.imdb.com/interfaces。看来他们可以通过ftp获得电影,演员等数据。


2
@Gred Thatcher,感谢您的链接。该项目是有关网络抓取以及所有这些麻烦的学习努力的一部分。-:)
user62198

8

我已经能够找出解决方案。我考虑过发布,以防万一对任何人有帮助,或者有人想提出一些不同的建议。

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

2

您可以使用class =“ rating rating-list”从div中获取所有内容

您需要做的就是获取属性ID:[id =“ tt1345836 | imdb | 8.5 | 8.5 | advsearch”]当您拥有此内容时,请用'|'分割此字符串,然后得到:1.参数:movie id 3.参数:电影总谱


谢谢。@Matic DB ...我能够获得ID ..以下是我的解决方案
user62198 2015年

2

作为一般反馈,我认为您可以很好地改善输出格式。就目前的格式而言,问题在于没有透明的方法可以以编程方式获取数据。考虑改为尝试:

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

制表符分隔文件的好处是,如果最终扩大规模,可以很容易地将其读取为impala之类的文件(或者以较小的规模读取简单的mySql表)。此外,您可以使用以下命令以编程方式读取python中的数据:

 line.split("\t")

第二点建议是,我建议您获得比您最初认为的更多的信息。磁盘空间比处理时间便宜,因此,每当您扩展分析时重新运行刮板将不会很有趣。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.