在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.mzph.cn/news/234605.shtml

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

相关文章

Azure Machine Learning - 提示工程高级技术

本指南将指导你提示设计和提示工程方面的一些高级技术。 关注TechLead,分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师&#xff0c…

Python MySQL数据库连接实现增删改查

一、应用场景 python项目连接MySQL数据库时,需要第三方库的支持。这篇文章使用的是PyMySQL库,适用于python3.x。 二、安装 pip install PyMySQL三、使用方法 1.导入模块 import pymysql2.连接数据库 db pymysql.connect(hostlocalhost,usercode_s…

【Linux 驱动】Linux设备树(四)—— 设备树驱动LED

有了设备树以后,我们可以将寄存器信息保存到设备树,即便是更换了一个设备,我们也无需修改驱动文件,只需要修改设备树文件并重新编译。 下面介绍两种通过设备树驱动 LED 的最简单的方式,这两种方式的主要是设备树中 re…

什么是触控芯片?触控芯片有哪些?

一、什么是触控芯片? 触控芯片是一种用于感知人机交互行为的电子元器件,通过感应人体肌肉、电容电场和压力等多种信号,实现触摸屏幕、手势操作、手写输入等功能。二、触控芯片的工作原理 触控芯片的工作原理基于电容原理,当人体肌…

一文读懂PMP项目管理

PMP项目管理是什么 PMP(Project Management Professional)指项目管理专业人员资格认证,由美国项目管理协会(Project Management Institute,简称PMI)发起,目前已在全球206个国家和地区进行认证&…

小黑南京归来,参加部里的公务员培训,有点儿社死认识了好多小伙伴的leetcode之旅13. 罗马数字转整数

小黑代码 class Solution:def romanToInt(self, s: str) -> int:chars [M, CM, D, CD, C, XC, L, XL, X, IX, V, IV,I]nums [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1]map_ dict((k, v) for k,v in zip(chars, nums))# 字符串长度n len(s)# 结果变量res …

Java集合转int数组

集合通过toArray()方法进行转换为数组&#xff0c;可以转换成为指定类型的数组&#xff0c; 【但是】这些类型都必须是object类型的子类&#xff0c;基本类型不可以。 可以通过stream流处理&#xff1a; Set<Integer> set new HashSet<>(); int[] result interSet…

Swagger2解放双手的API开发文档生成

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《MyBatis-Plus》。&#x1f3af;&#x1f3af; &am…

NFS原理详解

一、NFS介绍 1&#xff09;什么是NFS 它的主要功能是通过网络让不同的机器系统之间可以彼此共享文件和目录。 NFS服务器可以允许NFS客户端将远端NFS服务器端的共享目录挂载到本地的NFS客户端中。 在本地的NFS客户端的机器看来&#xff0c;NFS服务器端共享的目录就好像自己的磁…

Tomcat为什么要重写类加载器?

文章目录 一、双亲委派机制二、分析1、Tomcat需要隔离性2、Tomcat需要热替换3、打破双亲委派机制 三、Tomcat类加载器1、拓展类加载器2、工作原理 四、总结 一、双亲委派机制 首先了解下双亲委派机制&#xff0c;大致过程如下&#xff1a; 简单来说&#xff0c;就是加载class…

ansible(不能交互)

1、定义 基于python开发的一个配置管理和应用部署工具&#xff0c;在自动化运维中异军突起&#xff0c;类似于xshell一键输入的工具&#xff0c;不需要每次都切换主机进行操作&#xff0c;只要有一台ansible的固定主机&#xff0c;就可以实现所有节点的操作。不需要agent客户端…

位操作符详解(C语言)

前言 C语言中的位操作符是用来对数据的二进制表示进行位级操作的运算符。这些操作符包括位与&#xff08;&&#xff09;、位或&#xff08;|&#xff09;、位异或&#xff08;^&#xff09;、位取反&#xff08;~&#xff09;&#xff0c;这些位操作符可以用来进行各种位级…

【汇编先导】-- 2

汇编先导 6. 寄存器 存储数据&#xff1a;CPU > 内存 > 硬盘(固态、机械) CPU还可分为&#xff1a; 32位CPU 8 16 32 64位CPU 8 16 32 64(增加了寻址能力) 通用寄存器 # 32位的通用寄存器只有8个 # 可以在任意软件的底层看到 # 通用寄存器可以存储任何值存值的范围…

Cesium 实战 - OD 通信线 - 移动连接线

Cesium 实战 - OD 通信线 - 移动连接线 OD 通信线 - 移动连接线核心代码完整代码在线示例 在项目中&#xff0c;实现完卫星通信线之后&#xff0c;又有一个新需求&#xff0c;需要通信线根据火箭移动而移动&#xff0c;相当于追踪效果&#xff0c;思考之后通过 Entity Callback…

【Python可视化系列】一文教会你绘制美观的直方图(理论+源码)

一、引言 前面我详细介绍了如何绘制漂亮的折线图和柱状图&#xff1a; 【Python可视化系列】一文彻底教会你绘制美观的折线图&#xff08;理论源码&#xff09; 【Python可视化系列】一文教会你绘制美观的柱状图&#xff08;理论源码&#xff09; 对于一个连续性的变量&#xf…

中国社科院与新加坡新跃社科联合培养工商管理博士

全球经济正在经历由科技进步与创新、政治和人口的剧烈变化所带来的巨大不确定性与挑战。企业的领导者和管理者需要发展出战略性思维和全球洞察力以便面对越来越大的经济波动。中国社科院与新加坡新跃社科联合培养工商管理博士项目的训练能够让学生在一个企业和组织的改变和发展…

B039-SpringMVC基础

目录 SpringMVC简介复习servletSpringMVC入门导包配置前端控制器编写处理器实现Contoller接口普通类加注解(常用) 路径问题获取参数的方式过滤器简介自定义过滤器配置框架提供的过滤器 springMVC向页面传值的三种方式视图解析器springMVC的转发和重定向 SpringMVC简介 1.Sprin…

澳鹏干货解答!“关于机器学习的十大常见问题”

探索机器学习的常见问题&#xff0c;了解机器学习和人工智能的基本概念、原理、发展趋势、用途、方法和所需的数据要求从而发掘潜在的商机。 什么是机器学习&#xff1f; 机器学习即教授机器如何学习的过程&#xff0c;为机器提供指导&#xff0c;帮助它们自己开发逻辑&#…

SpringBoot-XXLJOB提供动态API调度任务

目录 一、项目版本 二、XXL-JOB提供动态API controller层 service层 三、SpringBoot项目 pom model XxlJobUtil-工具类 XXL-JOB是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线&…

智能监测/检测系统/摄像头监控系统EasyCVR大华云台控制问题的解决方法

GB28181视频集中存储/云存储/视频监控管理平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;实现视频资源的鉴权管理、按需调阅、全网分发、智能分析等。AI智能大数据视频分析EasyCVR平台已经广泛应用在工地、工厂、园…