scrapy框架之post请求

2023-11-02

1、post请求

首先从浏览器打开百度翻译,去抓一下接口
右键检查,一开始是network是什么都没有的,如果有,那是你操作步骤快了,抓的信息是网页的信息
在这里插入图片描述
然后随便输入一些东西,发现network中多了一些内容,这就是抓到的东西,这里的相关的信息,比如请求方式啊,状态码等等在这里插入图片描述
嗯~既然说到了,就简单介绍一下,当是复习了
首先这第一个接口,Headers栏这里返回了四大模块:

  1. 通用头:响应头和请求头中都有的东西
  2. 响应头
  3. 请求头
  4. 表单数据:这里表单数据直接显示出来了,就先介绍,kw(keyword) 也就是关键字,我们搜索只输了一个字母a

在这里插入图片描述
然后看一下具体的
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、通过scrapy框架用爬虫发起post请求

首先在黑屏终端使用命令,创建一个项目

scrapy startproject PostDemo

然后使用pycharm打开该项目,在pycharm的Terminal终端输入命令,新建一个爬虫

scrapy genspider fanyi fanyi.baidu.com

当爬虫文件创建后,有start_urls这个字段
引擎调度起来以后,首先创建完爬虫对象以后,会从start_urls里面取出起始url
放入调度器来调度,调度器调度的时候默认发起的是get请求(调度器默认创建的是get请求的下载器)
若要post请求,则需注释start_urls

接下来如果要发起post请求,首先要重写一个周期函数发起post请求
就以上面百度翻译为例,发起一个post请求,输在翻译栏入一个a,我们上面已经抓到过这个接口
在这里插入图片描述
这个接口返回的数据是一个json字符串
在这里插入图片描述

现在用爬虫的scrapy框架来发起这个post请求
fanyi .py

# -*- coding: utf-8 -*-
import scrapy


class FanyiSpider(scrapy.Spider):
    name = 'fanyi'
    allowed_domains = ['fanyi.baidu.com']
    # start_urls = ['http://fanyi.baidu.com/']
    #引擎调度起来以后,首先创建完爬虫对象以后,会从start_urls里面取出起始url
    # 放入调度器来调度,调度器调度的时候默认发起的是get请求(调度器默认创建的是get请求的下载器)
    # 若要post请求,则需注释start_urls
    
    
    
    # 如果要发起post请求,首先要重写一个周期函数(这是一个回调函数)
    def start_requests(self):
        #这个周期函数,下载器开始下载数据的时候被调用
        print('下载器开始请求网络.....')
        post_url = 'http://fanyi.baidu.com/sug'
        #创建表单数据
        data ={
            'kw':'a'
        }
        #现在可以在这个方法中截获调度器的调度,把调度器创建get请求的操作变成创建post请求对象
        #scrapy 的下载器常用的有两种,Request对象和FormRequest对象,分别用于处理get和post请求
        
        #发起post请求
        yield  scrapy.FormRequest(url=post_url,formdata=data,callback=self.parse_post)
        
        
        
        #需要定义一个被调函数,用于传递给post下载器对象,让post对象去调用
    def parse_post(self, response):
       # 下载器(get下载器和post下载器)的回调函数,都要求传递一个参数去接收响应对象
        print(response.text)
        

爬虫文件写好就完了吗?

当然没那么简单
还需要在setting .py文件中修改请求头,将robot协议改为不遵循

USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'

ROBOTSTXT_OBEY = False

然后,在pycharm终端输入命令

scrapy crawl fanyi

如果Terminal终端有json字符串,说明这个post请求成功
在这里插入图片描述
那么学会这个有什么用呢?

好嘞,接下来了解一下比较复杂的post请求,看一下怎么用scrapy破解验证码,登录网站,以以前爬取过的古诗文网站为例
https://www.gushiwen.org/

3、使用Scrapy框架破解验证码

在这里插入图片描述
首先,再建一个爬虫文件

scrapy genspider gushiwen gushiwen.org

然后,在setting文件中将下载时延开启

DOWNLOAD_DELAY = 3

由于我们需要用get请求获取登陆页的接口,所以这里的start_url不用再注释了,因为我们需要根据这个get请求回来的登录页的数据发起post请求
把start_url改为登陆页面的url

然后,这时候,回想以前的破解验证码,都是要获取cookie的
那么这个…

scrapy框架中,setting文件下有这些代码
在这里插入图片描述
这个cookies是默认打开的,当然,你要是闲的,也可以改成这样

COOKIES_ENABLED = True

好了,其他不用管了,专心关注于爬虫文件就行了

  1. 首先,通过get请求要获取账户,密码,验证码这些接口
    在这里插入图片描述
  2. 破解验证码
  3. 使用post方式提交数据

具体不多做解释了,代码也不难

gushiwen .py

# -*- coding: utf-8 -*-
import scrapy
import pytesseract
from PIL import Image

class GushiwenSpider(scrapy.Spider):
    name = 'gushiwen'
    allowed_domains = ['gushiwen.org']
    start_urls = ['https://so.gushiwen.org/user/login.aspx?from=http://so.gushiwen.org/user/collect.aspx']

    def parse(self, response):
        # 从登录页面中提取两个token和一个验证码
        item = {}
        # 验证码
        item['code_url'] = "https://so.gushiwen.org" + response.xpath("//img[@id='imgCode']/@src").extract()[0]
        # token
        item["__VIEWSTATE"] = response.xpath("//input[@id='__VIEWSTATE']/@value").extract()[0]
        item["__VIEWSTATEGENERATOR"] = response.xpath("//input[@id='__VIEWSTATEGENERATOR']").extract()[0]
        # 创建一个get请求的下载器,去下载验证码
        yield scrapy.Request(url=item["code_url"], callback=self.parse_code, meta={"item": item})
        # response对象有一个属性叫做meta,用于记录响应的相关信息,这个meta属性可以自定义,在Request对象发起请求的时候可以提前把一些自定义meta配置写入
    
    # 定义一个回调函数,用于处理下载完成验证码的数据
    def parse_code(self, response):
        print(
            response.meta)  # {'depth': 1, 'download_timeout': 180.0, 'download_slot': 'so.gushiwen.org', 'download_latency': 0.06549572944641113}
        # 从上级页面的响应体中取出meta中的item信息
        item = response.meta["item"]
    
        # print(response.body)
        # 将图片写入本地
        with open("./code.png", 'wb') as fp:
            fp.write(response.body)
        # 识别验证码
        code = self.identify_code("./code.png")
        print(code)
    
        # 发起post请求,去登录
        # 登录接口
        login_url = "https://so.gushiwen.org/user/login.aspx?from=http://so.gushiwen.org/user/collect.aspx"
        # 表单数据
        data = {
            '__VIEWSTATE': item['__VIEWSTATE'],
            '__VIEWSTATEGENERATOR': item['__VIEWSTATEGENERATOR'],
            'from': 'http://so.gushiwen.org/user/collect.aspx',
            'email': 'fanjianbo666@163.com',
            'pwd': '12345678',
            'code': code,  # 验证码每一次访问登录页面的时候都要刷新,所以要根据登录页面上的验证码进行写入
            'denglu': '登录'
        }
    
        yield scrapy.FormRequest(url=login_url, formdata=data, callback=self.parse_login)
        
        
   # 定义一个回调函数,用于处理登录接口的响应体
    def parse_login(self, res):
        print(res.text)
    
   # 定义一个辅助用于识别验证码
    def identify_code(self, filename):
        img = Image.open(filename)
        # 将图片转成灰度图片
        img = img.convert("L")
        # 将图片上的像素二值化,我们以某个临界值为基准,如果大于这个临界值就设置为255,小于就设置为0
        data = img.load()
        h, w = img.size
        for i in range(h):
            for j in range(w):
                if data[i, j] > 100:
                    data[i, j] = 255
                else:
                    data[i, j] = 0
        # img.show()
        s = pytesseract.image_to_string(img)
        return s
            
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

scrapy框架之post请求 的相关文章

  • 为了安全,把所有人平均分成两队,每一队分别从1开始编号,编号相同的同学组成互助组。在某个景点,领队发现有个同学掉队了,你能找出来是几号同学吗?

    问题 C 去旅游啊 时间限制 1 Sec 内存限制 128 MB 提交 746 解决 573 提交 状态 讨论版 命题人 admin 题目描述 放假了 许多同学准备组团去旅游 石大的同学组了一个旅游团 刚好偶数个人 为了安全 把所有人平均分
  • VS Code断点调式Cesium

    1 在VS Code中安装Debugger for Firefox插件 2 下载安Firefox Developer Edition 3 创建launch json 编辑并保存launch json Use IntelliSense to
  • Java学习笔记 01

    相关文章 Java学习笔记 02 快速之旅 Java环境配置及HelloWorld程序 Java学习笔记 03 基础语法总结 目录 一 解释型语言和编译型语言 编译型语言 解释型语言 Java是解释型语言 or 编译型语言 二 Java语言
  • 【Transformer架构】Transformers are RNNs (linear transformer)

    原始题目 Transformers are RNNs Fast Autoregressive Transformers with Linear Attention 中文翻译 Transformers 是RNNs 带线性Attention的快
  • C++ error: non-const lvalue reference to type

    今晚看交流群的消息 看到大家在讨论一个有意思的问题 int array 5 0 int const p array 编译通过 const int p array 编译失败 报错 error non const lvalue referenc
  • SpringBoot整合quartz(支持多个任务和job支持spring管理的对象)

    工作中经常遇到quartz的job注入的spring对象为null 原因是这样的 quartz每次执行一次job会将执行完成后的job销毁 下次执行的时候 重新new 这就导致job中的 Autowired注入的Spring对象为null
  • 前端如何获取文件后缀名

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前端如何获取文件后缀名 二 使用代码如下 1 引入库 总结 前端如何获取文件后缀名 二 使用代码如下 1 引入库 代码如下 示例 选择文件后返回 resultDat
  • 实现求欧拉回路算法(C++)

    一 算法介绍及实现过程 程序的输入为对应图的结点数和图中与各结点相连的点的编号 注 无向图中的多重边和自环需多次输入 有向图中的多重边需多次输入 程序的第一步是求出图的邻接矩阵 邻接矩阵反映了点与点之间的关系 通过输入各结点相连的点的编号
  • go的make用法

    make用法和参数用法 golang分配内存有一个make函数 该函数第一个数类型 第二个参数的分配的空间 第三个 参数时预留分配空间 前两个参数很好理解 但对第三个参数不是很理解 例如a make int 5 10 len a 输出结果为
  • Golang-语言源码级调试器 Delve

    前言 Go 目前的调试器有如下几种 GDB 最早期的调试工具 现在用的很少 LLDB macOS 系统推荐的标准调试工具 单 Go 的一些专有特性支持的比较少 Delve 专门为 Go 语言打造的调试工具 使用最为广泛 本篇简单说明如何使用
  • OC使用cocoapods导入swift库注意

    首先就是在 targets gt Build Setting gt Packaging 中设置 Defines Module为YES 然后创建swift文件时会生成 文件名 Bridging Header h 这样一个桥接文件 怎样使用co
  • 针对低分辨率或小目标的卷积-SPDConv

    针对低分辨率或小目标的卷积 SPDConv 摘要 引言 A New Building Block SPD Conv 附录 代码 摘要 卷积神经网络在许多计算机视觉任务中取得了巨大成功 然而 在图像低分辨率或目标较小任务上 他们的性能迅速下降
  • 数据分析统计题目

    提示 本文章数据和题目来源于互联网 如有雷同 请联系作者删除 文章目录 前言 二 题集 第一题 第二题 第三题 第四题 前言 公司内部招募数据分析团队 特出此题集 检测各位参与同学的学习态度和能力 二 题集 第一题 某地101例健康男子血清
  • 已解决 I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with on

    已解决WARNING tensorflow From
  • 规则引擎Drools使用 第一篇 规则引擎认知

    规则引擎有什么用呢 可以在那些实际场景使用呢 思考这样一个问题 申请信用卡 每个人去申请信用卡的时候 都会经过一遍核查 这个核查过程其实就可以当做是根据规则 去校验你的信息是否符合规则 只有符合规则的才可以申请信用卡 还记得以前自己写的那些
  • Elasticsearch的算法介绍

    1 算法介绍 relevance score算法 简单来说 就是计算出 一个索引中的文本 与搜索文本 他们之间的关联匹配程度 Elasticsearch使用的是 term frequency inverse document frequen
  • 深入了解JVM的底层原理

    引言 什么是JVM JVM在整个jdk java 运行环境 中处于最底层 负责与操作系统的交互 用来屏蔽操作系统环境 提供一个完整的Java运行环境 因此也就虚拟计算机 操作系统装入JVM是通过jdk中Java exe来完成 通过下面4步来

随机推荐

  • 蒙特卡洛模拟计算风险价值VAR之R语言实现

    一 解析VAR 当在分析方法中计算风险价值 VAR 时 我们需要假设金融工具的返回遵循一定的概率分布 最常用的是正态分布 这也是为什么我们通常称它为delta normal方法 要计算VAR 我们需要找到一个阈值 T 来确定显著性 如95
  • ApiSix 配置 jwt-auth认证

    有问题要学会阅读apisix官方文档 养成好习惯 点我开始学习 1 为签发 token 的 API 配置一个 Route 该路由将使用 public api 插件 在对应的服务器执行以下命令 我尝试通过面板来创建这个Route 发现创建的时
  • Fedora21 入门体验笔记

    以前都是由于对linux的好奇 所以把各种版本都装了个遍 但每次都会因为某些原因 eq 不能玩游戏 用 很麻烦而且不爽 没用几天然后又回到windows 而且最后什么都没有留下 这一次是想真正学习linux 顺便记下使用过程中遇到的一些问题
  • OpenGL 入门教程(八)

    OpenGL 入门教程 八 OpenGL中使用RGBA色彩体系 RGB为红绿蓝三原色 A为 值 该值代表色彩融合时所占的比例 颜色是顶点的重要属性之一 没有色彩的世界是毫无生气的 使用glColor R G B A 设定当前颜色 此后定义所
  • pyecharts各种图表实现(超级全)

    目录 平面直角坐标系 直方图 折线图 箱形图 散点图 带涟漪效果散点图 k线图 热力图 象型图 层叠图 地理图表 GEO 地理坐标系 MAP 地图 BMAP 百度地图 基本图表 饼图 漏斗图 仪表盘 水球图 日历图 关系图 平行坐标系 极坐
  • Springboot整合FastDFS

    文章目录 一 FastDFS Client的实践 1 FastDFS Client的主要特性 2 SpringBoot测试操作FastDFS 1 SpringBoot的配置 2 测试springboot环境下javaapi对分布式文件系统上
  • 商汤PySot的配置使用(1)---siam跟踪算法demo、test、eval

    文章目录 简介 一 环境配置 二 demo 2 1 步骤一 加入工程的python路径 2 2 步骤二 下载模型 2 3 步骤三 编辑demo 三 test 3 1 步骤一 数据集 json文件准备 3 2 步骤二 OTB100等数据集的注
  • 【区块链介绍】区块链的来龙去脉

    1 了解区块链技术的起源 分布式系统 弱中心化是区块链思想的核心 P2P网络 为区块链提供了网络层基础架构 任何一个节点都能与其他节点进行传输 与其它节点保持一致 共识算法 区块链技术的核心 实现了数据的一致存储 密码学 为区块链数据的传输
  • 高数——彻底搞懂如何判断反常积分收敛和发散

    反常积分收敛和发散 预备知识 复杂的反常积分 真题 预备知识 1 极限 不定积分与定积分的基本计算 2 找等价无穷小 3 无穷小和无穷大速度的比较 趋向无穷大的速度 x x x x xx gt e
  • Celery介绍以及使用

    文章目录 celery 一 什么是celery 1 celery是什么 2 使用场景 3 Celery的优点 4 Celery的安装 二 Celery执行异步任务 1 创建异步任务执行文件 消费者 2 创建生产者文件 3 创建result文
  • InnoDB引擎架构

    逻辑存储结构 表空间 ibd文件 一个mysql实例可以对应多个表空间 用于存储记录 索引等数据 段 分为数据段 索引段 回滚段 InnoDB是索引组织表 数据段就是B 树的叶子节点 索引段即为B 树的非叶子节点 段用来管理多个Extent
  • Vue中vuex的使用(三)

    vuex中getters的使用 1 概念 当state中的数据需要经过加工后再使用时 可以使用getters加工 2 在store js中追加getters配置 准备getter 用于将state中sum加工 const getters b
  • vue如何获取当前页面的url

    如果你使用 vue router 文档在这里 路由信息对象的属性 const routes path portfolio year review component Portfolio 这个样子获取 this route params ye
  • 二十一.数据结构学习笔记.1

    一 抽象数据类型 抽象数据类型 Abstract Data Type ADT 是一些操作的集合 抽象数据类型是数学的抽象 在ADT定义中根本没涉及如何实现这些操作 例如 表 集合 图及它们的操作 它们都可以看作抽象数据类型 就像整数 实数和
  • cmake:if

    有条件地执行一组命令 概要 if
  • java笔记:抽象方法与抽象类

    抽象方法和抽象类 1 规则 抽象方法和抽象类必须用abstract进行修饰 有抽象方法的类只能被定义为抽象类 抽象类中可以没有抽象方法 抽象类不能被实例化 无法使用new调用抽象类的构造器创建抽象类的实例 无法创建实例 抽象类中可以包含成员
  • 网络安全渗透测试实验一

    1 实验目的和要求 理解网络扫描 网络侦察的作用 通过搭建网络渗透测试平台 了解并熟悉常用搜索引擎 扫描工具的应用 通过信息收集为下一步渗透工作打下基础 系统环境 Kali Linux 2 Windows 网络环境 交换网络结构 实验工具
  • pyqt5数据库使用教程

    1 关于连接sqlite数据库时使用QSqlTableModel模型查看具体数据 通过行号 列名称来获取某单元格的数据 注 model中的一行称为一条record 一列称为一条field 方法 1 使用QSqlRecord类 QSqlRec
  • Python中的pass语句详解

    作者 永劫 一 概述 在本文中 我们将详细介绍Python中的pass语句 包括其定义 作用以及使用场景 pass语句在Python编程中是一个实用的占位符 它可以让程序运行在某些特定的情况下 而不引发任何错误 二 pass语句的定义 pa
  • scrapy框架之post请求

    scrapy框架之post请求 1 post请求 2 通过scrapy框架用爬虫发起post请求 3 使用Scrapy框架破解验证码 1 post请求 首先从浏览器打开百度翻译 去抓一下接口 右键检查 一开始是network是什么都没有的