当前位置: 首页 > news >正文

Scrapy | 通过模拟登录功能认识cookies参数及start_requests函数实现发送POST请求

模拟登录功能和发送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的传递传递过程


http://www.mrgr.cn/news/53984.html

相关文章:

  • Pytorch常用函数汇总【持续更新】
  • Scrapy | 使用Scrapy进行数据建模和请求
  • string
  • 【生物大分子入门】三. 配体分子的提取与结构表示方法
  • Python 自编码器(Autoencoder)算法详解与应用案例
  • 【Flutter】Dart:环境搭建
  • Flux.from 使用说明书
  • 功能安全实战系列-软件FEMA分析与组件鉴定
  • 【C语言教程】【嵌入式编程】(一)介绍与前提条件(二)嵌入式编程基础(三)硬件基础知识(四)硬件寄存器操作
  • Linux下进行用户的切换与创建以及细微设置
  • 中华传承-医山命相卜-四柱八字
  • 基于STM32的智能交通灯控制系统设计与实现思路:LoRa、控制算法结合
  • stablediffusion 关于fp32、fp16和fp8是什么 分别有什么区别
  • AcWing1027
  • ◇【论文_20150225】 DQN_2015(nature) 〔Google DeepMind〕
  • 【Java基础】1、Java入门
  • 数据结构--栈和队列
  • 从零开始学PHP之安装开发环境
  • 单层卷积网络/简单卷积网络示例
  • GDAL+C#实现矢量多边形转栅格
  • 达梦数据守护集群_组分裂的数据恢复(一)
  • 架构设计笔记-22-论文
  • linux centos7系统ARM架构下安装最新版docker 27.3.1及docker-compose v2.3.4
  • “擒牛MACD“,很好用的抓强势波动指标,源码
  • 麒麟v10系统安装docker镜像
  • 联邦学习实验复现—MNISIT IID实验 pytorch