scrapy模拟登陆

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

1. 回顾之前的模拟登陆的方法

1.1 requests模块是如何实现模拟登陆的?

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

1.2 selenium是如何模拟登陆的?

  1. 找到对应的input标签,输入文本点击登陆

1.3 scrapy的模拟登陆

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

2. scrapy携带cookies直接获取需要登陆后的页面

应用场景
  1. cookie过期时间很长,常见于一些不规范的网站
  2. 能在cookie过期之前把所有的数据拿到
  3. 配合其他程序使用,比如其使用selenium把登陆之后的cookie获取到保存到本地,scrapy发送请求之前先读取本地cookie

2.1 实现:重构scrapy的starte_rquests方法

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

# 这是源代码
def start_requests(self):cls = self.__class__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 (see %s.%s)." % (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)

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

2.2 携带cookies登陆github

测试账号 noobpythoner zhoudawei123

  • myCode
import scrapy
# 失败!!!!!!!!!!!!class Git1Spider(scrapy.Spider):name = 'git1'allowed_domains = ['github.com']start_urls = ['https://github.com/zep03']# 重写start_request()方法def start_request(self):url = self.start_urls[0]temp = '_octo=GH1.1.838083519.1594559947; _ga=GA1.2.1339438892.1594559990; _gat=1; tz=Asia%2FShanghai; _device_id=4d76e456d7a0c1e69849de2655198d40; has_recent_activity=1; user_session=e6aK8ODfFzCDBmDG72FxcGE17CQ3FiL23o; __Host-user_session_same_site=e6aK8ODfFzCDBmDTZMReW2g3PhRJEG72FxcGE17CQ3FiL23o; logged_in=yes; dotc'# split()将字符串按照;号进行切割,装进一个列表中# 通过字典生成式把cookie字符串转换成一个字典cookies = {data.split('=')[0]:data.split('=')[-1]  for data in temp.split(';')}print(cookies)# headers = {#     'Referer': 'https://github.com/login?return_to=%2Fzep03',#     # 'Host': 'github.com'#     'If-None-Match':'W/"f3d499ffda61143f54d8e48cb050e43d"'# }yield scrapy.Request(url = url,callback=self.parse,cookies=cookies# headers=headers)def parse(self, response):print(response.xpath('/html/head/title/text()').extract_first())
import scrapy
import reclass Login1Spider(scrapy.Spider):name = 'login1'allowed_domains = ['github.com']start_urls = ['https://github.com/NoobPythoner'] # 这是一个需要登陆以后才能访问的页面def start_requests(self): # 重构start_requests方法# 这个cookies_str是抓包获取的cookies_str = '...' # 抓包获取# 将cookies_str转换为cookies_dictcookies_dict = {i.split('=')[0]:i.split('=')[1] for i in cookies_str.split('; ')}yield scrapy.Request(self.start_urls[0],callback=self.parse,cookies=cookies_dict)def parse(self, response): # 通过正则表达式匹配用户名来验证是否登陆成功# 正则匹配的是github的用户名result_list = re.findall(r'noobpythoner|NoobPythoner', response.body.decode()) print(result_list)pass
注意:
  1. scrapy中cookie不能够放在headers中,在构造请求的时候有专门的cookies参数,能够接受字典形式的coookie
  2. 在setting中设置ROBOTS协议、USER_AGENT

3. scrapy.Request发送post请求

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

3.1 发送post请求

注意:scrapy.FormRequest()能够发送表单和ajax请求,参考阅读 https://www.jb51.net/article/146769.htm

3.1.1 思路分析
  1. 找到post的url地址:点击登录按钮进行抓包,然后定位url地址为https://github.com/session

  2. 找到请求体的规律:分析post请求的请求体,其中包含的参数均在前一次的响应中

  3. 否登录成功:通过请求个人主页,观察是否包含用户名

3.1.2 代码实现如下:
  • myCode
import scrapyclass Git2Spider(scrapy.Spider):name = 'git2'allowed_domains = ['github.com']start_urls = ['http://github.com/login']def parse(self, response):# 从登录页面响应中解析出post数据# 正则提取token = response.xpath('//input[@name="authenticity_token"]/@value').extract_first()# print(token)timestamp_secret = response.xpath('//input[@name="timestamp_secret"]/@value').extract_first()# print(timestamp_secret)timestamp = response.xpath('//input[@name="timestamp"]/@value').extract_first()# print(timestamp)required_field_name = response.xpath('//*[@id="login"]/form/div[4]/input[6]/@name').extract_first()# print(required_field_name)post_data = {"commit": "Sign in","authenticity_token": token,"ga_id": "1029919665.1594130837","login": "账号","password": "密码","webauthn-support": "supported","webauthn-iuvpaa-support": "unsupported","return_to": "",required_field_name: "","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/zep03',callback=self.check_login)def check_login(self,response):print(response.xpath('/html/head/title/text()').extract_first())
import scrapy
import reclass Login2Spider(scrapy.Spider):name = 'login2'allowed_domains = ['github.com']start_urls = ['https://github.com/login']def parse(self, response):authenticity_token = response.xpath("//input[@name='authenticity_token']/@value").extract_first()utf8 = response.xpath("//input[@name='utf8']/@value").extract_first()commit = response.xpath("//input[@name='commit']/@value").extract_first()#构造POST请求,传递给引擎yield scrapy.FormRequest("https://github.com/session",formdata={"authenticity_token":authenticity_token,"utf8":utf8,"commit":commit,"login":"noobpythoner","password":"***"},callback=self.parse_login)def parse_login(self,response):ret = re.findall(r"noobpythoner|NoobPythoner",response.text)print(ret)
小技巧

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


小结

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

三、scrapy爬虫框架——scrapy模拟登陆相关推荐

  1. python3 scrapy爬虫_Python3 Scrapy爬虫框架(Scrapy/scrapy-redis)

    Python3 Scrapy爬虫框架(Scrapy/scrapy-redis) 本文由 Luzhuo 编写,转发请保留该信息. 原文: https://blog..net/Rozol/article/ ...

  2. scrapy爬虫框架[scrapy.core.scraper]ERROR downloading Error processing

    [scrapy爬虫框架ERROR downloading error processing] [scrapy.core.scraper] ERROR: Spider error processing ...

  3. 二、scrapy爬虫框架——scrapy构造并发送请求

    scrapy数据建模与请求 学习目标: 应用 在scrapy项目中进行建模 应用 构造Request对象,并发送请求 应用 利用meta参数在不同的解析函数中传递数据 1. 数据建模 通常在做项目的过 ...

  4. 四、scrapy爬虫框架——scrapy管道的使用

    scrapy管道的使用 学习目标: 掌握 scrapy管道(pipelines.py)的使用 之前我们在scrapy入门使用一节中学习了管道的基本使用,接下来我们深入的学习scrapy管道的使用 1. ...

  5. scrapy爬虫框架及运行流程

    文章目录 1 scrapy 简介 1.1 什么是爬虫? 1.2 浏览网页的过程中发生了什么? 1.3 scrapy爬虫框架 1.4 scrapy爬虫框架优势 2 scrapy 构架图 3 Scrapy ...

  6. 第五章 Scrapy爬虫框架(5.1 Scrapy框架基础)

    Scrapy是一个高级Web爬虫框架,用于爬取网站并从页面中提取结构化数据.它可以用于数据挖掘.数据监控和自动化测试等多个方面.与之前讲过的Requests库和Selenium库不同,Scrapy更适 ...

  7. python学习(三)scrapy爬虫框架(二)——创建一个scrapy爬虫

    在创建新的scrapy爬虫之前,我们需要先了解一下创建一个scrapy爬虫的基本步骤 第一步:确定要爬取的数据 以爬取豆瓣电影数据为例: 每部电影所要爬取的信息有: 片名:<头号玩家> 导 ...

  8. Python Scrapy 爬虫框架爬取推特信息及数据持久化!整理了我三天!

    最近要做一个国内外新冠疫情的热点信息的收集系统,所以,需要爬取推特上的一些数据,然后做数据分类及情绪分析.作为一名合格的程序员,我们要有「拿来主义精神」,借助别人的轮子来实现自己的项目,而不是从头搭建 ...

  9. Scrapy爬虫框架(实战篇)【Scrapy框架对接Splash抓取javaScript动态渲染页面】

    (1).前言 动态页面:HTML文档中的部分是由客户端运行JS脚本生成的,即服务器生成部分HTML文档内容,其余的再由客户端生成 静态页面:整个HTML文档是在服务器端生成的,即服务器生成好了,再发送 ...

最新文章

  1. 洛谷 - P4197 Peaks(Kruskal重构树+dfs序+主席树)
  2. 二叉线索树的线索化以及遍历
  3. Unix环境高级编程(十五)高级I/O
  4. Javascript设计网页中的下拉菜单
  5. 更靠谱的横竖屏检测方法
  6. js复制json对象
  7. Lua脚本语言——Lua脚本基础语法
  8. HTML5详细介绍及使用
  9. 毕业设计 : 基于Spark的海量新闻文本聚类 - Spark 新闻分类 文本分类新闻聚类
  10. 软件开发:API和SDK的区别与联系
  11. 中衍期货开户|资深老师盘中交流
  12. 去除bootstrap的table样式中单元格边框线
  13. Qt5.9自定义按钮实例(上图片下文字,图片文字间距任意可调)
  14. 【管理经济学】(2)—机会成本、会计成本
  15. ubuntu16.04 python版本切换以及pip工具基本知识点总结
  16. 动网论坛dvbbs7.1.0 SP1由Access版升级到SQL版的具体说明(用于全新安装)
  17. 小程序画布之CanvasContext
  18. Missing required prop: “value” 报错的解决办法
  19. 多项式求和(中国海洋大学第三届“朗讯杯”编程比赛高级组试题)
  20. 京东版“拼多多”也要来了

热门文章

  1. 电脑老是弹出vrvedp_m_出现三个可疑进程vrvedp_m.exe vrvrf_c.exe vrvsafec.exe
  2. Python基础总结之常用内置方法总结
  3. 融云通讯服务器,vue使用融云即时通讯,老是报了发送失败,服务器超时
  4. c++ sleep函数_Linux 多线程应用中如何编写安全的信号处理函数
  5. 手机触摸屏的分类和原理,供大家选择手机时用
  6. linux 双mipi摄像头,VS-RK3399 在linux系统下面调试Mipi camera接口介绍
  7. tableau 倒序都倒了_Tableau优秀作品拆解复刻01-是时候终结瘘管病了
  8. sort和qsort函数
  9. 比较list集合相等的方法
  10. C# WebBrower1控件提示“该文档已被修改,是否保存修改结果”解决方法 .