python - 从 Web 链接收集数据到列表/数据框
问题描述
我有一个网络链接如下:
https://www.nseindia.com/live_market/dynaContent/live_watch/option_chain/optionKeys.jsp
我使用下面的代码来收集数据,但得到错误:
requests.exceptions.ConnectionError: ('Connection aborted.', OSError("(10060, 'WSAETIMEDOUT')",))
我的代码:
from requests import Session
import lxml.html
expiry_list = []
try:
session = Session()
headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36'}
session.headers.update(headers)
url = 'https://www1.nseindia.com/live_market/dynaContent/live_watch/option_chain/optionKeys.jsp'
params = {'symbolCode': 9999, 'symbol': 'BANKNIFTY', 'instrument': 'OPTIDX', 'date': '-', 'segmentLink': 17}
response = session.get(url, params=params)
soup = lxml.html.fromstring(response.text)
expiry_list = soup.xpath('//form[@id="ocForm"]//option/text()')
expiry_list.remove(expiry_list[0])
except Exception as error:
print("Error:", error)
print("Expiry_Date =", expiry_list)
它在我的本地机器上运行完美,但在 Amazon EC2 实例中出现错误需要更改任何设置以解决请求超时错误。
解决方案
AWS 包含许多僵尸网络,因此垃圾邮件黑名单经常列出 AWS IP。您的 EC2 可能是列入黑名单的 IP 块的一部分。您可以通过将您的公共 EC2 IP 放在此处https://mxtoolbox.com/来进行验证。我会尝试验证您是否甚至可以从命令行通过 curl 发出请求curl -v {URL}
. 如果超时,那么我敢打赌你的 IP 被远程服务器的防火墙规则阻止了。由于您的家庭 IP 可以访问,您可以尝试在您的网络上设置 VPN,让 EC2 连接到您的 VPN,然后重试您的 python 脚本。那时它应该可以工作,但是就好像您是从家里发出请求一样(所以不要做任何愚蠢的事情)。大多数路由器允许您直接在管理 UI 中设置 OpenVPN 或 PPTP VPN。我怀疑一旦你的 EC2 的 IP 发生变化,你就会欺骗上游服务器并能够抓取。
推荐阅读
- azure - 解压缩存储在 Azure Databricks FileStore 中的文件夹
- powerbi - 如何使用 WEEKNUM 获取周一到周五的计数?
- cplex - Cplex Studio 不支持 dvar 浮点数
- google-chrome-devtools - 像在 Firefox 中一样在 Chrome 上突出显示元素
- java - 回收recyclerview时应用的布局被破坏
- node.js - 错误:代码 ELIFECYCLE npm ERR!错误号 134
- python - 在 great_expectations 中使用腌制的 pandas 数据框作为数据资产
- c# - 部分视图模型从主视图返回 null
- php - 从多维数组中查找最后一个数组并获取索引
- arrays - 为 laravel 请求创建一个嵌套数组