模拟登录功能和发送POST请求
- 目标
- 1. 模拟登陆的方法
- 2. scrapy携带cookies,直接获取需要登陆后的页面
- 实现:重构scrapy的start_rquests方法 - 携带cookies登陆github ⭐⭐
- 3. scrapy.Request发送post请求
- 3.1 发送post请求
- 3.1.1思路分析
目标
1.应用请求对象cookies参数的使用
2.了解start_requests函数的作用 - 尤其了解如何重构start_requests函数
3.应用构造并发送post请求
1. 模拟登陆的方法
- 1.1 requests模块是如何实现模拟登陆的?
1.直接携带cookies请求页面
2.找url地址,发送post请求存储cookie
- 1.2 selenium是如何模拟登陆的?
1.找到对应的input标签,输入文本点击登陆 - 1.3 scrapyl的模拟登陆
1.直接携带cookies
2.找url地址,发送post请求存储cookie
2. scrapy携带cookies,直接获取需要登陆后的页面
- 应用场景
1.cookie过期时间很长,常见于一些不规范的网站
2.能在cookie过期之前把所有的数据拿到
3.配合其他程序使用,比如其使用selenium把登陆之后的cookie获取到保存到本地
,scrapy发送请求之前 先读取本地cookie
实现:重构scrapy的start_rquests方法 - 携带cookies登陆github ⭐⭐
重构scrapy的start_rquests方法 可能涉及到的场景如下:
- 携带cookies登陆github
如果start_url地址中的url是需要登录后才能访问的uri地址,则需要重写start_request方法并在其中手动添加上cookie
- Cookies 用于多种目的,包括但不限于:
会话管理:服务器可以使用 cookies 来识别用户的会话。当用户登录网站时,服务器会在用户的浏览器上设置一个 cookie,该 cookie 在用户的浏览器上存储一个唯一的会话标识符。在后续的请求中,浏览器会自动发送这个cookie,服务器可以使用它来识别用户的会话。
个人化设置:网站可以使用 cookies 来存储用户的个人设置,如语言偏好、主题选择等。
追踪用户行为:cookies 可用于追踪用户的浏览行为,这有助于网站分析用户行为,优化用户体验,或用于广告定位。
认证
:在某些情况下,cookies 用于存储认证令牌,这些令牌允许用户在一段时间内保持登录状态,而无需重复输入用户名和密码。
- 模拟github登录
import scrapyclass Git1Spider(scrapy.Spider):name = 'git1'allowed_domains = ['github.com']start_urls = ['https://github.com/haozhenHG']#你的github页面def start_requests(self):url = self.start_urls[0]temp = 'xxxx' ## 在你的github页面上邮件检查网页源代码 查看cookies 换成你自己的cookie# 解析成 字典 {key : value }的样子cookies = {data.split('=')[0] : data.split('=')[-1] for data in temp.split(';')}yield scrapy.Request(url=url,callback=self.parse,cookies=cookies,)def parse(self, response):# 获取用户名print(response.xpath('/html/body/div[1]/div[4]/main/div[2]/div/div[1]/div/div[2]/div[1]/div[2]/h1/span/text()').extract_first())
- 登录后的github页面
注意:
1.
scrapy中cookie不能够放在headers中,在构造请求的时候有专门的,cookies参数,能够接受字典形式的 coookie
2.在setting中设置ROBOTS协议
、USER_AGENT='xxxz'
3. scrapy.Request发送post请求
我们知道可以通过scrapy.Request(0指定method、body参数来发送post请求;但是通常使用
scrapy.FormRequest()
来发送post请求
3.1 发送post请求
注意:scrapy…FormRequest0能够发送表单和ajax请求,参考阅读
python使用scrapy发送post请求的坑
3.1.1思路分析
1.找到post的url地址:点击登录按钮进行抓包,然后定位url地址为https:/github.com/session
2.找到请求体的规律:分析post请求的请求体,其中包含的参数均在前一次的响应中
3.是否登录成功:通过请求个人主页,观察是否包含用户名
为什么这样获取token值?
CSRF Token(跨站请求伪造令牌)
用途:防止跨站请求伪造攻击。
工作方式:通常在表单中包含一个隐藏的输入字段,或者在 AJAX 请求中作为请求头发送。
变化性:每次用户与服务器交互时,服务器可能会生成一个新的CSRF token。
- 代码
import scrapyclass GitloginSpider(scrapy.Spider):name = 'gitlogin'allowed_domains = ['github.com']start_urls = ['http://github.com/login']def parse(self, response):# 从登陆页面响应中解析出post数据# CSRF Token 每次和服务器交互都会 生成新的tokentoken = response.xpath('//input[@name="authenticity_token"]/@value').extract_first()# 时间戳是不断变化的额 去网页中获取timestamp = response.xpath('//input[@name="timestamp"]/@value').extract_first()timestamp_secret = response.xpath('//input[@name="timestamp_secret"]/@value').get()print('token : %s '%token,'timestap : %s '%timestamp,'timestamp_secret : %s'%timestamp_secret)post_data = {'commit': 'Sign in','authenticity_token': token,'add_account':'','login': 'xxx','password': 'xxx','webauthn-conditional': 'undefined','javascript-support': 'true','webauthn-support': 'supported','webauthn-iuvpaa-support': 'supported','return_to': "https://github.com/login",'allow_signup':'','client_id':'','integration':'','required_field_4c0d':'','timestamp': timestamp,'timestamp_secret': timestamp_secret,}print(post_data)# 针对登陆url发送post请求yield scrapy.FormRequest(url = 'https://github.com/session',callback = self.after_login,formdata = post_data)def after_login(self,response):yield scrapy.Request('https://github.com/haozhenHG',callback=self.check_login)def check_login(self, response):print(response.xpath('/html/body/div[1]/div[5]/main/div/div/div[1]/div/div/div[1]/div[2]/h1/span/text()').get())
- 输出结果
技巧:在settings..py中通过设置COOKIES_DEBUG=TRUE能够在终端看到cookie的传递传递过程