【问题标题】:Error message 10054 when wescraping with requests module使用请求模块进行抓取时出现错误消息 10054
【发布时间】:2019-05-31 17:31:04
【问题描述】:

这里是新程序员。在我学习 python 的时候尝试 webscrape pof 网站。尝试使用请求和漂亮的汤进行网络抓取。提前致谢

错误似乎来自 res=requests.get('https://www.pof.com/everyoneonline.aspx?page_id=%s' %pageId) 行

我尝试删除分页页面,只刮一页,但没有成功 还尝试在每个请求之间使用 time.sleep 3 秒,但这也不起作用

#Username and password 
username='MyUsername'
password='MyPassword'


#Login to pof site
from selenium import webdriver
import bs4,requests
browser = webdriver.Chrome(executable_path='/Users/Desktop/geckodriver-v0.24.0-win32/chromedriver.exe')
browser.get('https://www.pof.com')
linkElem= browser.find_element_by_link_text('Sign In')
linkElem.click()
usernameElem=browser.find_element_by_id('logincontrol_username')
usernameElem.send_keys(username)
passwordElem=browser.find_element_by_id('logincontrol_password')
passwordElem.send_keys(password)
passwordElem.submit()

#Webscraping online profile links from first 7 pagination pages
for pageId in range(7):
    res=requests.get('https://www.pof.com/everyoneonline.aspx?page_id=%s' %pageId)
    res.raise_for_status()
    soup= bs4.BeautifulSoup(res.text)
    profile = soup.findAll('div', attrs={'class' : 'rc'})
    for div in profile:
        print (div.findAll('a')['href'])

预期结果: 打印配置文件的所有 href 链接列表,以便稍后将它们保存到 csv

实际结果: requests.exceptions.ConnectionError: ('Connection aborted.', ConnectionResetError(10054, '现有连接被远程主机强行关闭', None, 10054, None))enter code here

【问题讨论】:

  • 您正在使用...请求和硒?通常您想使用其中一个,因为 requests 模块不会“看到” selenium 连接。在这种情况下,很可能该页面正在识别来自您的 IP 的两个并发连接并强制关闭一个或两个,因此“现有连接被远程主机强制关闭”

标签: python beautifulsoup python-requests


【解决方案1】:

我会在抓取网页时为您提供一些一般信息:

  1. 首先,不要将请求与 selenium 一起使用!根据我的经验,在 90% 的情况下,请求是最快、最简单的解决方案。
  2. 始终尝试为您的请求提供标头。不提供标题会导致网页可疑,甚至可能会阻止您的所有请求(您遇到的错误可能是因为这个!)
  3. 对于网页的后续请求,使用会话!,这样您的 cookie 将被存储,您实际上可以长时间访问已登录的页面。
  4. 这个比较客观,但如果你已经知道正则表达式,我建议使用re 模块。 BeautifulSoup 很棒,但对于一般用途,根据我的经验,re 更容易。

所以现在回答你的问题;那里有很多不同的网页,但我建议从所有这些网页中抓取:

提取数据~


标题数据

  • 打开支持检查元素的常用浏览器。转到您尝试从中抓取的网页并打开检查元素停靠栏。
  • 转到Network 部分。在这里,您可以看到浏览器发出的所有请求,以及标头和来源。
  • 发出您要模拟的请求,跟踪网络选项卡,转到包含所需 GET 或在您的情况下为 POST 方法的请求。
  • 复制该特定请求的请求标头。您不需要所有这些(例如,cookie 参数将由会话添加,因此本示例不需要它;也不需要以 : 开头的标头,如 :method: POST
  • 将复制的标头从浏览器放入 python 字典,这是该网页的示例:
headers = {
"accept": "application/json, text/javascript, */*; q=0.01",
"accept-encoding": "gzip, deflate, br",
"accept-language": "en-US,en;q=0.9,fa-IR;q=0.8,fa;q=0.7,de;q=0.6",
"content-type": "application/x-www-form-urlencoded; charset=UTF-8",
"dnt": "1",
"origin": "https://stackoverflow.com",
"referer": "https://stackoverflow.com/questions/56399462/error-message-10054-when-wescraping-with-requests-module",
"user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) snap Chromium/74.0.3729.169 Chrome/74.0.3729.169 Safari/537.36",
}

发布数据

  • 如果你想发出一个帖子请求,在请求的Headers 部分应该有另一个部分,命名为“Payload”或“Form Data”行。将其内容放入另一个 python dict 中,并根据需要更改其内容。

使用数据~


现在您已准备好将提取的数据用于 python 请求,然后在响应内容上使用 reBeautifulSoup 以提取所需的数据。
在此示例中,我登录到 https://aavtrain.com/index.asp
试着按照我写的步骤来理解这里发生的事情:

import requests
username = "something"
password = "somethingelse"
headers = {
"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
"accept-encoding": "gzip, deflate, br",
"cache-control": "max-age=0",
"content-type": "application/x-www-form-urlencoded",
"dnt": "1",
"origin": "https://aavtrain.com",
"referer": "https://aavtrain.com/index.asp",
"upgrade-insecure-requests": "1",
"user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) snap Chromium/74.0.3729.169 Chrome/74.0.3729.169 Safari/537.36"
}
data = {
"user_name": username,
"password": password,
"Submit": "Submit",
"login": "true"
}
with requests.Session() as session:
    session.get("https://aavtrain.com/index.asp")
    loggedIn = session.post("https://aavtrain.com/index.asp", headers=headers, data=data)
    #... do stuff after logged in..

我希望这会有所帮助,请提出任何挥之不去的问题,我会尽快回复您。

【讨论】:

    猜你喜欢
    • 2020-04-27
    • 1970-01-01
    • 2016-08-25
    • 2018-06-03
    • 2018-06-06
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多