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

相关内容

热门资讯

苏超赞助太“散装”了:街边卤菜... “比赛还没开始,就有许多人特地来我们店打卡,生意也比之前好了很多。”位于江苏南京的一家卤菜店火了,该...
有鱼生活,如何撬动理性消费一代 当下消费图景中,一股强大的“研究型”消费风潮正席卷年轻群体。他们的决策路径前所未有地清晰:重成分、看...
起拍价2.12亿元,全程无人报... 来源:南国今报 起拍价2.12亿元 全程无人报价 阿里法拍平台显示,该拍卖标的物位于南宁市青秀区新民...
Sora关停后的国产混战,Ha... 本报记者于玉金 北京报道 近日,一款名为HappyHorse-1.0的神秘模型悄然登顶Artific...
原创 金... 2026年4月11日,周大福的柜员看着系统里刚刚刷新出的价格标签,足金首饰的报价从1453元调到了1...
100% 原汁原味,学透真巴菲... 你是不是也有过这样的困惑? 刷了无数巴菲特语录,买了一堆投资书,听了几十节线上课,可一到真金白银投钱...
原创 美... 美国政坛的戏剧性从未停歇,然而,当下这般分裂与荒诞并存的局面,即使在好莱坞的剧本中也显得过于夸张。就...
市场监管总局批准发布一批重要国... 4月10日,中国证券报·中证金牛座记者从市场监管总局获悉,近日,市场监管总局(国家标准委)批准发布一...
原创 金... 金价警报拉响:历史会重演?下月或现2015年式杀跌 你最近有没有去金店逛过?有没有发现那些金光闪闪的...
封测龙头长电科技业绩发布:20... 蓝鲸财经4月10日讯(记者 徐甘甘)388.71亿元营收、270亿元先进封装收入,双双创下历史新高—...
比亚迪客户,复合材料龙头,成功... 【DT新材料】获悉,4月10日,有研金属复合材料(北京)股份公司(以下简称“有研复材”),一家做了三...
2024-2000年上市公司企... 1、资料名称:2024-2000年上市公司企业实体技术绿色创新边界数据 2、测算方式:参考c刊《经济...
康师傅“再来一瓶”多店不兑换!... 文|《BUG》栏目 闫妍 “跑了5家门店,大多在可兑换名单上,没有一家兑换成功的!” 近日,有媒体报...
AI康养深度研究报告 今天分享的是:AI康养深度研究报告 报告共计:82页 这份AI康养深度研究报告显示,全球与中国老龄化...
重磅产教基地落地成都郫都 为区... 封面新闻记者秦怡 4月11日,2026小米新一代智能硬件技术行业产教融合共同体年会在成都市郫都区成都...
“百亿元利润”引爆A股!中信证... 华夏时报记者 王兆寰 北京报道 与此同时,中信证券的强势表现一度助力沪指重返4000点,沪深京市场...
写在第六届消博会举办之际:扬帆... 第六届中国国际消费品博览会会场。人民网记者 毛雷摄 作为“十五五”开局之年我国重大展会的“首展”、海...
“博物馆青铜剑发现拼接痕”,绍... 商泽阳/潮新闻客户端 4月10日,有媒体发文,绍兴一博物馆战国青铜剑被指有多处“拼接痕”,随后官方回...
创业板指创四年多新高 锂电产业... ◎记者 徐蔚 4月10日,A股市场迎来强势反弹,四大指数集体收涨。截至收盘,上证指数报3986.22...
银行“激战”消费贷 【导读】银行“激战”消费贷:布局分化、不良率普涨和中小银行破局之道 中国基金报记者 张玲 二季度刚开...