Ошибка веб-очистки Zacks на веб-сайте Python: [WinError 10054] Существующее соединение было принудительно закрыто удаленным хостом - PullRequest
0 голосов
/ 14 февраля 2019

Я хотел бы получить данные, расположенные на этой странице: https://www.zacks.com/stock/quote/MA

Я пытался сделать это с Beautiful Soup в Python, но я получаю сообщение об ошибке: "[WinError 10054] Существующее соединениебыла принудительно закрыта удаленным узлом

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

Ваша страница блокирует python пользовательского агента, пользовательский агент в основном «кто выполняет запрос», устанавливает модуль python поддельный user-agent и добавляет заголовок к запросу, имитирующий, что запроссоздается для другого, такого как Google Chrome, Mozilla и т. д., если вы хотите, чтобы определенный пользовательский агент, я рекомендую вам посмотреть на поддельный пользовательский агент

с 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

После этого вы можете использовать beatifull soup с 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 голосов
/ 14 февраля 2019

Взято из этого ответа здесь :

Это смертельно.Удаленный сервер отправил вам пакет RST, который указывает на немедленное прекращение соединения, а не на обычное рукопожатие.Это обходит нормальный переход полузамкнутого состояния.Мне нравится это описание:

"Сброс соединения по пиру" - это TCP / IP-эквивалент отбрасывания телефона обратно на крючок.Это более вежливо, чем просто не отвечать, оставляя одного повешенным.Но это не ожидание FIN-ACK от по-настоящему вежливого конвертера TCP / IP. "

Это потому, что пользовательский агент, определенный при выполнении запросов Python, не принимается запрашиваемым сайтоми, следовательно, соединение было разорвано удаленным веб-сервером. Отсюда и ошибка сброса соединения, которую вы видите. Я попытался выполнить запрос cURL, и он работал нормально, поэтому все, что вам нужно сделать, это определить свой User-Agent в разделе заголовка.как это:

>>> 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, и я надеюсь, что вы будете в порядке.

0 голосов
/ 14 февраля 2019

Сайт блокирует ваш запрос, возможно, хост не разрешал запросы без заголовка запроса.Вы можете попытаться смоделировать «реальный» запрос с помощью пакета 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...