• 售前

  • 售后

热门帖子
入门百科

Scrapy实现模拟登录的示例代码

[复制链接]
123457595 显示全部楼层 发表于 2021-10-25 19:35:13 |阅读模式 打印 上一主题 下一主题
为什么要模仿登录

有些网站是必要登录之后才能访问的,即便是同一个网站,在用户登录前后页面所展示的内容也大概会大不雷同,比方,未登录时访问Github首页将会是以下的注册页面:

然而,登录后访问Github首页将包罗如下页面内容:

如果我们要爬取的是一些必要登录之后才能访问的页面数据就必要模仿登录了。通常我们都是使用的 Cookies 来实现模仿登录,在Scrapy中,模仿登陆网站一般有如下两种实现方式:
           (1) 请求时携带Cookies
           (2) 发送Post请求获取Cookies
请求时携带Cookies

对于一些Cookies逾期时间很长的不规范网站,如果我们能够在Cookies逾期之前爬取到全部我们想要的数据,可以思量在请求时直接将Cookies信息带上来模仿用户登录。
以下是模仿登录Github的示例代码:
  1. # -*- coding: utf-8 -*-
  2. import scrapy
  3. import re
  4. class TmallLoginSpider(scrapy.Spider):
  5.   name = 'github_login3'
  6.   allowed_domains = ['github.com']
  7.   start_urls = ['https://github.com/']
  8.   def start_requests(self): # 请求时携带Cookies
  9.     cookies = '_ga=GA1.2.363045452.1554860671; tz=Asia%2FShanghai; _octo=GH1.1.1405577398.1554860677; _device_id=ee3ff12512668a1f9dc6fb33e388ea20; ignored_unsupported_browser_notice=false; has_recent_activity=1; user_session=5oxrsfsZCor1iJFCgRXXyeAXd8hcmzEUGh70-xHWLjQkT62Q; __Host-user_session_same_site=5oxrsfsZCor1iJFCgRXXyeAXd8hcmzEUGh70-xHWLjQkT62Q; logged_in=yes; dotcom_user=pengjunlee; _gat=1'
  10.     cookies = {i.split('=')[0]: i.split('=')[1] for i in cookies.split('; ')}
  11.     yield scrapy.Request(self.start_urls[0], cookies=cookies)
  12.    
  13.   def parse(self, response): # 验证是否请求成功
  14.     print(re.findall('Learn Git and GitHub without any code!',response.body.decode()))
复制代码
实行爬虫后,背景部分日记截图如下:

发送Post请求模仿登录

Scrapy还提供了两种通过发送Post请求来获取Cookies的方法。
scrapy.FormRequest()

使用scrapy.FormRequest()发送Post请求实现模仿登陆,必要人为找出登录请求的地点以及构造出登录时所需的请求数据。
使用scrapy.FormRequest()模仿登录Github的示例代码:
  1. # -*- coding: utf-8 -*-
  2. import scrapy
  3. import re
  4. class GithubLoginSpider(scrapy.Spider):
  5.   name = 'github_login'
  6.   allowed_domains = ['github.com']
  7.   start_urls = ['https://github.com/login']
  8.   def parse(self, response): # 发送Post请求获取Cookies
  9.     authenticity_token = response.xpath('//input[@name="authenticity_token"]/@value').extract_first()
  10.     utf8 = response.xpath('//input[@name="utf8"]/@value').extract_first()
  11.     commit = response.xpath('//input[@name="commit"]/@value').extract_first()
  12.     form_data = {
  13.       'login': 'pengjunlee@163.com',
  14.       'password': '123456',
  15.       'webauthn-support': 'supported',
  16.       'authenticity_token': authenticity_token,
  17.       'utf8': utf8,
  18.       'commit': commit}
  19.     yield scrapy.FormRequest("https://github.com/session", formdata=form_data, callback=self.after_login)
  20.   def after_login(self, response): # 验证是否请求成功
  21.     print(re.findall('Learn Git and GitHub without any code!', response.body.decode()))
复制代码
从背景日记不丢脸出,Scrapy 在请求完 https://github.com/session 后,主动帮我们重定向到了Github首页。

scrapy.FormRequest.from_response()

scrapy.FormRequest.from_response()使用起来比 scrapy.FormRequest()更加简朴方便,我们通常只必要提供用户相关信息(账户和密码)即可,scrapy.FormRequest.from_response()将通过模仿点击为我们添补好其他的表单字段并提交表单。
使用scrapy.FormRequest.from_response()模仿登录Github的示例代码:
  1. # -*- coding: utf-8 -*-
  2. import scrapy
  3. import re
  4. class GithubLogin2Spider(scrapy.Spider):
  5.   name = 'github_login2'
  6.   allowed_domains = ['github.com']
  7.   start_urls = ['https://github.com/login']
  8.   def parse(self, response): # 发送Post请求获取Cookies
  9.     form_data = {
  10.       'login': 'pengjunlee@163.com',
  11.       'password': '123456'
  12.     }
  13.     yield scrapy.FormRequest.from_response(response,formdata=form_data,callback=self.after_login)
  14.   def after_login(self,response): # 验证是否请求成功
  15.     print(re.findall('Learn Git and GitHub without any code!',response.body.decode()))
复制代码
scrapy.FormRequest.from_response()方法还可以传入其他参数来帮我们更加准确的指定表单元素:
  1. '''
  2. response (Response object) – 包含表单HTML的响应,将用来对表单的字段进行预填充
  3. formname (string) – 如果设置了该值,name 等于该值的表单将被使用
  4. formid (string) – 如果设置了该值,id 等于该值的表单将被使用
  5. formxpath (string) – 如果设置了该值,匹配该 xpath 的第一个表单将被使用
  6. formcss (string) – 如果设置了该值,匹配该 css选择器的第一个表单将被使用
  7. formnumber (integer) – 索引值等于该值的表单将被使用,默认第一个(索引值为 0 )
  8. formdata (dict) – 传入的表单数据,将覆盖form 元素中已经存在的值
  9. clickdata (dict) – 用于查找可点击控件的属性值
  10. dont_click (boolean) – 如果设置为 True,将不点击任何元素,直接提交表单数据
  11. '''
复制代码
参考文章

https://doc.scrapy.org/en/latest/topics/request-response.html
到此这篇关于Scrapy实现模仿登录的示例代码的文章就先容到这了,更多相关Scrapy 模仿登录内容请搜索草根技能分享从前的文章或继承浏览下面的相关文章希望大家以后多多支持草根技能分享!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作