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

相关内容

热门资讯

原创 黄... 2026年2月19日,国际伦敦现货黄金报价为每盎司4903美元,国内黄金实时价格为每克1084元,白...
纠治“抢票神器”“哄抬价格”等... 来源:央视 记者今天从市场监管总局了解到,春节假期,节日消费、旅游服务等市场火热。为维护春节期间市场...
解锁区块链世界:公有链翻译的知... 在信息技术飞速发展的今天,公有链作为区块链技术的重要分支,正逐渐渗透到金融、供应链、数字身份等多个领...
河南蒙古族自治县必须品尝的小吃... 在广袤的中国大地上,河南蒙古族自治县宛如一颗璀璨的明珠,散发着独特的民族文化魅力。而当地的小吃,更是...
原创 与... 作品声明:内容仅供参考,如有不适及时就医 双相情感障碍是一种长期的精神疾病,其特征是情绪波动剧烈,...
洛阳市孟津区筑牢基层网底 加强... 近日,记者从洛阳市孟津区卫生健康委获悉,孟津区以乡村一体化管理为主线,深化“乡聘村用”改革,强化大学...
原创 黄... 2月18日,国内黄金现货价1104元/克,白银18.9元/克,品牌零售价显著高于水贝批发价,周大福等...
“全款买房”和“贷款30年”,... 大家好,在进入正文之前,给大家做一个推荐。 我的一个设计师好友夏夏,从LXD离职后,经历过设计创业的...
港股马年首秀:智谱暴涨43%市... 大年初四(2月20日),当A股仍在享受春节假期时,港股已率先敲响马年交易的锣声。这匹"金融骏马"的首...
突发! 某大型国有汽车集团原董... 2026年2月,临近60岁法定退休年龄的方红卫终未等来功成身退。 从车间技术员到陕汽控股董事长,方红...
【首都除夕 护卫健康】最暖“年... 春节万家团圆、灯火可亲,而对于北京朝阳医院急诊医学中心的医护人员来说,这个节日往往意味着更重的责任与...
门窗紧闭容易“攒”出一身病,医... 过年了,走亲访友、家人团聚,屋里热热闹闹,门窗也关得严严实实。可待久了,不少人开始觉得头昏脑涨、胸闷...
全年减少6768亿元,3个现象... 开篇先给大家讲个故事,我一个发小在某个二线城市买了一套房,买房那一年正好是2019年,当时这个城市房...
德林控股宣布:德林证券已向合资... 深圳商报·读创客户端记者 李薇 2月20日,德林控股(01709)发布公告,宣布德林证券近日已向合资...
餐饮茶饮集体涨价:不是想涨,是... 最近几年,只要说起餐饮茶饮市场,几乎大家都在说的就是低价策略,这些年在行业内卷的情况下,各家企业都在...
深圳春节“悦己经济”持续升温 深圳商报·读创客户端首席记者 董思 “爱你老己”成为年轻人自我关怀的热梗,以情绪价值为核心的“悦己消...
港股马年开市:AI、机器人概念... 澎湃新闻记者 孙铭蔚 2026年马年首个交易日,港股三大股指低开低走,国产AI大模型、机器人等概念股...
银行理财“收益打榜”?监管出手... 备受关注的银行理财“收益打榜”现象,真的像一些媒体和研报预测的那样,引来监管出手纠偏了。 证券时报·...
原创 春... 2026年春节买金现场直击:国际金价在5000美元高位震荡,国内品牌金饰每克报价1529元到1562...
黄力晨:地缘紧张局势加剧 避险... 昨日周四我们认为,美伊谈判仅取得有限进展,俄乌会谈也无果而终,这导致市场避险情绪再度升温,避险买盘支...