【pyspider】爬取ajax请求数据(post),如何处理python2字典的unicode编码字段?

news/2024/7/19 9:53:15 标签: ajax, javascript, 爬虫, pyspider, python爬虫

情景:传统的爬虫只需要设置fetch_type=js即可,因为可以获取到整个页面。但是现在ajax应用越来越广泛,所以有的网页不能用此种爬虫类型来获取页面的数据,只能用slef.crawl()来发起http请求来抓取数据。

直接上例子:
可以看到,该网页的每一页的数据是通过ajax请求获取到的,方式为POST,所以不能用传统方法。
在这里插入图片描述

可以看到该请求的请求体,我们需要把请求体和请求方法写到crawl函数的参数里。
在这里插入图片描述

直接上代码:

# coding: utf-8
from pyspider.libs.base_handler import *

class Handler(BaseHandler):
    @every(minutes=10)
    def on_start(self):
        data = {
            'channelid': 229105,
            'sortfield': '-docorderpri,-docreltime',
            'classsql': 'chnlid=40078',
            'classcol': 'publishyear',
            'classnum': 100,
            'classsort': 0,
            'cache': 'true',
            'page': 1,
            'prepage': 75,
    }
        save = {
            'req_body':data
        }
        # method指定POST,data指定请求体,save保存一些自定义字段。
        self.crawl('http://yjt.fujian.gov.cn/fjdzapp/search', callback=self.index_page, method="POST", data=data, save=save)

	# 抓取请求的响应数据后会调用此接口
    @config(age=10*60)
    def index_page(self, response):
        print(response.save['req_body']) # 查看请求体
        print(response.json) # 获取所抓到的数据
        return response.json
        
    def on_result(self, result):
        # 处理结果 ...

请求体和响应如下:
在这里插入图片描述

需要注意的地方

可以看到,字典的字段都是u'...',这表明是Unicode编码,所以想要获取字典中的字段,需要做下面的处理:

response字典中有个recordCount的key,我想获取他的值,需要将其先按照utf-8的编码方式解码为Unicode(python2默认Unicode编码,但是我们的脚本是utf-8的编码方式),这样就可以获取到字典的值啦

	recordCount = response.json.get('recordCount'.decode('utf-8'))

http://www.niftyadmin.cn/n/5153721.html

相关文章

10 DETR 论文精读【论文精读】End-to-End Object Detection with Transformers

DETR 这篇论文,大家为什么喜欢它?为什么大家说它是一个目标检测里的里程碑式的工作?而且为什么说它是一个全新的架构? 大家好,今天我们来讲一篇 ECC V20 的关于目标检测的论文。它的名字想必大家都不陌生,也…

嵌入式中如何把C++代码改写成C语言代码

由于C++解释器比C语言解释器占用的存储空间要大500k左右。为了节省有限的存储空间、降低成本,同时也为了提高效率,将用C++语言写的源程序用C语言改写是很有必要的。 C++与C最大的区…

二维空间与三维空间的姿态表示法

二维空间与三维空间的姿态表示法 一、2D空间姿态表示法二、3D空间姿态表示法2.1 三个数表示空间姿态问题 2.2 九个数表示空间姿态问题 2.3 四个数表示空间姿态 结语Reference 假设,你有志成为我空军某航空旅歼-20飞行员,但要想开好飞机,那就得…

Zinx框架-游戏服务器开发002:框架学习-按照三层结构模式重构测试代码+Tcp数据适配+时间轮定时器

文章目录 1 Zinx框架总览2 三层模式的分析3 三层重构原有的功能 - 头文件3.1 通道层Stdin和Stdout类3.1.2 StdInChannel3.1.2 StdOutChannel 3.2 协议层CmdCheck和CmdMsg类3.2.1 CmdCheck单例模式3.2.1.1 单例模式3.2.1.2 * 命令识别类向业务层不同类别做分发 3.2.2 CmdMsg自定…

【唠唠嵌入式】__嵌入式只是一个技术领域,不是一个行业!

目录 前言 阶段1 大一到大三这个阶段我与大多数学生相同: 关于如何学习嵌入式软件开发: ① 学习51单片机 ② 开始查资料看书 ③ 开始学习STM32 ④ 开始增强 C 语言 ⑤ 认真研读 OS 方面的书 ⑥ 自己仿照 ucos 写一个 stm32 上的实时 os 出来 …

鼠标加速不一定都是好事,有时是适得其反,如在游戏当中

如果你玩游戏,你会想在Mac上禁用鼠标加速。这是因为虽然鼠标加速可能很好,但它可能会导致鼠标光标速度不一致,这在游戏中并不理想。 简单地说,如果macOS检测到你正在以特定的速度或强度移动鼠标,鼠标指针加速会提高光…

路由过滤路由引入

目录 一、实验拓扑 二、实验需求 三、实验步骤 1、配置IP地址 2、配置RIP和OSPF 3、配置路由引入 4、使用路由过滤,使 R4 无法学到 R1 的业务网段路由,要求使用 prefix-list 进行匹配 5、OSPF 区域中不能出现 RIP 协议报文 一、实验拓扑 二、实…

【Qt5】QNetworkAccessManager

2023年11月5,周日晚上 QNetworkAccessManager是Qt Network模块中的一个类,用于发送网络请求和接收网络响应。它提供了一种方便的方式来进行网络通信,支持常见的网络协议,如HTTP、HTTPS、FTP等。 QNetworkAccessManager和QNetwork…