Python+Beautiful Soup爬取动态生成一次性登录请求URL网站的登录过期问题求助
Python+Beautiful Soup爬取动态生成一次性登录请求URL网站的登录过期问题求助
兄弟,我之前也碰到过一模一样的情况!你现在的问题核心在于:网站的登录请求URL是和当前会话绑定的动态值,而且一次性有效,你用手动登录拿到的URL或者直接硬编码的URL,根本不属于程序自己的会话,自然会提示过期。
给你一套靠谱的解决思路,用requests结合BeautifulSoup来处理,全程保持会话一致性:
核心逻辑
网站生成的动态登录URL、还有可能存在的CSRF令牌这类验证参数,都是和你访问登录页时的会话Cookie绑定的。所以必须让程序先自己去加载登录页,实时获取这些动态值,再用同一个会话提交登录请求,这样就不会触发过期验证了。
具体步骤+代码示例
import requests from bs4 import BeautifulSoup # 第一步:创建会话对象,它会自动帮我们管理Cookie,保持会话一致性 session = requests.Session() # 第二步:先访问登录页面,拿到动态登录URL和验证参数 # 替换成你要爬的网站的登录页面地址 login_page_url = "https://xxx.com/login" login_page_response = session.get(login_page_url) soup = BeautifulSoup(login_page_response.text, "html.parser") # 从登录页的表单里提取动态生成的登录请求URL(一般在form标签的action属性里) # 这里需要根据实际网站的表单结构调整选择器,比如按id、class找表单 login_form = soup.find("form", {"id": "login-form"}) # 如果action是相对路径,要拼接成绝对URL login_post_url = requests.compat.urljoin(login_page_url, login_form["action"]) # 同时提取表单里的隐藏验证参数(比如CSRF令牌,很多网站都有这个) # 同样要根据实际网站的字段名调整,比如name属性是csrf_token或者csrfmiddlewaretoken csrf_token = soup.find("input", {"name": "csrf_token"})["value"] # 第三步:准备登录表单数据,要包含所有表单要求的字段(包括刚才拿到的验证参数) login_data = { "username": "你的用户名", "password": "你的密码", "csrf_token": csrf_token, # 有些网站还有next参数,用来指定登录后跳转的页面,也从表单里提取带上 # "next": soup.find("input", {"name": "next"})["value"] } # 第四步:用同一个会话提交登录请求 login_response = session.post(login_post_url, data=login_data) # 验证登录是否成功(可以根据登录后页面的特征文本判断) if "欢迎回来" in login_response.text: # 替换成网站登录成功后的标识文本 print("登录搞定!") # 现在就可以用这个session对象去爬需要登录权限的页面了 target_page_response = session.get("https://xxx.com/需要登录的页面") target_soup = BeautifulSoup(target_page_response.text, "html.parser") # 接下来就可以正常解析页面数据啦 else: print("登录失败,检查下表单参数或者选择器是否正确哦")
关键注意点
- 必须用Session对象:千万不要单独用
requests.get/post,那样每次请求都是独立的会话,Cookie不共享,网站会认为你是新的请求,直接判定URL过期。 - 实时提取动态参数:登录请求URL和CSRF令牌这类参数,必须每次访问登录页后实时解析,绝对不能复用之前手动获取的值。
- 匹配表单所有字段:打开网站的登录页,按F12查看表单的所有字段(包括隐藏字段),全部要加到
login_data里,少一个都可能登录失败。
备注:内容来源于stack exchange,提问作者Ryan Lachance
相关产品推荐
相关产品推荐

