我正在使用 Beautiful Soup 尝试抓取网页。该代码运行得很好,但现在不起作用。我认为问题是,源站点更改了他们的登录页面。所以我更换了登录网址,但显然无法连接到该网址。我可以直接连接到它。那么有人可以尝试运行这个并告诉我我做错了什么吗?
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 访问登录页面呢?
最佳答案
简短回答:将方案 (http://
) 添加到 myurl
(从 www.cbssports.com
到 http ://www.cbssports.com
),然后将其用作 xurl
post 值。
更长的答案:您的 session 身份验证和请求代码没问题。我认为问题在于 cbs 的应用程序对您的 xurl
值感到困惑,参数 cbs 读取以决定在成功身份验证后将用户重定向到何处)。您传递的是无模式网址 www.cbssports.com
,cbs 将其解释为相对路径 - 没有 http://cbssports.com/www.cbssports.com
,所以它(正确但令人困惑)404。添加一个方案使其成为绝对 URL 可以修复此问题,为您的所有后续请求提供经过身份验证的 session 。万岁!
但是,我无法重现您遇到的connectionException
,这让我想知道这是否是网络拥塞而不是cbs方面的反抓取措施。
希望这对您有帮助。
关于Python POST 请求失败,[Errno 10054] 现有连接被远程主机强制关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34487818/