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

相关内容

热门资讯

21评论丨全球美债抛售潮会怎样... 来源:21世纪经济报道 肖宇(中国社会科学院亚太与全球战略研究院副研究员) 据新华社消息,美国财政部...
GB/T 6394 金属平均晶... 导读:GB/T 6394-2017 是国内金属晶粒度检验核心标准,本文按标准条款拆解比较法、面积法、...
习近平和彭丽媛同埃及总统塞西夫... 当地时间9月2日下午,国家主席习近平和夫人彭丽媛在埃及总统塞西和夫人依缇萨尔陪同下参观大埃及博物馆。...
ESG创新年会(2026)将于... 央广网北京9月2日消息(记者 王进文)9月2日,记者从ESG创新年会(2026)暨第二届ESG博览会...
原创 全... 最近全球金融市场确实被一波剧烈的震荡搅得不安宁。美、日、英等主要经济体的主权债券遭遇大规模抛售,收益...
植发成活率受什么影响?医生和患... 免责声明:本文仅为医美行业科普参考,不构成任何诊疗方案与消费引导。手术类操作存在个体差异与相应风险,...
和讯信息刘伟奇:A股缩量242... 9月2日,和讯信息刘伟奇表示,周三的交易已经收盘,今天盘面走出了调整走势,但实际调整的力度并不算大,...
原创 国... 9月2日,国泰君安国际披露依据香港《公司收购及合并守则》规则22下发的证券交易披露文件,内容关联公司...
美股开盘:股指、黄金、白银集体... 北京时间9月2日晚间,道指涨0.36%,标普500指数涨0.06%,纳指跌0.05%。截至发稿,三大...
希荻微控股子公司Zinitix... 希荻微(688173)9月2日晚公告,公司近日收到控股子公司Zinitix的通知,依据韩国交易所《科...
再见库克,再见印钞机! 9月1日,苹果完成又一次换帅,库克离任CEO,而上一次换帅是15年前。 新上任的CEO叫约翰·特努斯...
估值1000亿的戒指,要去IP... 一枚戒指要去纳斯达克募30亿美元。 近日,彭博社报道:芬兰智能戒指公司Oura连同部分现有股东,计划...
不要囤积快递纸箱!这些风险请注... 【来源:中国市场监管报】 网络上,“建议不要把快递带回家里拆”相关话题一直备受关注,引发网友热议。 ...
交控科技:推动低空业务逐步实现... 交控科技:推动低空业务逐步实现规模化落地和业绩兑现 人民财讯9月2日电,在9月2日的业绩会上,对于轨...
甲状腺不能吃海鲜、不能吃碘?别... 几乎所有甲状腺患者,都有同一个终极纠结:到底能不能吃碘?能不能吃海鲜?要不要换成无碘盐? 网上说法五...
富士产量三年暴增97%,尼康第... 富士产量增长97%,尼康仍守住无反市场第三 据相关统计,富士过去三年的无反相机产量增长了97%,增速...
董事长道歉难平百名应届生遭逼退... 图片来源:视觉中国 蓝鲸新闻9月2日讯(记者 梁冀)9月2日,深陷舆论漩涡的星宇股份(601799....
2026年1-7月债务融资工具... 来源:21世纪经济报道 来源:中国银行间市场交易商协会 表1:中长期承销情况统计 表2:服务企业...
代工赚薄利,风险工厂背,优思益... 本报(chinatimes.net.cn)记者王瑜 于娜 北京报道 作为国内营养保健食品CDMO龙头...
原创 智... 雷达财经出品 文|周慧 编|孟帅 以后买Token,可以去电商平台了! 9月2日,国产大模型厂商智谱...