爬虫中scrapy模拟登录

每日分享:

有人三分钟泡面,有人三小时煲汤;有人的外卖已送达,而有人才刚切好菜。当你选好了你要的方式,坚定下去,别胡思乱想;我们要走的路不一样,花期也不一样,不必焦虑。

目标:

  1. 应用 请求对象cookies参数的使用
  2. 了解 start_requests函数的作用
  3. 应用 构造并发送post请求

一、回顾之前的模拟登录方法

1.1 requests模块如何实现模拟登录

  1. 直接携带cookies请求页面
  2. 找url地址,发送post请求存储cookie

1.2 selenium如何模拟登录

  1. 找到对应的input标签,输入文本(账号密码)点击登录

1.3 scrapy模拟登录(和requests登录思想一致)

  1. 直接携带cookies
  2. 找url地址,发送post请求存储cookie

二、scrapy携带cookies直接获取需要登录后的页面

应用场景:

  1. cookie过期时间很长,常用于一些比较low的网站(对cookie的管理不严)
  2. 能在cookie过期之前把所有的数据拿到
  3. 配合其他程序使用,比如其使用selenium把登录之后的cookie获取保存到本地,scrapy发送请求之前先读取本地cookie

2.1 实现:重构scrapy中的start_requests方法

scrapy中的start_url是通过start_requests来进行处理的,其实现代码如下:

#源代码
def start_requests(self):
    cls = self.__class__
    if not self.start_urls and hasattr(self, 'start_url'):
        raise AttributeError(
            "Crawling could not start: 'start_urls' not found "
            "or empty (but found 'start_url' attribute instead, "
            "did you miss an 's'?)")
    if method_is_overridden(cls, Spider, 'make_requests_from_url'):
        warnings.warn(
            "Spider.make_requests_from_url method is deprecated; it "
            "won't be called in future Scrapy releases. Please "
            "override Spider.start_requests method instead "
            f"(see {cls.__module__}.{cls.__name__}).",
        )
        for url in self.start_urls:
            yield self.make_requests_from_url(url)
    else:
        for url in self.start_urls:
            yield Request(url, dont_filter=True)

def make_requests_from_url(self, url):
    """ This method is deprecated. """
    warnings.warn(
        "Spider.make_requests_from_url method is deprecated: "
        "it will be removed and not be called by the default "
        "Spider.start_requests method in future Scrapy releases. "
        "Please override Spider.start_requests method instead."
    )
    return Request(url, dont_filter=True)

所以说,如果start_url地址中的url是需要登录后才能访问的url地址,则需要重写start_request方法并在其中手动添加上cookie

2.2 携带cookies登录github

提示:

cookie要用昵称密码登录,而且最好是没有用验证码,直接登录进去的,之后抓包获取cookie;需要验证码抓包获取的cookie会登录失败

import scrapy

class CgithubSpider(scrapy.Spider):
    name = 'cgithub'
    allowed_domains = ['github.com']
    start_urls = ['https://github.com/aoospdk']

    # 重构start_requests方法
    def start_requests(self):
        # 抓包获取的cookie_str
        cookie_str = '登录后抓包获取的cookie'
        # 将cookie_str转化为cookie_dict
        cookie_dict = {data.split('=')[0]: data.split('=')[1] for data in cookie_str.split('; ')}
        yield scrapy.Request(
            url=self.start_urls[0],
            callback=self.parse,
            cookies=cookie_dict
        )

    # 输出title,后面没有· GitHub就证明登录成功
    def parse(self, response):
        print('--------------', response.xpath('/html/head/title/text()').extract_first())

注意:

  1. scrapy中cookie不能够放在headers中,在构造请求的时候有专门的cookies参数,能够接收字典形式的cookie
  2. 要在setting中注释ROBOTS协议,并且打开注释USER_AGENT(要把内容替换为自己的user-agent)

爬虫中scrapy模拟登录

结果:

爬虫中scrapy模拟登录

可以看到,输出后面没有· GitHub,证明登录成功

三、scrapy.Request发送post请求

可以通过scrapy.Request()指定method、body参数来发送post请求;但通常使用scrapy.FormRequest()来发送post请求

  1. 找到post的url地址:抓包获取
  2. 找到请求体规律:分析post请求中的数据,构建post_data
  3. 判断是否登录成功:看title

代码框架如下:

import scrapy

class Cgithub2Spider(scrapy.Spider):
    name = 'cgithub2'
    allowed_domains = ['github.com']
    start_urls = ['https://github.com/session']

    def parse(self, response):
        # 登录页面解析出post数据
        post_data = {
""
        }
        # 使用FormRequest发送post请求
        yield scrapy.FormRequest(
            url='https://github.com/session',
            callback=self.after_login,
            formdata=post_data
        )

    # 发送get请求
    def after_login(self):
        yield scrapy.Request(url='https://github.com/aoospdk', callback=self.cheak_login)

    # 输出title
    def cheak_login(self, response):
        print('--------------', response.xpath('/html/head/title/text()').extract_first())

可以在settings.py中通过设置COOKIES_DEBUG=true 能够在终端看到cookie的传递过程

总结:

  1. start_urls中的url地址是交给start_requests处理的,如果有必要,可以重写start_request函数
  2. 直接携带cookie登录:cookie只能传递给cookies参数接收
  3. scrapy.FormRequest()发送post请求

Original: https://blog.csdn.net/qq_52262831/article/details/121890143
Author: 黑马蓝汐
Title: 爬虫中scrapy模拟登录

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/789550/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • springcloud3 EurekaClient集群的搭建2

    一 概述 1.1 概述 本文主要是搭建集成eurekaserver的几个客户端,即服务提供者,消费者。架构图如下所示 1.2 使用eureka整合的优点 使用Eureka管理注册的…

    Python 2023年9月17日
    037
  • DRF 序列化器ORM查询技巧

    前言:许久没有用Django和DRF了,最近又用了用,发现Django版本更新后发生了不少变化,因此记录下一些ORM的查询方法和与Serializer的配合 环境: python=…

    Python 2023年8月6日
    061
  • Django设置中文

    创建Django项目时,默认是英文显示,如图所示:要想设置成中文,需要更改配置文件。在settings.py文件的中间件列表中,加入: ‘django.middleware.loc…

    Python 2023年8月5日
    051
  • win10 anaconda用conda命令安装

    安装方法:第1步:先尝试conda install lightgbm(大概率找不到包。如果成功那恭喜,下面的步骤就不用看了)如果安装失败提示找不到,往下看。 第2步:conda i…

    Python 2023年9月9日
    040
  • pandas行列转换的4大技巧

    公众号:尤而小屋作者:Peter编辑:Peter 大家好,我是Peter~ 本文介绍的是Pandas中4个行列转换的方法,包含: melt 转置T或者transpose wide_…

    Python 2023年8月6日
    045
  • 实验十六 matplotlib数据可视化

    目录 第1关:各省gdp的和生成条状图 相关知识 第2关:各省银行数量绘制饼图 相关知识 第3关:各类银行数量绘制折线图 第4关:各日超市销售金额绘制折线图 任务描述 相关知识 编…

    Python 2023年8月22日
    056
  • Java云原生崛起微服务框架Quarkus入门实践

    @ 概述 定义 GraalVM简介 为何使用 特性 官方性能 实战 入门示例 步骤 安装GraalVM 创建quarkus工程 Idea导入项目 Idea运行和调试 打包成普通的J…

    Python 2023年10月18日
    033
  • python3 pygame load图片不显示_Python——mac下pygame踩坑,绘制图像不加载

    问题描述:mac下python3版本安装pygame后开发小游戏时,背景和角色在画布上不加载,创建游戏循环执行时,一直加载背景不刷新; pygame相对比较简单,直接上代码: im…

    Python 2023年9月23日
    044
  • CentOS 安装Django及启动

    7是一种基于Linux的操作系统, Oracle数据库后出现无法 图形界面的问题可能是由于以下原因导致的: 1. 错误的显卡驱动: 7默认使用的显卡驱动可能不兼容您的显卡硬件。您可…

    Python 2023年8月4日
    067
  • Java-1213

    抵扣说明: 1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。 Original: https://blo…

    Python 2023年9月30日
    046
  • DataFrame基本操作

    1.建立dataframe (1)Dict to Dataframe df = pd.DataFrame({‘key1’:[‘a’,’a’,’b’,’b’,’a’],’key2′:…

    Python 2023年8月18日
    050
  • bat批处理执行python 的几种方式

    python做成bat 第一种方式:@echo offC:cd C:\Users\administrator\Desktopstart python apidemo.py exit…

    Python 2023年6月16日
    054
  • Python采集招聘数据信息(+详情页)并实现可视化

    Original: https://www.cnblogs.com/Qqun261823976/p/16428865.htmlAuthor: python倩Title: Pytho…

    Python 2023年11月2日
    035
  • 详细聊聊k8s deployment的滚动更新(二)

    一、知识准备 ● 本文详细探索deployment在滚动更新时候的行为● 相关的参数介绍:livenessProbe:存活性探测。判断pod是否已经停止readinessProbe…

    Python 2023年6月10日
    079
  • 安装TensorFlow

    抵扣说明: 1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。 Original: https://blo…

    Python 2023年7月31日
    055
  • 【机器学习项目实战10例目录】项目详解 + 数据集 + 完整源码

    前言 大家好,我是阿光。 本专栏整理了《机器学习项目实战10例》,内包含了各种不同的入门级机器学习项目,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集。 注意:本专…

    Python 2023年10月9日
    043
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球