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

相关内容

热门资讯

银行板块早盘逆势活跃,银行ET... 7月13日早盘,市场震荡调整,银行板块逆势活跃。截至午间收盘,中证银行指数上涨1.5%,香港证券指数...
2026常州展厅设计公司深度分... 企业展厅在中期追加预算,并不是少数项目的偶发现象,而是很多企业在启动阶段就埋下的结果。尤其在常州这类...
测试市场极限!美国6家超大型A... 随着科技股、人工智能(AI)股近期调整,美股科技巨头发行的巨额规模债券近期也遭遇抛售压力。 今年,六...
2026年美团商家费用全面拆解... “上美团做个店,光开户和推广一年就要烧掉辆车?”这是2026年不少本地商家在数字化浪潮前最大的焦虑。...
金价、油价突发! 7月13日早盘, 国际油价大幅高开,截至北京时间6:22,布伦特原油涨3.55%, 报78.71美元...
英伟达CEO黄仁勋称AI智能体... 【CNMO科技消息】据CNMO科技了解,英伟达CEO黄仁勋近日在一场专访中谈及智能体与人的区别时表示...
李小冉徐佳宁被曝离婚 两人于2... 搜狐娱乐讯 7月13日,有八卦媒体发文爆料称李小冉和徐佳宁在前两年就已分居,并已于去年11月在北京办...
静待“七巨头”财报表现,纳指1... 文丨斯嘉特 David Scutt 编辑丨吴海珊 最近3个多月以来,纳斯达克100指数从3月下旬触及...
这3种早餐正在给血管“添堵”,... 现代保健报讯:“周大夫,我去年刚放了一个支架,这才一年,怎么又胸闷了?” 兰州慧源堂中医诊所里,60...
原创 2... 上周五,现货黄金小幅下行,随后在4100关口附近来回震荡,最终收跌0.11%,报4119.27美元。...
36氪首发 | 港中大博士、前... 作者 | 乔钰杰 编辑 | 袁斯来 硬氪获悉,深圳光之跃迁科技有限公司(Lumisition Rob...
期货交易中哪些因素导致成交量和... 在期货交易里,成交量和持仓量的变化是投资者极为关注的重要指标,它们能够反映市场的活跃度与投资者的参与...
重磅合资|双强联手,凯伦防火涂... 伴随国内基建升级、绿色建筑普及以及建筑消防安全规范化发展,高性能、环保型特种建材已然成为行业刚需。 ...
《扩大消费“十五五”规划》:扩... 国务院批复同意《扩大消费“十五五”规划》。《规划》提出,发展数字消费。促进数字消费高质量发展,深入推...
A股点燃PCB投资热,慧联电子... 随着PCB需求爆发,A股市场上相关并购、资产重组涌现。近日,新锐股份宣布拟以8亿元收购慧联电子80%...
基金忠言|新锐量化直线跳水,暴... 图片来源:视觉中国 蓝鲸新闻7月13日讯(记者 祁和忠)5月中旬以来,平安新锐量化突然直线跳水,单位...
原创 如... 作为知名经济学家,尤其是在金融市场流量很大的经济人物,其本身要做到完全独立其实难度不小,一旦其价值增...
服务出海提速意味着什么 商务部数据显示,今年1月份至5月份,知识密集型服务出口6677.5亿元,增长12.2%,其中,知识产...
期货交易中怎样在期货交易中平衡... 在期货交易里,合理地处理持仓与资金的关系是关乎交易成败的关键因素。期货市场具有高风险性和高杠杆性,若...
两市遭遇“黑色星期一”,红利飘... 7月13日两市遭遇“黑色星期一”,科技板块等全线重挫,三大指数低开低走。银行、煤炭等红利资产逆市坚挺...