首页 > 解决方案 > 从 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 实例中出现错误需要更改任何设置以解决请求超时错误。

标签: pythonpython-3.xpandasweb-scrapingrequest

解决方案


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 发生变化,你就会欺骗上游服务器并能够抓取。


推荐阅读