Python POST请求失败,[Errno 10054]远程主机

时间:2015-12-28 04:48:44

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

我正在使用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):使用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"

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

2 个答案:

答案 0 :(得分:1)

简短回答:在将http://作为myurl帖子值使用之前,将方案(www.cbssports.com)添加到http://www.cbssports.com(从xurlxurl)。 / p>

更长的答案:您的会话身份验证和请求代码很好。我相信问题是cbs的应用程序被www.cbssports.com的值所混淆,参数cbs读取以决定在成功验证后重定向用户的位置)。你传递的是一个无模式的网址http://cbssports.com/www.cbssports.com,cbs正在将其解释为相对路径 - 没有connectionexception,所以它(正确但是容易引起混淆)404。添加一个方案,使其成为绝对URL修复此问题,为所有后续请求提供经过身份验证的会话。好哇!

然而,我无法重现你所经历的 from(mailServer + "?" + "username=" + mailUsername + "&" + "password=" + mailPassword + "&" + "consumer.delay=" + EVERY_15_MINUTES) .routeId("mainPoller") .filter(exchange -> exchange.getIn().getHeader("subject", StringUtils.EMPTY, String.class).contains(mailSubject)) .to("activemq:send.details"); ,这让我想知道这是否是网络拥塞而不是cbs方的反刮措施。

希望这有用。

答案 1 :(得分:1)

好的我不知道为什么会这样,但我通过简单地将https更改为登录地址中的http来解决这个问题。就像魔术一样,它起作用了。似乎cbs具有同一页面的不安全版本(?)。

相关问题