2017-08-27 47 views
1

我想讀通過URL Twitter的飼料。昨天我能拉使用的代碼和一些80K鳴叫,由於我的機器上的一些更新,我的Mac終端停止完成Python代碼之前響應。urllib.request.urlopen是表現奇怪。第二天不返回數據。爲什麼?

今天,同樣的代碼不會返回任何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

我得到同樣的響應,你怎麼做。 – elena

+0

奇怪的是正確的。有時我得到它,有時不 –

+0

嘛,我不要在瀏覽器中得到合理的迴應要麼。 – elena

回答

1

根據我的測試此行爲無關urllib。例如requests庫也會發生同樣的情況。

看來Twitter的自動檢測通過對搜索URL重複命中刮,根據您的IP地址和用戶代理(UA)字符串。在某些時候,隨後的命中返回空結果。這似乎發生在一天左右之後,可能是由於推特分析的延遲。

如果更改搜索URL請求頭中的UA字符串,應再次接收應答中的有效結果。 Twitter可能會在一段時間後再次阻止你,所以你需要經常更換你的UA字符串。

我認爲Twitter的一些到期後超時這些塊,但我不知道過了多久,將採取。

作爲參考,該twitter-past-crawler project演示了使用從包含多個UA串的文件中取出的半隨機UA字符串。

此外,Twitter-Search-API-Python項目使用硬編碼的UA字符串,它停止了我的第一次測試後一天左右的工作。更改代碼中的字符串(添加隨機字符)會導致恢復之前的功能。

+1

是的,絕對我同意你的迴應。我也測試過了。當我改變到不同的IP地址時,事情開始運作良好。 –

相關問題