我正在尝试使用网址阅读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")
两种情况都有相同的结果。
请帮助。
答案 0 :(得分:1)
根据我的测试,此行为与urllib
无关。例如,requests
库也会发生同样的事情。
根据您的IP地址和用户代理(UA)字符串,Twitter似乎会检测到针对搜索网址重复点击的自动抓取。在某些时候,后续命中返回空结果。这似乎发生在一天左右之后,可能是因为推特分析延迟了。
如果更改搜索URL请求标头中的UA字符串,则应再次在响应中收到有效结果。 Twitter可能会在一段时间后再次阻止您,因此您需要经常更改您的UA字符串。
我认为推特在超时后会过期,但我不知道会花多长时间。
作为参考,twitter-past-crawler project演示了使用从包含多个UA字符串的文件中获取的半随机UA字符串。
此外,Twitter-Search-API-Python项目使用硬编码的UA字符串,在第一次测试后一天左右停止工作。更改代码中的字符串(添加随机字符)会导致恢复先前的功能。