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

Python 无法从本地PC和AWS EC2实例从Twitter Web获取相同的请求结果,python,amazon-ec2,web-scraping,twitter,python-requests,Python,Amazon Ec2,Web Scraping,Twitter,Python Requests,我希望能够搜集推特的热门话题 当然,实现这一点的自然方法是使用twitterapi。然而,大多数趋势都没有Tweet_计数,这对我来说是关键 所以我决定清理推特网站,结果弄得一团糟 首先,我只是在我的本地计算机上进行了跟踪,它工作得很好,现在仍然如此。然后我尝试在我的AWS EC2实例上设置脚本,但没有得到任何结果。 这是代码的简化版本: import requests from bs4 import BeautifulSoup url = 'http://twitter.com/i/tre

我希望能够搜集推特的热门话题

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

所以我决定清理推特网站,结果弄得一团糟

首先,我只是在我的本地计算机上进行了跟踪,它工作得很好,现在仍然如此。然后我尝试在我的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
endpoint内部,这是返回我要查找的数据(趋势和推特数量)的实际资源。然而,无论我做了什么,对于
请求
,我都无法使用
python
访问它。我尝试使用与浏览器相同的
标题
和相同的
参数
,但没有效果

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


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

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

我建议在这种情况下使用代理,或者可以将提供商更改为Linode或digital ocean。我还检查了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也有类似的库,这可能会有所帮助。
即使这样,我也会建议,如果数据量很大,那么你应该考虑使用多个代理并频繁地旋转它们,并尝试使用异步请求库。

你在本地机器上使用什么?如果是windows,那么您可能会在标题中复制windows特定的
用户代理。尝试在EC2实例上使用Linux特定的
用户代理
字符串。您可以通过快速谷歌搜索获得一个,也可以尝试安装
lynx
命令行浏览器,查看它生成的标题。谢谢您的评论。我使用linux。我尝试从我的web浏览器中使用
用户代理
,但没有成功。我也在服务器上尝试了
Lynx
,但也没有成功。