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

标签 python amazon-ec2 web-scraping twitter python-requests

我希望能够抓取 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/

相关文章:

python 默认上下文对象 ssl

java - httpclient 版本与 Apache Spark 之间的冲突

python - 在没有有效响应之前无法一一使用代理

javascript - 确认 phantom.js 中的警报窗口

python - 使用 pymongo tailable 游标死于空集合

python - 如何计算 pyspark 数据框中某个键的出现次数 (2.1.0)

javascript - 使用 Django 和 Javascript 验证表单字段时出现 ValueError

amazon-ec2 - 使用 "instance store"停止 Amazon EC2 实例

amazon-ec2 - 无法在资源 AWS::ECS::Service 上添加标签

python - Scrapy 使用代理时出现错误——twisted.python.failure.Failure OpenSSL.SSL.Error