Python新手求助:带密码认证的目标页面爬取问题
解决登录后维持会话爬取目标页面的问题
嘿,我来帮你搞定这个问题!你现在的核心困扰是没有保留登录后的会话状态——单独用requests.post发登录请求,只会完成这一次请求,登录生成的Cookie不会自动跟着后续的请求走,所以直接requests.get目标页面的时候,网站会认为你没登录,跳回登录页。
requests库的Session()就是专门解决这个问题的,它会自动帮你保存和携带会话Cookie,让后续请求都处于登录状态。下面是修改后的完整代码,我还帮你清理了没用的导入,调整了关键逻辑:
from bs4 import BeautifulSoup import requests import re # 登录信息 username = 'myusername' password = 'mypass' # 关键:创建Session对象,用来维持会话 session = requests.Session() # 1. 先发送登录请求,Session会自动保存登录Cookie login_url = "http://fantasy.trashtalk.co/login.php" login_data = {'email': username, 'password': password} session.post(login_url, data=login_data) # 2. 用同一个Session请求目标页面,此时会携带登录后的Cookie target_url = "http://fantasy.trashtalk.co/?tpl=classement&t=1" # 注意把&改成&,这是HTML转义字符,实际请求要用& response = session.get(target_url) # 现在可以正常解析目标页面的内容了 soup = BeautifulSoup(response.text, 'lxml') # 比如提取你需要的链接(这里保留你原来的逻辑,你可以根据需求修改) for link in soup.find_all('a', attrs={'href': re.compile("^https://")}): print(link.get('href'))
关键说明:
- Session的作用:
requests.Session()相当于打开一个持续的浏览器会话,所有通过这个session发的请求,都会共享Cookie、请求头等信息,完美模拟用户登录后浏览页面的行为。 - 修正目标URL:你原来的
target_url里的&是HTML中的转义字符,实际请求时要改成&,否则网站可能无法识别正确的参数。 - 验证登录状态:如果不确定是否登录成功,可以先打印
response.text,看看是不是目标页面的内容,而不是登录页的内容。如果还是登录页,可能需要检查登录表单的字段名是否正确(比如有些网站用username而不是email,可以用浏览器F12开发者工具查看登录表单的字段)。
额外小提示:
- 可以给session添加一些请求头(比如
User-Agent),模拟真实浏览器请求,避免被网站识别为爬虫。 - 如果登录时需要验证码或者其他验证步骤,那就要额外处理,但从你的描述看,这个网站应该是简单的账号密码登录,用上面的代码就够了。
内容的提问来源于stack exchange,提问作者C.Otteaga
相关产品推荐
相关产品推荐

