Python网络爬虫Zacks网站错误:[WinError 10054]远程主机强制关闭了现有连接。

3
我想获取此页面上的数据:https://www.zacks.com/stock/quote/MA 我尝试使用Python中的Beautiful Soup来做到这一点,但是出现了错误:“[WinError 10054]远程主机强制关闭了一个现有的连接”。
请问有人能指导我吗?
from bs4 import BeautifulSoup
import urllib
import re
import urllib.request

url = 'https://www.zacks.com/stock/quote/MA'

r = urllib.request.urlopen(url).read()
soup = BeautifulSoup(r, "lxml")
soup

谢谢!


如果您的问题已经解决,请接受一个答案。 - madik_atma
3个回答

1
该网站阻止了您的请求,可能是主机禁止不带请求头的请求。您可以尝试使用Selenium软件包模拟一个“真实”的请求。
这样做是有效的:
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from bs4 import BeautifulSoup




options = Options()

options.set_headless(headless=True)

url = 'https://www.zacks.com/stock/quote/MA'

browser = webdriver.Firefox(firefox_options=options)

browser.get(url)

html_source = browser.page_source

soup = BeautifulSoup(html_source, "lxml")

print(soup)

browser.close()

1
您的页面正在阻止用户代理python,用户代理基本上是“谁在发出请求”,请安装python模块fake user-agent并添加一个头部到请求中,模拟请求是由另一个浏览器(如google chrome、mozilla等)发出的。如果您想要指定特定的用户代理,我建议您查看fake-user-agent
使用urllib,我不知道如何添加头部(可能需要使用标志),但是我在这里为您提供了一个使用模块requests的简单代码:
import requests
from fake_useragent import UserAgent

ua = UserAgent()
header = {
    "User-Agent": ua.random
}
r = requests.get('https://www.zacks.com/stock/quote/MA', headers=header)
r.text #your html code

在此之后,您可以像之前一样使用BeautifulSoup和r.text:

soup = BeautifulSoup(r.text, "lxml")
soup

编辑:

如果你想使用urllib实现这个功能,可以按照以下步骤进行:

 import urllib
 from fake_useragent import UserAgent

 ua = UserAgent()
 q = urllib.Request('https://www.zacks.com/stock/quote/MA')
 q.add_header('User-Agent', ua.random)
 a = urlopen(q).read()

0

摘自这里的答案

这是致命的。远程服务器向您发送了一个RST数据包,表示立即断开连接,而不是通常的握手。这绕过了正常的半关闭状态转换。我喜欢这个描述:

“对等方重置连接”是TCP/IP中挂断电话的等效操作。它比不回复更礼貌,让人不再等待。但它不是真正有礼貌的TCP/IP交谈者所期望的FIN-ACK。

这是因为在进行Python请求时定义的用户代理未被查询站点接受,因此远程Web服务器会断开连接。因此,您看到了连接重置错误。我尝试使用cURL请求,它可以正常工作,所以您只需要在标头部分定义您的用户代理。像这样:

>>> header = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:32.0) Gecko/20100101 Firefox/32.0',}
>>> url = 'https://www.zacks.com/stock/quote/MA'
>>> r = requests.get(url, headers=header, verify=False)
>>> soups = BS(r.text,"lxml")
>>> print(soups.prettify())

然后进行所需的GET请求,希望你能做得好。


运行得很好!谢谢 - Vasconni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接