【问题标题】:Python POST Request Failing, [Errno 10054] An existing connection was forcibly closed by the remote hostPython POST 请求失败,[Errno 10054] 现有连接被远程主机强行关闭
【发布时间】:2015-12-28 04:48:43
【问题描述】:

我正在使用 Beautiful Soup 来尝试抓取网页。该代码运行良好,但现在无法正常工作。我认为问题在于,源站点更改了他们的登录页面。所以我替换了 loginurl,它显然无法连接到该 url。我可以直接连接到它。那么有人可以尝试运行它并告诉我我做错了什么吗?

import requests
from bs4 import BeautifulSoup
import re
import pymysql
import datetime

myurl = 'http://www.cbssports.com'

loginurl = 'https://auth.cbssports.com/login/index'

try:
    response = requests.get(loginurl)
except requests.exceptions.ConnectionError as e:
    print "BAD DOMAIN"

payload = {  
   'dummy::login_form': 1,  
   'form::login_form': 'login_form',  
   'xurl': myurl,  
   'master_product': 150,  
   'vendor': 'cbssports',  
   'userid': 'myuserid',  
   'password': 'mypassword', 
   '_submit': 'Sign in' }

session = requests.session()
p = session.post(loginurl, data=payload)

#(code to scrape the web page)

我收到以下错误: requests.exceptions.ConnectionError: HTTPSConnectionPool(host='auth.cbssports.com', port=443): Max retries exceeded with url: /login (引起: [Errno 10054] 现有连接被远程主机强行关闭)

网站是否主动阻止我的自动登录?还是我的数据负载有问题?

编辑:这是一段更简单的代码...

import requests

myurl = 'http://www.cbssports.com'

loginurl = 'https://auth.cbssports.com/login/index'

try:
    response = requests.get(myurl)
except requests.exceptions.ConnectionError as e:
    print "My URL is BAD"

try:
    response = requests.get(loginurl)
except requests.exceptions.ConnectionError as e:
    print "Login URL is BAD"

请注意,登录 url 是错误的,但主要的不是。我可以在浏览器中手动访问这两个网址。那么为什么登录页面无法通过 Python 访问呢?

【问题讨论】:

  • 看来问题是新的授权站点是https而不是http,Python有https的问题。有谁知道如何解决这个问题?我试过 pip 安装 requests[security] 但没有帮助。

标签: python post web-scraping beautifulsoup python-requests


【解决方案1】:

简短回答:将方案 (http://) 添加到 myurl(从 www.cbssports.comhttp://www.cbssports.com),然后将其用作 xurl 后值。


更长的答案:您的会话身份验证和请求代码很好。我认为问题在于 cbs 的应用程序对您的 xurl 值感到困惑,参数 cbs 读取以决定在成功验证后将用户重定向到哪里)。您正在传递一个无模式 url,www.cbssports.com,cbs 将其解释为相对路径 - 没有 http://cbssports.com/www.cbssports.com,所以它(正确但令人困惑)是 404s。添加一个方案以使其成为绝对 url 可解决此问题,为您提供所有后续请求的经过身份验证的会话。呵呵!

但是,我无法重现您遇到的connectionexception,这让我怀疑这是网络拥塞而不是 cbs 方面的反抓取措施。

希望这有帮助。

【讨论】:

  • 这并不能解决问题。我插入无模式只是为了替换我在原始代码中的 url。但即使我将 http:// 添加到它,它仍然返回相同的错误。 (参见我添加的第二个示例代码)。
【解决方案2】:

好的,我不确定为什么会这样,但我只需将登录地址中的 https 更改为 http 即可解决此问题。就像魔术一样,它奏效了。看来 cbs 可能有同一页面的不安全版本(?)。

【讨论】:

猜你喜欢
  • 2012-02-07
  • 2011-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多