使用urllib2抓取Biography.com
我之前有过抓取网站的经验,但这次我遇到了麻烦。我想在Biography.com上搜索一个人,并获取他的传记。但是每次我用urllib2
去查询这个网址:http://www.biography.com/search/时,页面都是空白的,没有任何数据。
当我在浏览器中点击查看源代码时,发现里面也没有任何数据。使用Chrome的开发者工具时,我找到了一些数据,但还是没有找到指向传记的链接。
我尝试过更改用户代理、添加引用、在Python中使用cookies,但都没有效果。如果有人能帮我解决这个问题,那就太好了。
我打算把这些文本用于我的自然语言处理项目,最糟糕的情况就是我得手动复制粘贴这些文本。但我希望不至于走到那一步。
3 个回答
你可以通过httpfox这个Firefox的插件来找到一个api的地址。例如,http://www.biography.com/.api/item/search?config=published&query=marx这个链接会给你返回一个json格式的数据,你可以在里面搜索/people/来获取传记的链接。或者你也可以使用像selenium这样的网页抓取工具。
你很可能需要手动复制和粘贴,因为 biography.com 是一个完全基于 JavaScript 的网站,所以用传统的方法无法提取网站上的内容。
Chrome或Chromium的开发者工具(或者Firebug)在这里非常有用。我发现Biography网站的初始搜索是通过调用一个Google的API来完成的,比如:
https://www.googleapis.com/customsearch/v1?q=Barack%20Obama&key=AIzaSyCMGfdDaSfjqv5zYoS0mTJnOT3e9MURWkU&cx=011223861749738482324%3Aijiqp2ioyxw&num=8&callback=angular.callbacks._0
我使用的搜索词在查询字符串的q=
部分:q=Barack%20Obama
。
这个请求会返回一个JSON格式的数据,其中有一个link
的键,值是你感兴趣的文章的URL。
"link": "http://www.biography.com/people/barack-obama-12782369"
访问那个页面可以看到,这个页面是通过请求生成的:
http://api.saymedia-content.com/:apiproxy-anon/content-sites/cs01a33b78d5c5860e/content-customs/@published/@by-custom-type/ContentPerson/@by-slug/barack-obama-12782369
这个请求返回的也是JSON格式的数据,里面包含HTML内容。
所以,把barack-obama-12782369
这个链接的最后部分替换成你感兴趣的人的相关信息,可能就能获取到你想要的内容。
具体操作步骤:
- 你需要使用
urllib2
(或者requests
)通过他们的Google API进行搜索,使用urllib2.urlopen(url)
或requests.get(url)
。把Barack%20Obama
替换成一个URL编码的搜索字符串,比如Bill%20Clinton
。 - 使用Python的
json
模块解析JSON,提取出给你http://www.biography.com/people
链接的字符串。从中提取出你感兴趣的部分(就像上面的barack-obama-12782369
)。 - 使用
urllib2
或requests
发起一个saymedia-content
的API请求,把@by-slug/
后面的barack-obama-12782369
替换成你从第二步提取的内容;也就是再对这个URL使用一次urllib2.urlopen
。 - 解析第二次请求返回的JSON,提取你想要的内容。
(注意:前提是这两个API调用中没有会过期的会话字符串。)
另外,你也可以使用Selenium来访问网站,进行搜索,然后提取内容。