自学内容网 自学内容网

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

目标

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 scrapy


class 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 scrapy


class GitloginSpider(scrapy.Spider):
    name = 'gitlogin'
    allowed_domains = ['github.com']
    start_urls = ['http://github.com/login']

    def parse(self, response):
        # 从登陆页面响应中解析出post数据

        # CSRF  Token 每次和服务器交互都会 生成新的token
        token = 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的传递传递过程


原文地址:https://blog.csdn.net/HG0724/article/details/143052645

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!