使用urllib2抓取Biography.com

3 投票
3 回答
706 浏览
提问于 2025-04-18 03:19

我之前有过抓取网站的经验,但这次我遇到了麻烦。我想在Biography.com上搜索一个人,并获取他的传记。但是每次我用urllib2去查询这个网址:http://www.biography.com/search/时,页面都是空白的,没有任何数据。

当我在浏览器中点击查看源代码时,发现里面也没有任何数据。使用Chrome的开发者工具时,我找到了一些数据,但还是没有找到指向传记的链接。

我尝试过更改用户代理、添加引用、在Python中使用cookies,但都没有效果。如果有人能帮我解决这个问题,那就太好了。

我打算把这些文本用于我的自然语言处理项目,最糟糕的情况就是我得手动复制粘贴这些文本。但我希望不至于走到那一步。

3 个回答

-1

你可以通过httpfox这个Firefox的插件来找到一个api的地址。例如,http://www.biography.com/.api/item/search?config=published&query=marx这个链接会给你返回一个json格式的数据,你可以在里面搜索/people/来获取传记的链接。或者你也可以使用像selenium这样的网页抓取工具。

0

你很可能需要手动复制和粘贴,因为 biography.com 是一个完全基于 JavaScript 的网站,所以用传统的方法无法提取网站上的内容。

5

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这个链接的最后部分替换成你感兴趣的人的相关信息,可能就能获取到你想要的内容。

具体操作步骤:

  1. 你需要使用urllib2(或者requests)通过他们的Google API进行搜索,使用urllib2.urlopen(url)requests.get(url)。把Barack%20Obama替换成一个URL编码的搜索字符串,比如Bill%20Clinton
  2. 使用Python的json模块解析JSON,提取出给你http://www.biography.com/people链接的字符串。从中提取出你感兴趣的部分(就像上面的barack-obama-12782369)。
  3. 使用urllib2requests发起一个saymedia-content的API请求,把@by-slug/后面的barack-obama-12782369替换成你从第二步提取的内容;也就是再对这个URL使用一次urllib2.urlopen
  4. 解析第二次请求返回的JSON,提取你想要的内容。

(注意:前提是这两个API调用中没有会过期的会话字符串。)

另外,你也可以使用Selenium来访问网站,进行搜索,然后提取内容。

撰写回答