我正在使用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访问?
答案 0 :(得分:1)
简短回答:在将http://
作为myurl
帖子值使用之前,将方案(www.cbssports.com
)添加到http://www.cbssports.com
(从xurl
到xurl
)。 / 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具有同一页面的不安全版本(?)。