一、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、请求流程

  1. 访问 https://github.com/login 获取 https://github.com/session 需要的参数
  2. 向 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、日志相关推荐

  1. 从0到1爬虫学习笔记:04Scrapy框架

    文章目录 1 Scrapy概述 1.1 Scrapy架构图 1.2 Scrapy开发步骤 2 入门案例 2.1 学习目标 2.2 新建项目(scrapy startproject) 2.3 明确目标( ...

  2. 爬虫学习笔记(二十四)—— pyspider框架

    文章目录 一.框架介绍 1.1.简介 1.2.安装(windows) 1.3.Phantomjs 无界面浏览器 二.框架入门 2.1.启动pyspider 2.2.创建一个项目 2.3.脚本 2.4. ...

  3. 爬虫学习笔记(十)—— Scrapy框架(五):下载中间件、用户/IP代理池、settings文件

    一.下载中间件 下载中间件是一个用来hooks进Scrapy的request/response处理过程的框架. 它是一个轻量级的底层系统,用来全局修改scrapy的request和response. ...

  4. Python3 爬虫学习笔记 C18【爬虫框架 pyspider — 深入理解】

    Python3 爬虫学习笔记第十八章 -- [爬虫框架 pyspider - 深入理解] 文章目录 [18.1]启动参数 [18.2]运行单个组件 [18.2.1]运行 Scheduler [18.2 ...

  5. Python3 爬虫学习笔记 C17【爬虫框架 pyspider — 基本使用】

    Python3 爬虫学习笔记第十七章 -- [爬虫框架 pyspider - 基本使用] 文章目录 [17.1]初识 pyspider [17.2]使用 pyspider [17.2.1]主界面 [1 ...

  6. JavaScript学习笔记(九)(验证框架,layer弹出层)

    JavaScript学习笔记(九) 一.jQuery Validate验证框架 1.引入相关插件路径 2. 修改一些规则 3. 自定义验证规则 4.异步验证 整体代码 二.layer弹出层 1.引入相 ...

  7. Python3 爬虫学习笔记 C04 【自动化测试工具 Selenium】

    Python3 爬虫学习笔记第四章 -- [自动化测试工具 Selenium] 文章目录 [4.1]下载驱动 [4.2]声明浏览器对象 [4.3]访问页面 [4.4]启动参数 [4.5]查找节点 [4 ...

  8. Scrapy:学习笔记(2)——Scrapy项目

    Scrapy:学习笔记(2)--Scrapy项目 1.创建项目 创建一个Scrapy项目,并将其命名为"demo" scrapy startproject demo cd demo ...

  9. java mvc框架代码_JAVA技术学习笔记:SpringMVC框架(内附入门程序开发代码)

    原标题:JAVA技术学习笔记:SpringMVC框架(内附入门程序开发代码) JavaEE体系结构包括四层,从上到下分别是应用层.Web层.业务层.持久层.Struts和SpringMVC是Web层的 ...

  10. Python3 爬虫学习笔记 C14【验证码对抗系列 — 点触验证码】

    Python3 爬虫学习笔记第十四章 -- [验证码对抗系列 - 点触验证码] 文章目录 [14.1]关于点触验证码 [14.2]点触验证码攻克思路 [14.3]模拟登录 12306 - 总体思路 [ ...

最新文章

  1. 07、C语言——函数
  2. mysql获取当前时间_MYSQL proxysql 在深入 信息获取和信息输出
  3. Go笔记-错误处理和defer
  4. BB陆逊高达(3Dmax)
  5. Swift-binary search tree
  6. 安装kali linux 2017.1 【二、安装VMware-tools 以及相关问题处理】
  7. 02326 操作系统 简答题 超简短归纳
  8. Windows下安装MySQL
  9. Docker入门与实践之 Dockerfile 语法详解
  10. Winodws 10中pyCharm 2017安装
  11. java负数用什么类型定义_(转) Java中的负数及基本类型的转型详解
  12. 飞思卡尔mc9s08烧录方法_编程器USBDM 读写MC9S08 MCF51 批量烧录刷写NXP飞思卡尔单片机...
  13. android 沉浸式按钮,android – 如何完全退出沉浸式全屏模式?
  14. polyfit及poly1d多项式拟合
  15. c语言的标识符可分为哪3种字符,c语言标识符有哪三类?
  16. Sunshine数据库篇之查询
  17. 软件测试笔记(十六)- 缺陷轰炸和beta测试
  18. 软件工程课程实践-项目开发总结报告
  19. 不驰于空想,不骛于虚声
  20. 杭电OJ 1159(C++)

热门文章

  1. tensorflow random的用法
  2. php连接到mysql数据库,PHP MySQL:连接到MySQL数据库
  3. python图片内容长度识别_教你如何用几行Python代码识别图片文字--就是这么简单!...
  4. float python_Python中float('INF')的使用
  5. 108. Leetcode 188. 买卖股票的最佳时机 IV (动态规划-股票交易)
  6. Leetcode 47. 全排列 II (每日一题 20211015)
  7. NTU 课程笔记 :NLP - language model
  8. 机器学习笔记:Adam
  9. 数据中台应用实战50篇(一)-带你概览BI、数据仓库、数据湖与数据中台之间有什么关联关系?(建议收藏)
  10. (建议收藏)万字长文,帮你一招搞定产品经理面试-详解产品经理面试大全