scrapy模拟登陆
admin
2024-04-22 08:35:13
0

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

1.1 requests模块实现模拟登陆

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

1.2 selenium模拟登陆

找到对应的input标签,输入账号和密码后定位到登录的元素位置点击登陆

1.3 scrapy有三种方法模拟登陆

  1. 直接携带cookies
  2. 找url地址,发送post请求存储cookie
  3. 找到对应的form表单,自动解析input标签,自动解析post请求的url地址,自动带上数据,自动发送请求

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

2.1 应用场景

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

2.2 实现:重构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.3 携带cookies登陆github

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): # 通过正则表达式匹配用户名来验证是否登陆成功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.FormRequest发送post请求

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

3.1 scrapy.FormRequest()的使用

通过scrapy.FormRequest能够发送post请求,同时需要添加fromdata参数作为请求体,以及callback

yield scrapy.FormRequest("https://github.com/session",formdata={"authenticity_token":authenticity_token,"utf8":utf8,"commit":commit,"login":"root","password":"llny123"},callback=self.parse_login
)

3.2 使用scrapy.FormRequest()登陆github

3.2.1 思路分析

  1. 找到post的url地址:点击登录按钮进行抓包,然后定位url地址为Sign in to GitHub · GitHub

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

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

3.2.2 代码实现如下:

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":"root","password":"llny123"},callback=self.parse_login)def parse_login(self,response):ret = re.findall(r"noobpythoner|NoobPythoner",response.text)print(ret)

4. scrapy自动提交表单

4.1 scrapy.Formrequest.from_response

它能够自动的从响应中寻找form表单,然后把formdata中的数据提交到action对应的url地址中

yield scrapy.FormRequest.from_response(response, # 传入response对象,自动解析# 可以通过xpath来定位form表单,当前页只有一个form表单时,将会自动定位formxpath='//*[@id="login"]/form',  formdata={'login': 'root', 'password': 'llny123'},callback=self.parse_login
)

4.2 使用scrapy.Formrequest.from_response登陆github

import scrapy
import reclass Login3Spider(scrapy.Spider):name = 'login3'allowed_domains = ['github.com']start_urls = ['https://github.com/login']def parse(self, response):yield scrapy.FormRequest.from_response(response, # 传入response对象,自动解析# 可以通过xpath来定位form表单,当前页只有一个form表单时,将会自动定位formxpath='//*[@id="login"]/form', formdata={'login': 'root', 'password': 'llny123'},callback=self.parse_login)def parse_login(self,response):ret = re.findall(r"noobpythoner|NoobPythoner", response.text)print(ret)

5. 小技巧

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

总结

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

相关内容

热门资讯

阿里等三巨头抢朴朴超市?电商要... 作者|白婉嘉 编辑|文定 一场竞购传闻,把朴朴超市推到了台前。 5月25日,多家媒体报道称,阿里、美...
宁波土耳其购房移民机构怎么选? 宁波地区有土耳其购房移民需求的客户群体主要集中在企业主、金融从业者、跨境电商经营者和专业人士等,其核...
芯跳加速时这一红利ETF却半个... 5月28日,芯片半导体和红利方向同步走强,杠杆资金上演哑铃投资新范式。截至10:27,中证红利ETF...
强强携手共谋发展——京东电商平... 5月20日,京东电商平台相关负责人莅临菏泽华运食品公司,开展实地考察与合作洽谈。菏泽华运食品公司总经...
千问正在“夺舍”阿里云 文|象先志 5月26日,阿里云在新加坡面向海外市场发布全新AI产品官网Qwen Cloud、Age...
原创 5... 5月27日黄金价格小幅回落,国内基础金价和中国黄金基础金价均为994.0元/克,黄金回收价为977元...
中汇人寿潍坊中心支公司被罚15... 蓝鲸新闻5月28日讯,近日,国家金融监督管理总局潍坊监管分局公布行政处罚决定书,对中汇人寿保险股份有...
天源迪科:董事长陈友解除留置 天源迪科午间公告,今日,公司收到江西省景德镇乐平市监察委员会签发的《解除留置通知书》,已对公司董事长...
胡衡华,辞去重庆市长职务 5月28日,重庆市人民代表大会常务委员会发布关于接受胡衡华辞职的决定: 据《中华人民共和国地方各级人...
社媒帖子点燃欧洲半导体妖股 晶... 财联社5月28日讯(编辑 赵昊)周三(5月27日),一个鲜为人知的欧洲芯片制造商股价一度暴涨逾70%...
原创 A... 今日A股三大指数集体下跌,截至收盘,上证指数跌1.25%,深证成指跌0.88%,创业板指涨0.07%...
大盘下跌白酒板块又涨了!行业仍... 大盘下跌的时候,白酒板块又“如无意外”地成为资金关注的目标。 5月27日A股跌破4100点时,白酒板...
消费基金重仓科技 合规还是越界... 记者 洪小棠 截至2026年5月27日,A股市场的结构性行情正在以一种近乎撕裂的方式演绎。一边是近年...
人工智能板块延续调整,人工智能... 5月27日,人工智能板块延续调整,截至收盘,中证人工智能主题指数下跌1.8%,中证科创创业人工智能指...
原创 长... 国内存储芯片龙头长鑫科技在5月27日顺利通过科创板上市委审议,距离正式挂牌交易仅剩最后一步。这不仅仅...
南京跑出“数字人第一股”! 8... 「IPO全观察」栏目聚焦首次公开募股公司,报道企业家创业经历与成功故事,剖析公司商业模式和经营业绩,...
“飞轮”之上:财通资管是这样炼... 2001年,知名管理学者吉姆·柯林斯出版了著作《飞轮效应》。这部书描绘了一个常见的商业现象: 在同样...
嘉戎技术收购,宁德时代背书 见习记者刘墨 值得关注的是,宁德时代深度参与本次交易,不仅通过旗下产业基金参与并购主体,宁德时代实控...