爬虫学习笔记(九)—— Scrapy框架(四):FormRequest、日志
一、Request
Scrapy.http.Request类是scrapy框架中request的基类。它的参数如下:
url(字符串) - 此请求的URL
callback(callable)- 回调函数
method(string) - 此请求的HTTP方法。默认为’GET’。
meta(dict) - Request.meta属性的初始值。
body(str 或unicode) - 请求体。如果没有传参,默认为空字符串。
headers(dict) - 此请求的请求头。
cookies - 请求cookie。
encoding(字符串) - 此请求的编码(默认为’utf-8’)此编码将用于对URL进行百分比编码并将body抓换str(如果给定unicode)。
priority(int) - 此请求的优先级(默认为0),数字越大优先级越高。
dont_filter(boolean) - 表示调度程序不应过滤此请求。
errback(callable) - 在处理请求时引发任何异常时将调用的函数。
flags(list) - 发送给请求的标志,可用于日志记录或类似目的
from scrapy.http import Request,FormRequestreq=Request("http://www.baidu.com",headers={"spider":666},meta={"name":"爬虫"})
#功能构造请求
#参数
#请求对象
print(req.url) #http://www.baidu.com
print(req.method) #GET
print(req.headers) #{b'Spider': [b'666']}
print(req.meta) #{'name': '爬虫'}
rer=req.replace(url="https://www.baidu.com")
print(rer.url) #https://www.baidu.com
二、FormRequest
get请求和post请求是最常见的请求。scrapy框架内置了一个FormRequest类
它扩展了基类Request,具有处理HTML表单的功能。
在使用scrapy发动POST请求的时候,常使用此方法,能较方便的发送请求.具体的使用,见登录github案例;
三、Response
url(字符串) - 此响应的URL
status(整数) - 响应的HTTP状态。默认为200。
headers(dict) - 此响应的响应头。dict值可以是字符串(对于单值标头)或列表(对于多值标头)。
body(字节) - 响应主体。要将解码后的文本作为str(Python 2中的unicode)访问,您可以使用response.text 来自编码感知的 Response子类,例如TextResponse。
flags(列表) - 是包含Response.flags属性初始值的列表 。如果给定,列表将被浅层复制。
request(Requestobject) - Response.request属性的初始值。这表示Request生成此响应的内容。
属性和方法
url 包含此请求的URL的字符串。该属性是只读的。更改请求使用的URL replace()。
method 表示请求中的HTTP方法的字符串。
headers 类似字典的对象,包含请求头。
body 包含请求正文的str。该属性是只读的。更改请求使用的URL replace()。
meta 包含此请求的任意元数据的字典。
copy() 返回一个新的请求,改请求是此请求的副本。
replace([ URL,method,headers,body,cookies,meta,encoding,dont_filter,callback,errback] ) 返回一个更新对的request
四、日志使用
logger
Scrapy logger 在每个Spider实例中提供了一个可以访问和使用的实例
例如:
self.logger.warning("可能会有错误")
日志文件配置
LOG_FILE
日志输出文件,如果为None,就打印在控制台
LOG_ENABLED
是否启用日志,默认True
LOG_ENCODING
日期编码,默认utf-8
LOG_LEVEL
日志等级,默认debug
LOG_FORMAT
日志格式
LOG_DATEFORMAT
日志日期格式
LOG_STDOUT
日志标准输出,默认False,如果True所有标准输出都将写入日志中
LOG_SHORT_NAMES
短日志名,默认为False,如果True将不输出组件名
示例(直接添加在settings里):
项目中一般设置:
LOG_FILE = 'logfile_name'
LOG_LEVEL = 'INFO'
日志格式输出:
LOG_FORMAT='%(asctime)s [%(name)s] %(levelname)s: %(message)s'
LOG_DATEFORMAT ='%Y'
日志等级:
DEBUG(调试信息)< INFO(一般信息) < WARNING(警告) < ERROR(错误) < CRITICAL(严重错误)
五、案例:实现Github登录
5.1、登录参数
登录需要向 https://github.com/session 网址提交用户名和密码,
除此之外,还有其他的参数(这里列举的仅供参考,具体还是要看网页的):
data={'commit': 'Sign in','authenticity_token': authenticity_token,'login': 'xxxxxxxxx@qq.com','password': 'xxxxxx','trusted_device': '','webauthn-support': 'supported','webauthn-iuvpaa-support': 'unsupported','return_to': 'https://github.com/login','allow_signup': '','client_id': '','integration': '',required_field: '','timestamp': timestamp,'timestamp_secret': timestamp_secret
}
注意:需要提交的数据可能来源:
1.之前访问的页面中
2.JS动态生成
这需要经过分析检验,有些数据需要我们来构造,有些是默认的。
5.2、请求流程
- 访问 https://github.com/login 获取 https://github.com/session 需要的参数
- 向 https://github.com/session 提交 post 用户名 密码等数据 获取登录页面
5.3、代码:
spider文件
import scrapyclass LoginSpider(scrapy.Spider):name = 'login'# allowed_domains = ['github.com']start_urls = ['https://github.com/login']def parse(self, response):#通过对比分析,以下需要我们来自己构建authenticity_token = response.xpath('//input[@name="authenticity_token"]/@value').extract()[0]required_field = response.xpath('//input[@hidden="hidden"]/@name').extract()[0]timestamp = response.xpath('//input[@name="timestamp"]/@value').extract()[0]timestamp_secret = response.xpath('//input[@name="timestamp_secret"]/@value').extract()[0]data={'commit': 'Sign in','authenticity_token': authenticity_token,'login': 'xxxxxxxxx@qq.com', #记得写账号'password': 'xxxxxx', #记得写密码'trusted_device': '','webauthn-support': 'supported','webauthn-iuvpaa-support': 'unsupported','return_to': 'https://github.com/login','allow_signup': '','client_id': '','integration': '',required_field: '','timestamp': timestamp,'timestamp_secret': timestamp_secret}#使用FormRequest来请求yield scrapy.FormRequest(url='https://github.com/session',formdata=data,callback=self.verify_login) def verify_login(self,response):if 'Q-bird1' in response.text: #Q-bird1是我登录成功后,网页源码里的特有的一个字符串print('登录成功!!!')else:print('登录失败!!!')
settings文件
设置robots协议,添加全局请求头
ROBOTSTXT_OBEY = FalseDEFAULT_REQUEST_HEADERS = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language': 'en','user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36',
}#设置日志的输出格式
LOG_FORMAT='%(asctime)s [%(name)s] %(levelname)s: %(message)s'
LOG_DATEFORMAT ='%Y'
结果(表示我们已经成功了):
爬虫学习笔记(九)—— Scrapy框架(四):FormRequest、日志相关推荐
- 从0到1爬虫学习笔记:04Scrapy框架
文章目录 1 Scrapy概述 1.1 Scrapy架构图 1.2 Scrapy开发步骤 2 入门案例 2.1 学习目标 2.2 新建项目(scrapy startproject) 2.3 明确目标( ...
- 爬虫学习笔记(二十四)—— pyspider框架
文章目录 一.框架介绍 1.1.简介 1.2.安装(windows) 1.3.Phantomjs 无界面浏览器 二.框架入门 2.1.启动pyspider 2.2.创建一个项目 2.3.脚本 2.4. ...
- 爬虫学习笔记(十)—— Scrapy框架(五):下载中间件、用户/IP代理池、settings文件
一.下载中间件 下载中间件是一个用来hooks进Scrapy的request/response处理过程的框架. 它是一个轻量级的底层系统,用来全局修改scrapy的request和response. ...
- Python3 爬虫学习笔记 C18【爬虫框架 pyspider — 深入理解】
Python3 爬虫学习笔记第十八章 -- [爬虫框架 pyspider - 深入理解] 文章目录 [18.1]启动参数 [18.2]运行单个组件 [18.2.1]运行 Scheduler [18.2 ...
- Python3 爬虫学习笔记 C17【爬虫框架 pyspider — 基本使用】
Python3 爬虫学习笔记第十七章 -- [爬虫框架 pyspider - 基本使用] 文章目录 [17.1]初识 pyspider [17.2]使用 pyspider [17.2.1]主界面 [1 ...
- JavaScript学习笔记(九)(验证框架,layer弹出层)
JavaScript学习笔记(九) 一.jQuery Validate验证框架 1.引入相关插件路径 2. 修改一些规则 3. 自定义验证规则 4.异步验证 整体代码 二.layer弹出层 1.引入相 ...
- Python3 爬虫学习笔记 C04 【自动化测试工具 Selenium】
Python3 爬虫学习笔记第四章 -- [自动化测试工具 Selenium] 文章目录 [4.1]下载驱动 [4.2]声明浏览器对象 [4.3]访问页面 [4.4]启动参数 [4.5]查找节点 [4 ...
- Scrapy:学习笔记(2)——Scrapy项目
Scrapy:学习笔记(2)--Scrapy项目 1.创建项目 创建一个Scrapy项目,并将其命名为"demo" scrapy startproject demo cd demo ...
- java mvc框架代码_JAVA技术学习笔记:SpringMVC框架(内附入门程序开发代码)
原标题:JAVA技术学习笔记:SpringMVC框架(内附入门程序开发代码) JavaEE体系结构包括四层,从上到下分别是应用层.Web层.业务层.持久层.Struts和SpringMVC是Web层的 ...
- Python3 爬虫学习笔记 C14【验证码对抗系列 — 点触验证码】
Python3 爬虫学习笔记第十四章 -- [验证码对抗系列 - 点触验证码] 文章目录 [14.1]关于点触验证码 [14.2]点触验证码攻克思路 [14.3]模拟登录 12306 - 总体思路 [ ...
最新文章
- 07、C语言——函数
- mysql获取当前时间_MYSQL proxysql 在深入 信息获取和信息输出
- Go笔记-错误处理和defer
- BB陆逊高达(3Dmax)
- Swift-binary search tree
- 安装kali linux 2017.1 【二、安装VMware-tools 以及相关问题处理】
- 02326 操作系统 简答题 超简短归纳
- Windows下安装MySQL
- Docker入门与实践之 Dockerfile 语法详解
- Winodws 10中pyCharm 2017安装
- java负数用什么类型定义_(转) Java中的负数及基本类型的转型详解
- 飞思卡尔mc9s08烧录方法_编程器USBDM 读写MC9S08 MCF51 批量烧录刷写NXP飞思卡尔单片机...
- android 沉浸式按钮,android – 如何完全退出沉浸式全屏模式?
- polyfit及poly1d多项式拟合
- c语言的标识符可分为哪3种字符,c语言标识符有哪三类?
- Sunshine数据库篇之查询
- 软件测试笔记(十六)- 缺陷轰炸和beta测试
- 软件工程课程实践-项目开发总结报告
- 不驰于空想,不骛于虚声
- 杭电OJ 1159(C++)
热门文章
- tensorflow random的用法
- php连接到mysql数据库,PHP MySQL:连接到MySQL数据库
- python图片内容长度识别_教你如何用几行Python代码识别图片文字--就是这么简单!...
- float python_Python中float('INF')的使用
- 108. Leetcode 188. 买卖股票的最佳时机 IV (动态规划-股票交易)
- Leetcode 47. 全排列 II (每日一题 20211015)
- NTU 课程笔记 :NLP - language model
- 机器学习笔记:Adam
- 数据中台应用实战50篇(一)-带你概览BI、数据仓库、数据湖与数据中台之间有什么关联关系?(建议收藏)
- (建议收藏)万字长文,帮你一招搞定产品经理面试-详解产品经理面试大全