type
status
date
slug
summary
tags
category
icon
password
Django写的页面默认会有csrf验证,故爬虫会稍微麻烦一点。
1.报错:CSRF cookie not set
或者CSRF token missing or incorrect
都是
CSRF token
未写好的缘故,post请求时的参数除了username和password,注意看浏览器里的其他参数,可能叫X-CSRFToken
或者 X-CSRF-Token
,或者csrfmiddlewaretoken
。怎么拿到
CSRF token
?# 创建Session对象 session = requests.Session() response = session.get(url1) # 从响应的 Cookie 中获取 CSRF Token soup = BeautifulSoup(response.text, 'html.parser') #{'name': 'csrfmiddlewaretoken'}中的csrfmiddlewaretoken是自己在HTML里找的命名 csrf_token = soup.find('input', {'name': 'csrfmiddlewaretoken'})['value']
或者
# 创建Session对象 session = requests.Session() response = session.get(url1) csrf_token = None for cookie in response.cookies: #cookie.name == 'csrftoken'基本是固定的,不需要改动 if cookie.name == 'csrftoken': csrf_token = cookie.value break if csrf_token is None: # 没有获取到 CSRF Token print('Failed to get CSRF Token') exit()
2.post登录成功后,get请求仍打开登录页
前提已经使用session保持会话了,get仍打开登录页,可以考虑
login_data
是否除了username password csrftoken,还缺参数,对着浏览器debug看,比如# 设置登录信息,包括用户名、密码和_csrf_token等 login_data = { 'username': username, 'password': password, 'csrfmiddlewaretoken': csrf_token, 'this_is_the_login_form': 1, 'next': '/' }