urllib2 返回空 HTML
我在尝试爬取一个第三方网站的时候,遇到了一些问题:
我用urlopen打开一个网站时能收到响应,但当我读取和打印HTML内容时,似乎什么都没有返回。这可能是因为对方网站有某种阻止措施吗?或者其他什么原因?
目前,我正在尝试打开《纽约时报》的文章。主页能返回HTML内容,但文章的部分,呃,似乎就不行。
try:
source = urllib.urlopen(target_site)
html = source.read()
print "HTML: ", html.lower()
输出:
HTML:
(other stuff)
哦,还有,有时候会超时,但那是另外一回事,我希望如此。
3 个回答
0
如果你在使用urllib2的时候遇到这个问题,可能是因为你只收到了一个包含重定向链的meta标签。你可以通过打印打开网址后的结果并读取它来确认这一点:
<meta http-equiv="refresh" content="0;url=http://www.yourURL.com.mx/ads.txt"/>
首先检查一下你是否正确地将cookies保存到cookie jar中,然后可以看看这个链接:如何在Python中跟随meta刷新
0
我想推荐一下requests这个库。用它来做这个事情相对简单。在你的电脑上运行 easy_install requests
或者 pip install requests
就可以安装它了:
import requests
page = requests.get(page_url)
html = page.content
补充:我看到评论里有人提到的那个网址,想确认一下 requests.get
确实可以用来访问那个页面。
3
这不是《纽约时报》文章的问题。可能是因为你在请求头中没有合适的用户代理,所以它拒绝给你页面。这篇文章告诉你怎么做。
如果是这种情况,可以试试这个:
try:
req = urllib2.Request(target_site)
req.add_header("User-Agent", "Mozilla/5.0")
source = urllib.urlopen(req)
html = source.read()
print "HTML: ", html.lower()
算了,这不是《纽约时报》文章的问题。问题在于nytimes.com试图给你发送cookies,但发送失败了,这导致了重定向循环。你需要创建一个可以处理cookies的自定义网址打开器。你可以通过以下方式访问这个链接:
#make an url opener that can handle cookies
opener = urllib2.build_opener(urllib2.HTTPCookieHandler())
#read in the site
response = opener.open(target_site)
html = response.read()
为了确认这是否是正确的文章,你可以把它写出来,然后在网页浏览器中打开。