【问题标题】:with urllib urlopen read function but get none使用 urllib urlopen 读取功能,但没有得到
【发布时间】:2015-02-27 10:42:15
【问题描述】:

[https://tools.usps.com/go/TrackConfirmAction.action?tRef=fullpage&tLc=1&text28777=&tLabels=LN594080445CN]

import urllib
url='https://tools.usps.com/go/TrackConfirmAction.action?tRef=fullpage&tLc=1&text28777=&tLabels=LN594080445CN'  
page=urllib.urlopen(url).read()

但是得到 page=''

我的版本:2.7.6

【问题讨论】:

  • 可能是因为ssl,或者是用户代理
  • 请指定您使用的 Python 版本以及导入模块的方式。当我复制您的代码和import urllib 时,它说urllib 没有方法urlopen :)
  • 你为什么使用 urllib?

标签: python urlopen


【解决方案1】:

嗯,我尝试使用 python 包requests 并首先出现错误: requests.exceptions.TooManyRedirects: Exceeded 30 redirects.

它似乎从 url 重定向到另一个并像这样循环。也许它在 urllib 上失败了。 我还检查了 urlopen 的文档,似乎 https 请求有问题。

无论我发现什么代码可以解决您的问题:

import requests

url='https://tools.usps.com/go/TrackConfirmAction.action?tRef=fullpage&tLc=1&text28777=&tLabels=LN594080445CN'

s = requests.session()
s.headers['User-Agent'] = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36'

response = s.get(url)
print response.text

创建会话修复有关最大重定向错误的错误。更多信息在this question。 在response.text 你有所有的代码页,我猜是你想要的。

当然,您需要添加您的特定用户代理。例如,有我的,但你的可能不同。你可以找到它here 希望有帮助!

【讨论】:

  • ,我试过了,有时会出现另一个问题,但是,谢谢
【解决方案2】:

我试过这个网址,发现错误是由于一个HTTP Error 301,应该是这个网站的防爬虫机制造成的。你必须设计一个复杂的用户代理来获取页面,而不仅仅是一个简单的urlopen

【讨论】:

  • ,是的,我必须做某事。更多
【解决方案3】:

我建议不要在任何现代 Python 上下文中使用 urllib。请改用“Requests”(“HTTP for Humans”)。

但在此之前,正如@Skyler 所说,结果是重定向,您的第一站应该是查看curl 报告的内容:

$ curl -I 'https://tools.usps.com/go/TrackConfirmAction.action?tRef=fullpage&tLc=1&text28777=&tLabels=LN594080445CN\]'
HTTP/1.1 301 Moved Permanently
Server: AkamaiGHost
Content-Length: 0
Location: https://www.usps.com/root/global/server_responses/webtools-msg.htm
Date: Wed, 31 Dec 2014 10:43:14 GMT
Connection: keep-alive

没什么大不了的,但是你可以看到URL it redirects to states

要了解如何集成免费的 Postal Service® Address 和 将 API 跟踪到您的应用程序中,请访问 www.usps.com/webtools。

也足够公平。我建议去那里注册。如果有适当的方法,就没有必要抓取 HTML。

但是,如果您真的想通过代码提取原始 HTML:首先通过 Curl 让它工作。

调出 Chrome 开发者工具并重新加载页面。右键单击并查找“复制为 CURL”。您可以编辑链接。以下对我有用,尽管它可能会被修剪得更多:

curl 'https://tools.usps.com/go/TrackConfirmAction.action?tRef=fullpage&tLc=1&text28777=&tLabels=LN594080445CN\]' \
-H 'Accept-Encoding: gzip, deflate, sdch' \
-H 'Accept-Language: en-US,en;q=0.8' \
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36' \
-H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' \
--compressed

这可以修剪。下面的代码适用于漂亮的requests 模块:

import requests

headers = {
    'Accept-Language': 'en-US,en;q=0.8',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
}
r = requests.get('https://tools.usps.com/go/TrackConfirmAction.action?tRef=fullpage&tLc=1&text28777=&tLabels=LN594080445CN]', headers=headers)

print "Status: %s" % r.status_code
print "Content-type: %s" % r.headers['content-type']
print "Content length: %d" % len(r.text)

跑步:

$ python demo.py
Status: 200
Content-type: text/html
Content length: 55142

更干净:

params = {
    'tRef': 'fullpage',
    'tLc': '1',
    'text28777': '',
    'tLabels': 'LN594080445CN]',
}

r = requests.get('https://tools.usps.com/go/TrackConfirmAction.action',
        params=params,
        headers=headers)

正如我所说,我认为这不是正确的选择。使用 USPS API。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 2014-11-09
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    • 2016-06-22
    • 2018-05-05
    相关资源
    最近更新 更多