urllib.request.urlopen表现得很奇怪。第二天没有返回数据。为什么?

时间:2017-08-27 15:36:44

标签: python json urllib

我正在尝试使用网址阅读Twitter Feed。昨天我能够使用代码提取一些80K的推文,并且由于我的机器上的一些更新,我的Mac终端在python代码完成之前停止响应。

今天相同的代码没有返回任何json数据。它给我带来空洞的结果。如果我在浏览器中键入相同的URL,我可以获得一个包含完整数据的json文件。

这是我的代码: 方法1:

try:
    urllib.request.urlcleanup()
    response = urllib.request.urlopen(url)
    print('URL to  used: ', url)
    testURL = response.geturl()
    print('URL you used: ', testURL)
    jsonResponse = response.read()
    jsonResponse = urllib.request.urlopen(url).read()

打印出来:

URL to  used:  https://twitter.com/i/search/timeline?f=tweets&q=%20since%3A2017-08-14%20until%3A2017-08-15%20USA&src=typd&max_position=
URL you used:  https://twitter.com/i/search/timeline?f=tweets&q=%20since%3A2017-08-14%20until%3A2017-08-15%20USA&src=typd&max_position=
json:  {'items_html': '\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n', 'focused_refresh_interval': 30000, 'has_more_items': False, 'min_position': 'TWEET--', 'new_latent_count': 0}

****方法2:****

try:
    request = urllib.request.Request(url, headers=headers)
except:
    print("Thats the problem here:")

try:
    response = urllib.request.urlopen(request)
except:
    print("Exception while fetching response")

testURL = response.geturl()
print('URL you used: ', testURL)

try:
    jsonResponse = response.read()
except:
    print("Exception while reading response")

两种情况都有相同的结果。

请帮助。

1 个答案:

答案 0 :(得分:1)

根据我的测试,此行为与urllib无关。例如,requests库也会发生同样的事情。

根据您的IP地址和用户代理(UA)字符串,Twitter似乎会检测到针对搜索网址重复点击的自动抓取。在某些时候,后续命中返回空结果。这似乎发生在一天左右之后,可能是因为推特分析延迟了。

如果更改搜索URL请求标头中的UA字符串,则应再次在响应中收到有效结果。 Twitter可能会在一段时间后再次阻止您,因此您需要经常更改您的UA字符串。

我认为推特在超时后会过期,但我不知道会花多长时间。

作为参考,twitter-past-crawler project演示了使用从包含多个UA字符串的文件中获取的半随机UA字符串。

此外,Twitter-Search-API-Python项目使用硬编码的UA字符串,在第一次测试后一天左右停止工作。更改代码中的字符串(添加随机字符)会导致恢复先前的功能。