我希望能够抓取 Twitter 的热门话题。
当然,最自然的方法是使用 Twitter API。然而,大多数趋势都没有 Tweet_count,这对我来说很关键。
所以我决定抓取 Twitter 网站,结果一团糟。
首先,我只是追求 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
并遇到了类似的问题。我确实在私有(private) session 上使用 DevTools 发现 twitter 在内部转到 https://api.twitter.com/2/guide.json
端点,这就是返回数据的实际资源我正在寻找(趋势和推文量)。但是,无论我使用 requests
做什么,我都无法使用 python
访问它。我尝试使用与浏览器相同的 headers
和相同的 params
,但无济于事。
然后我转向selenium,就像以前一样,我确实在本地获取了数据,但不是服务器上的实际 TT 数据。所以现在我很迷茫。我不知道足够多的网络开发人员来准确理解这是否是 cookie 问题或什么问题,也不知道如何修复它。
TL;DR:我想用 python 抓取 Twitter 的热门话题,但它不起作用。
最佳答案
它不起作用的主要原因是 Twitter 阻止了 AWS EC2 实例 IP。这不是服务器问题,而是 Twitter 本身临时设置的屏蔽。我进行了大量搜索,发现用于 Twitter 抓取的各种库都存在相同的问题。
在这种情况下,我建议使用代理,或者可以将提供商更改为 Linode 或 digital ocean。我还检查了 Heroku,结果发现它的 IP 在一些请求后也被阻止了。
代理的使用在 request-docs 的文档链接中得到了很好的解释。 .
从您的代码来看,解决方案应该是
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
.
关于python - 无法从我的本地 PC 和 AWS EC2 实例从 Twitter Web 获取相同的请求结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58532112/