无法从我的本地PC和AWS EC2实例从Twitter Web获得相同的请求结果



我希望能够抓取Twitter的趋势主题。

当然,实现这一点的自然方法是使用Twitter API。然而,大多数趋势都没有Tweet_count,这对我来说是关键

所以我决定刮推特网站,结果它一团糟。

首先,我只是去追https://twitter.com/i/trends它在我的本地电脑上运行良好,现在仍然如此。然后我尝试在我的AWS EC2实例上设置脚本,但没有得到任何结果。这是代码的简化版本:

import requests
from bs4 import BeautifulSoup

url = 'http://twitter.com/i/trends'
r = requests.get(url)
html = r.json()['module_html']
soup = BeautifulSoup(html, 'html.parser')
trends_list = soup.find_all('span', {'class':'u-linkComplex-target trend-name'})
tweet_volume_list = soup.findAll('div', {'class':'js-nav trend-item-stats js-ellipsis'})

就像我说的,效果很好。但是,如果我在AWS中的Linux服务器上运行相同的代码,那么r.content的结果就是'{}'

所以我试着使用mobile.twitter.com/i/trends,却遇到了类似的问题。我确实在私人会话上的DevTools中发现,twitter在内部会转到https://api.twitter.com/2/guide.json端点,这是返回我要查找的数据(趋势和推特数量(的实际资源。然而,无论我用requests做了什么,我都无法用python访问它。我尝试使用与浏览器相同的headersparams,但没有成功。

然后我转到selenium,和以前一样,我确实在本地获取了数据,但没有在服务器上获取实际的TT数据。所以在这一点上我很失落。我不知道足够的网络开发人员来确切地了解这是否是一个cookie问题或什么,也不知道如何解决它

TL;DR:我想用python抓取推特的趋势主题,但它不起作用。

它不起作用的主要原因是Twitter阻止了AWS EC2实例IP。这不是服务器问题,而是推特自己临时设置的一个块。我搜索了很多,发现用于twitter抓取的各种库也存在同样的问题。

我建议在这种情况下使用代理,或者可以将提供商更改为Linode或数字海洋。我还检查了Heroku,发现它的IP在一些请求后也被屏蔽了。

代理的使用在这个来自请求文档的文档链接中得到了很好的解释。

从你的代码来看,解决方案应该是


import requests
from bs4 import BeautifulSoup
proxies = [
"http": "http://10.10.1.10:3128",
"https": "http://10.10.1.10:1080",
"http": "your proxy server"
]
url = 'http://twitter.com/i/trends'
r = requests.get(url, proxies=proxies)
html = r.json()['module_html']
soup = BeautifulSoup(html, 'html.parser')
trends_list = soup.find_all('span', {'class':'u-linkComplex-target trend-name'})
tweet_volume_list = soup.findAll('div', {'class':'js-nav trend-item-stats js-ellipsis'})

您还应该尝试一些免费的代理服务器,python也有像free-proxy这样的库,这可能会有所帮助。即便如此,我还是建议,如果数据量很大,那么您应该考虑使用多个代理并频繁轮换它们,还可以尝试使用aiohttp等异步请求库。

最新更新