urllib2 返回空 HTML

0 投票
3 回答
1309 浏览
提问于 2025-04-17 17:31

我在尝试爬取一个第三方网站的时候,遇到了一些问题:

我用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()

为了确认这是否是正确的文章,你可以把它写出来,然后在网页浏览器中打开。

撰写回答