Scrapy--模拟登录
目录
为什么要模拟登录
请求时携带Cookies
发送Post请求模拟登录
scrapy.FormRequest()
scrapy.FormRequest.from_response()
为什么要模拟登录
有些网站是需要登录之后才能访问的,即便是同一个网站,在用户登录前后页面所展示的内容也可能会大不相同,例如,未登录时访问Github首页将会是以下的注册页面:
然而,登录后访问Github首页将包含如下页面内容:
如果我们要爬取的是一些需要登录之后才能访问的页面数据就需要模拟登录了。通常我们都是利用的 Cookies 来实现模拟登录,在Scrapy中,模拟登陆网站一般有如下两种实现方式:
(1) 请求时携带Cookies
(2) 发送Post请求获取Cookies
请求时携带Cookies
对于一些Cookies过期时间很长的不规范网站,如果我们能够在Cookies过期之前爬取到所有我们想要的数据,可以考虑在请求时直接将Cookies信息带上来模拟用户登录。
以下是模拟登录Github的示例代码:
# -*- coding: utf-8 -*-
import scrapy
import reclass TmallLoginSpider(scrapy.Spider):name = 'github_login3'allowed_domains = ['github.com']start_urls = ['https://github.com/']def start_requests(self): # 请求时携带Cookiescookies = '_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'cookies = {i.split('=')[0]: i.split('=')[1] for i in cookies.split('; ')}yield scrapy.Request(self.start_urls[0], cookies=cookies)def parse(self, response): # 验证是否请求成功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的示例代码:
# -*- coding: utf-8 -*-
import scrapy
import reclass GithubLoginSpider(scrapy.Spider):name = 'github_login'allowed_domains = ['github.com']start_urls = ['https://github.com/login']def parse(self, response): # 发送Post请求获取Cookiesauthenticity_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()form_data = {'login': 'pengjunlee@163.com','password': '123456','webauthn-support': 'supported','authenticity_token': authenticity_token,'utf8': utf8,'commit': commit}yield scrapy.FormRequest("https://github.com/session", formdata=form_data, callback=self.after_login)def after_login(self, response): # 验证是否请求成功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的示例代码:
# -*- coding: utf-8 -*-
import scrapy
import reclass GithubLogin2Spider(scrapy.Spider):name = 'github_login2'allowed_domains = ['github.com']start_urls = ['https://github.com/login']def parse(self, response): # 发送Post请求获取Cookiesform_data = {'login': 'pengjunlee@163.com','password': '123456'}yield scrapy.FormRequest.from_response(response,formdata=form_data,callback=self.after_login)def after_login(self,response): # 验证是否请求成功print(re.findall('Learn Git and GitHub without any code!',response.body.decode()))
scrapy.FormRequest.from_response()方法还可以传入其他参数来帮我们更加精确的指定表单元素:
'''
response (Response object) – 包含表单HTML的响应,将用来对表单的字段进行预填充
formname (string) – 如果设置了该值,name 等于该值的表单将被使用
formid (string) – 如果设置了该值,id 等于该值的表单将被使用
formxpath (string) – 如果设置了该值,匹配该 xpath 的第一个表单将被使用
formcss (string) – 如果设置了该值,匹配该 css选择器的第一个表单将被使用
formnumber (integer) – 索引值等于该值的表单将被使用,默认第一个(索引值为 0 )
formdata (dict) – 传入的表单数据,将覆盖form 元素中已经存在的值
clickdata (dict) – 用于查找可点击控件的属性值
dont_click (boolean) – 如果设置为 True,将不点击任何元素,直接提交表单数据
'''
参考文章
https://doc.scrapy.org/en/latest/topics/request-response.html
Scrapy--模拟登录相关推荐
- scrapy模拟登录新浪微博
hi: all, scrapy搞模拟登录真的很简单哦,以下均是在你安装scrapy成功的前提下哦. 首先,分析新浪微薄的登录流程,使用抓包工具得到下面的图片: 一般来说,登录主要就是对服务器进行pos ...
- scrapy mysql 模拟登录知乎_详细的Python Scrapy模拟登录知乎
之前爬取携程和51job都是免登陆就能爬取数据的,但是今天爬取知乎的时候就需要登录后才能爬到数据,那我们只能进行模拟登录了. 知乎登录分为邮箱登录和手机登录两种方式,通过浏览器的开发者工具查看,我们通 ...
- scrapy 模拟登陆
python 模拟登录豆瓣 并 发表动态:https://blog.csdn.net/freeking101/article/details/65445551 python网络爬虫之使用scrapy自 ...
- python全系列之爬虫scrapy_python爬虫scrapy之登录知乎
下面我们看看用scrapy模拟登录的基本写法: 注意:我们经常调试代码的时候基本都用chrome浏览器,但是我就因为用了谷歌浏览器(它总是登录的时候不提示我用验证码,误导我以为登录时不需要验证码,其实 ...
- request body 里丢东西了_26. Scrapy 框架-模拟登录-Request、Response
1. Scrapy-Request和Response(请求和响应) Scrapy的Request和Response对象用于爬网网站. 通常,Request对象在爬虫程序中生成并传递到系统,直到它们到达 ...
- 在scrapy上使用cookie模拟登录
下面的例子模拟登录知乎的个人设置页面 设置代理池 scrapy + tor #安装tor sudo apt-get install tor sudo /etc/init.d/tor restart # ...
- scrapy ,Selenium 企查查模拟登录
middlewares.py文件 **#更换User-agent ,读取cookie** import time from selenium import webdriver from scrapy. ...
- Scrapy + Selenium 实现模拟登录,获取页面动态加载数据
本文是模拟登录某八同城招聘网站,然后获取一个招聘信息页面中的浏览人数. 直接上代码! 1. Scrapy 爬虫文件 import scrapyclass TestSpider(scrapy.Spide ...
- python爬虫实战(四)--------豆瓣网的模拟登录(模拟登录和验证码的处理----scrapy)...
在利用scrapy框架爬各种网站时,一定会碰到某些网站是需要登录才能获取信息. 这两天也在学习怎么去模拟登录,通过自己码的代码和借鉴别人的项目,调试成功豆瓣的模拟登录,顺便处理了怎么自动化的处理验证码 ...
- scrapy mysql 模拟登录知乎_Scrapy 模拟登录新版知乎
写这篇文章是因为知乎登录已经改版了,新版登录和老版登录区别还是挺大了,新版登录的 post 请求减少了一些字段的同时新增了一些字段,而且新增的字段如 signature 的值是通过一些算法得到的,比较 ...
最新文章
- ubuntu服务器版编辑文件,Ubuntu 服务器版 18.04.4 固定 IP 设置
- 中国治理蝗灾是生物防治的成就,根本不是靠鸡靠鸭靠吃货换来的!
- 计算机课件制作技能,经济论文写作PPT制作有哪些技巧?
- Namespace declaration statement has to be the very first statement in the script
- Linux从零开始(二、基础命令(续三)修改密码)
- 第三章:Creating Utilities--27.增加一个本地词典
- gdb 10.2的安装
- OC2_点语法(属性关键字)
- MSP430F5529 DriverLib 库函数学习笔记(六)定时器A产生PWM波
- Python入门基础篇(二)元组,更适合新手哦!!!
- matlab中ode45函数的用法_带你理解Excel中COUNTIF函数的简单用法
- 如何优雅的定义 App 的界面设计
- 幽冥问答录:兼职阴间判官介绍阴间是什么样子
- HTTP协议中POST方法和GET方法有那些区别?
- java私有协议开发_priProto 基于netty5基于私有协议栈设计
- 这几天可能是长时间关注电脑,眼睛没有得到休息,所以就早上起来眼睛有点通...
- BackgroundWorker使用总结
- 原生开发什么意思_原生APP是什么?选原生开发有哪些优势?
- 移植MotionDriver到RTT
- img居中以及等比缩放
热门文章
- Linux常用命令for QA-数据脱敏版1
- Office——安装从32位转为64位
- 不可复制的AI螺旋:HUAWEI P20的“长板理论 ”
- 【安卓逆向】CTF实战分析(什么是CTF,我们一起来看看)
- 设定可执行目标的4个技巧
- 中国有钱人抢购iPhone,推动苹果销量猛增重夺全球手机市场第二名
- 从离轴光学到波导技术:详解 AR 显示的过去和未来
- 月入四万元 !“宅经济”催生内容付费春天?
- js原型链污染(超详细)
- apline更新下载软件报错ERROR: http://dl-cdn.alpinelinux.org/alpine/v3.12/main: network error (check Internet