在scrapy 使用selenium模拟登录获取cookie

前言

最近有一点点爬虫需求,想总结一下scrapy框架的一些基本使用方法,加深印象,自己一直习惯使用一些脚本文件运行爬虫,面对数据量非常大,稳定性要求比较高的,效率需求比较高的情况下还是用scrapy较为合适,scrapy是一个异步的框架,所有的请求都是阻塞的,虽然在单文件脚本中也可以实现,但是代码就非常的难看,难以维护,过了几天就会忘记复杂的流程,调试起来就非常的困难,scrapy我自己用得也不多,但是觉得它非常地优秀,有成熟的中间件支持,方便的下载器,稳定性效率非常地高,但是其中的运行流程也稍微有些复杂,难以理解,异步框架处理BUG调试非常的麻烦。

初始化scrapy

首选需要安装scrapy 和selenium框架。

pip install scrapypip install selenium

  初始化框架

scrapy startproject testSpider

依据参考接着进入文件夹,新建爬虫文件。

cd testSpiderscrapy genspider myspider example.com

看看目录

selenium基本使用

selenium前言

今天只讲selenium的基本使用,scrapy框架的流程后面再总结,为什么要在在scrapy中使用selenium,因为有些目标站点的接口是通过分析非常难以复现的,通常会有一些混淆参数导致出现请求遇到拦截的情况,也就是碰到反爬虫措施了,需要分析Javascript代码,分析其中参数的意思,这种过程非常的复杂,工程量非常大,这也是目前高级爬虫的必备知识,需要一些Javascript逆向知识,例如行业中有非常著名的瑞数信息做了翻盘是属于顶尖的存在,专门在一些金融,政府网站上使用这种Javascript代码混淆技术,自己也是稍微了解了一点点。

通过selenium可以绕过一些关键的有反扒的接口,得到一些重要的信息。通常的情况就是使用selenium模拟有反爬措施的登录接口从而得到登录后cookie,然后登陆过后的接口就没有反爬措施。

下载驱动

使用selenium就需要配套的浏览器驱动。我配套的浏览器就是chrome,我自己的浏览器版本。

下载的版本:

然后我把浏览器驱动放在浏览器的目录,然后配置了环境变量:

关键代码

testSpider/spider/myspider.py就是关键代码,目前的代码如下:

  import scrapyclass MyspiderSpider(scrapy.Spider):name = 'myspider'allowed_domains = ['example.com']start_urls = ['http://example.com/']def parse(self, response):pass

根据文章标题的需求我只需要使用在以上的文件进行编码就行了,加入要使用到其他的接口爬取方法就要去更改testSpider/setting.py里面的设置,如果感兴趣可以参考我之前的文章:使用Scrapy框架爬取V2ex看看程序员中秋节都在讨论啥

直接亮代码,拿七牛云的登录试了一下,因为感觉他比较简单,步骤较少,适合做教程分享,详细情况在注释中讲解:

  import scrapyfrom selenium.webdriver.chrome.options import Optionsfrom selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.wait import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECclass MyspiderSpider(scrapy.Spider):name = 'myspider'allowed_domains = ['portal.qiniu.com'] # 注意设置好允许爬取的网址列表,这里踩了坑,试了半天发现框架默认的解析器一直没有调用,要写网址的整合域名而不是单单一级域名。start_urls = ['http://example.com/']user_name = '********@**.com'password = '********'chorme_options = Options()chorme_options.add_argument("--disable-gpu")driver = webdriver.Chrome(options=chorme_options)  # 初始化Chrome驱动driver.implicitly_wait(20)headers = {'authority': 'portal.qiniu.com','accept': '*/*','accept-language': 'zh-CN,zh;q=0.9','cache-control': 'no-cache','referer': 'https://portal.qiniu.com/certificate/ssl','sec-ch-ua': '".Not/A)Brand";v="99", "Google Chrome";v="103", "Chromium";v="103"','sec-ch-ua-mobile': '?0','sec-ch-ua-platform': '"Windows"','sec-fetch-dest': 'empty','sec-fetch-mode': 'cors','sec-fetch-site': 'same-origin','user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.134 Safari/537.36',}  # headercookie = {}def __del__(self):self.driver.close()def parse(self, response, *args, **kwargs):print('默认的解析器方法,接口请求内容:')print(response.json())def start_requests(self):self.driver.get(url='https://sso.qiniu.com/')  # 直接访问登录页user_input = self.driver.find_element(By.ID, 'email')  # 获取用户名输入框user_input.send_keys(self.user_name)  # 输入用户名password_input = self.driver.find_element(By.ID, 'password')  # 获取密码框password_input.send_keys(self.password)  # 输入密码self.driver.find_element(By.ID, 'login-button').click()  # 登录try:WebDriverWait(self.driver, 60).until(EC.visibility_of_element_located((By.CLASS_NAME, "user-plane-entry")))  # 等待网页跳转,超时等待60秒except:print('登陆超时,失败')  # 等待超过了60self.driver.quit()self.cookie = self.driver.get_cookies()  # 获取cookie 此时是键值对print(self.cookie)print(self.headers)yield scrapy.Request(url='https://portal.qiniu.com/api/gaea/billboard/list?status=1', callback=self.parse,cookies=self.cookie,headers=self.headers)  # 迭代器 放入异步任务中请求

 从日志看看效果:

已经正确打印了接口返回的内容,假如直接请求接口会报错: 

总结

在scrapy 中使用selenium是一个非常常见的情况,今天只稍微做一下简单的总结,以后碰到的难点会一一记下来分享出来,敬请期待。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/288689.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Seata:打造行业首个分布式事务产品

作者:季敏,阿里云分布式事务产品负责人、Seata 开源项目创始人 微服务架构下数据一致性的挑战 微服务开发的痛点 在 2019 年,我们基于 Dubbo Ecosystem Meetup,收集了 2000 多份关于“在微服务架构,哪些核心问题是开…

【C++】开源:ImGui图形用户界面库配置与使用

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍ImGui图形用户界面库配置与使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下&…

13 v-show指令

概述 v-show用于实现组件的显示和隐藏,和v-if单独使用的时候有点类似。不同的是,v-if会直接移除dom元素,而v-show只是让dom元素隐藏,而不会移除。 在实际开发中,v-show也经常被用到,需要重点掌握。 基本…

TypeScript【泛型1、泛型2、声明合并、命名空间 、模块1、模块2、声明文件简介】(五)-全面详解(学习总结---从入门到深化)

文章目录 泛型1 泛型2 声明合并 命名空间 模块1 模块2 声明文件简介 泛型1 泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性 首先,我们来实现一个函数…

nuxt学习笔记

主要看的课程1 课程1 课程2 上手简化版 初始化 1.创建项目 使用官方推荐的npx来安装: (npm的5.2.x版本后默认安装了npx) 首先,确保您已经安装了 yarn、npx(默认包含在 npm v5.2 中)或 npm (v6.1)。 使用 npx 进行搭建项目&…

stm32学习总结:4、Proteus8+STM32CubeMX+MDK仿真串口收发

stm32学习总结:4、Proteus8STM32CubeMXMDK仿真串口收发 文章目录 stm32学习总结:4、Proteus8STM32CubeMXMDK仿真串口收发一、前言二、资料收集三、STM32CubeMX配置串口1、配置开启USART12、设置usart中断优先级3、配置外设独立生成.c和.h 四、MDK串口收发…

Ubuntu 常用命令之 unzip 命令用法介绍

unzip命令在Ubuntu系统中用于解压缩.zip文件。它可以解压缩一个或多个.zip文件,并将文件解压缩到当前目录或指定的目录。 unzip命令的一般格式 unzip [选项] zipfile [file...]其中,zipfile是要解压的.zip文件,file是.zip文件中的特定文件。…

关键字:void关键字

在编程中,void 是一个关键字,用于表示函数没有返回值。具体来说,void 关键字的作用如下: 函数声明:在函数声明中使用 void 关键字可以指定函数没有返回值。例如: 这表示 func() 函数不返回任何值。 函数…

flutter自定义地图Marker完美展示图片

世人都说雪景美 寒风冻脚无人疼 只道是一身正气 结论 参考Flutter集成高德地图并添加自定义Maker先实现自定义Marker。如果自定义Marker中用到了图片,那么会碰到图片没有被绘制到Marker的问题,此时需要通过precacheImage来预加载图片,从而解…

2023/12/20 work

1. 使用select完成TCP客户端程序 2. 使用poll完成TCP并发服务器 3. 思维导图

关于python和java的比较 去掉图片背景

最近要实现一个图片去背景的功能 找了removeBg的API https://www.remove.bg/ 需要注册获取该功能的API-key 【免费的额度有限】 对比发现改工具提供了诸多语言的支持 对比发现python确实较为方便 1、VScode-下载python plugin 2、pip install request 需要的包 3、执行…