当前位置: 首页 > news >正文

【Python_Scrapy学习笔记(十二)】基于Scrapy框架实现POST请求爬虫

基于Scrapy框架实现POST请求爬虫

前言

本文中介绍 如何基于 Scrapy 框架实现 POST 请求爬虫,并以抓取指定城市的 KFC 门店信息为例进行展示

正文

1、Scrapy框架处理POST请求方法

Scrapy框架 提供了 FormRequest() 方法来发送 POST 请求;
FormRequest() 方法 相比于 Request() 方法多了 formdata 参数,接受包含表单数据的字典或者可迭代的元组,并将其转化为请求的 body。
POST请求:yield scrapy.FormRequest(url=post_url,formdata={},meta={},callback=...)
注意:使用 FormRequest() 方法发送 POST 请求一定要重写 start_requests() 方法

2、Scrapy框架处理POST请求案例

  1. 项目需求:抓取指定城市的 KFC 门店信息。终端提示,请输入城市:xx ,将所有 xx 市的 KFC 门店数据抓取下来。

  2. 所需数据:门店编号、门店名称、门店地址、所属城市、所属省份

  3. url 地址:http://www.kfc.com.cn/kfccda/storelist/index.aspx

  4. POST请求url地址:http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname
    在这里插入图片描述

  5. F12抓包分析:找到需要爬取的数据,获取门店信息,获取门店总数在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  6. 获取form表单:获取 form 表单数据在这里插入图片描述

  7. 创建Scrapy项目:编写items.py文件

    import scrapyclass KfcspiderItem(scrapy.Item):# 门店编号rownum = scrapy.Field()# 门店名称storeName = scrapy.Field()# 门店地址addressDetail = scrapy.Field()# 所属城市cityName = scrapy.Field()# 所属省份provinceName = scrapy.Field()
    
  8. 编写爬虫文件

    import scrapy
    import json
    from ..items import KfcspiderItemclass KfcSpider(scrapy.Spider):name = "kfc"allowed_domains = ["www.kfc.com.cn"]post_url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname'city_name = input("请输入城市名称:")# start_urls = ["http://www.kfc.com.cn/"]def start_requests(self):"""重写start_requests()方法,获取某个城市的KFC门店总数量:return:"""formdata = {"cname": self.city_name,"pid": "","pageIndex": '1',"pageSize": '10'}yield scrapy.FormRequest(url=self.post_url, formdata=formdata, callback=self.get_total,dont_filter=True)def parse(self, response):"""解析提取具体的门店数据:param response::return:"""html=json.loads(response.text)for  one_shop_dict in html["Table1"]:item=KfcspiderItem()item["rownum"]=one_shop_dict['rownum']item["storeName"]=one_shop_dict['storeName']item["addressDetail"]=one_shop_dict['addressDetail']item["cityName"]=one_shop_dict['cityName']item["provinceName"]=one_shop_dict['provinceName']#一个完整的门店数据提取完成,交给数据管道yield itemdef get_total(self, response):"""获取总页数,并交给调度器入队列:param response::return:"""html = json.loads(response.text)count = html['Table'][0]['rowcount']total_page = count // 10 if count % 10 == 0 else count // 10 + 1# 将所有页的url地址交给调度器入队列for page in range(1, total_page + 1):formdata = {"cname": self.city_name,"pid": "","pageIndex": str(page),"pageSize": '10'}# 交给调度器入队列yield scrapy.FormRequest(url=self.post_url, formdata=formdata, callback=self.parse)
  9. 编写设置文件:

    BOT_NAME = "KFCSpider"SPIDER_MODULES = ["KFCSpider.spiders"]
    NEWSPIDER_MODULE = "KFCSpider.spiders"# Obey robots.txt rules
    ROBOTSTXT_OBEY = False# See https://docs.scrapy.org/en/latest/topics/settings.html#download-delay
    # See also autothrottle settings and docs
    DOWNLOAD_DELAY = 1# Override the default request headers:
    DEFAULT_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 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko)"
    }# 设置日志级别:DEBUG < INFO < WARNING < ERROR < CARITICAL
    LOG_LEVEL = 'INFO'
    # 保存日志文件
    LOG_FILE = 'KFC.log'# Configure item pipelines
    # See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
    ITEM_PIPELINES = {"KFCSpider.pipelines.KfcspiderPipeline": 300,
    }# Set settings whose default value is deprecated to a future-proof value
    REQUEST_FINGERPRINTER_IMPLEMENTATION = "2.7"
    TWISTED_REACTOR = "twisted.internet.asyncioreactor.AsyncioSelectorReactor"
    FEED_EXPORT_ENCODING = "utf-8"
  10. 在管道文件中直接打印 item

  11. 创建run.py文件运行爬虫:

    from scrapy import cmdline
    cmdline.execute("scrapy crawl kfc".split())
    
  12. 运行效果
    在这里插入图片描述

相关文章:

【Python_Scrapy学习笔记(十二)】基于Scrapy框架实现POST请求爬虫

基于Scrapy框架实现POST请求爬虫 前言 本文中介绍 如何基于 Scrapy 框架实现 POST 请求爬虫&#xff0c;并以抓取指定城市的 KFC 门店信息为例进行展示 正文 1、Scrapy框架处理POST请求方法 Scrapy框架 提供了 FormRequest() 方法来发送 POST 请求&#xff1b; FormReques…...

《花雕学AI》02:人工智能挺麻利,十分钟就为我写了一篇长长的故事

ChatGPT最近火爆全网&#xff0c;上线短短两个多月&#xff0c;活跃用户就过亿了&#xff0c;刷新了历史最火应用记录&#xff0c;网上几乎每天也都是ChatGPT各种消息。国内用户由于无法直接访问ChatGPT&#xff0c;所以大部分用户都无缘体验。不过呢&#xff0c;前段时间微软正…...

做程序员累了想要转行?我想给大家分享一下看法

今天早上起床时&#xff0c;我看到有粉丝评论说关于程序员的话题&#xff0c;如果做着觉得累了&#xff0c;就会觉得自己不适合这个工作&#xff0c;想转行。我想给大家分享一下我的看法。 在我刚开始工作时&#xff0c;有人说我不适合做这个工作&#xff0c;但是我坚持了下来…...

如果你想从事人工智能职业,学习Python吧

人工智能并不会抢走你的工作&#xff0c;至少目前还不会。人工智能和机器学习&#xff08;AI/ML&#xff09;最好的应用是补充人类的创造力&#xff0c;而不是取代它。具有讽刺意味的是&#xff0c;最好的大型语言模型&#xff08;LLMs&#xff09;可能是通过使用受版权保护的人…...

百模大战,谁是下一个ChatGPT?

“不敢下手&#xff0c;现在中国还没跑出来一家绝对有优势的大模型&#xff0c;上层应用没法投&#xff0c;担心押错宝。”投资人Jucy&#xff08;化名&#xff09;向光锥智能表示&#xff0c;AI项目看得多、投的少是这段时间的VC常态。 ChatGPT点燃AI大爆炸2个月中&#xff0…...

Revit中怎么绘制多面坡度的屋顶及生成墙

​一、Revit中怎么绘制多面坡度的屋顶 像这种坡屋顶我们可以观察到&#xff0c;它的屋顶轮廓都是带有坡度的&#xff0c;那我可以通过添加定义坡度的方式来绘制出该屋顶。 点击建筑选项卡中的屋顶按钮&#xff0c;选择迹线屋顶。 选择使用拾取线工具&#xff0c;在选项栏中将偏…...

【jvm系列-07】深入理解执行引擎,解释器、JIT即时编译器

JVM系列整体栏目 内容链接地址【一】初识虚拟机与java虚拟机https://blog.csdn.net/zhenghuishengq/article/details/129544460【二】jvm的类加载子系统以及jclasslib的基本使用https://blog.csdn.net/zhenghuishengq/article/details/129610963【三】运行时私有区域之虚拟机栈…...

【GCU体验】基于PaddlePaddle + GCU跑通模型并测试GCU性能

一、环境 地址&#xff1a;启智社区:https://openi.pcl.ac.cn/ 二、计算卡介绍 云燧T20是基于邃思2.0芯片打造的面向数据中心的第二代人工智能训练加速卡&#xff0c;具有模型覆盖面广、性能强、软件生态开放等特点&#xff0c;可支持多种人工智能训练场景。同时具备灵活的可…...

解析hash(散列)数据结构

前言 在学习完map、set这两个由红黑树构成的容器后&#xff0c;我们来到了这里hash&#xff0c;首先我们要有一个基础的认知——哈希和map与set的仅在使用时的差别区别&#xff1a;前者内部的元素没有序&#xff0c;而后者有序&#xff0c;其它的都相同&#xff0c;这里我们可…...

《2023金融科技·校园招聘白皮书》新鲜出炉|牛客独家

数智创新时代&#xff0c;科技人才为先。 眼下&#xff0c;在建设“数字中国”的时代背景下&#xff0c;金融行业全面数智化转型已箭在弦上。政策端&#xff0c;金融行业为中共中央、国务院印发《数字中国建设整体布局规划》的7大重点行业之一。 资本端&#xff0c;仅2022年三…...

文明的标志:书写系统、修建城市、使用金属器

文章目录 引言I 预备知识1.1 文明”和“文化”概念1.2 文明的标志1.3 应对水患II 定居开启了人类文明2.1 书写系统2.2 陶器2.3 家畜引言 一切和开启文明相关的技术都是围绕着两根主线展开: 多获取能量,以便于生存,信息能够管理起酋邦,总结、记录并传授经验。I 预备知识 1.…...

算法:将一个数组旋转k步

题目 输入一个数组如 [1,2,3,4,5,6,7]&#xff0c;输出旋转 k 步后的数组。 旋转 1 步&#xff1a;就是把尾部的 7 放在数组头部前面&#xff0c;也就是 [7,1,2,3,4,5,6]旋转 2 步&#xff1a;就是把尾部的 6 放在数组头部前面&#xff0c;也就是 [6,7,1,2,3,4,5]… 思路 思…...

使用大华惠智双目半球网络摄像机DH-IPC-HD4140X-E2获取人流量统计数据

记录一下使用Java的SpringBoot大华SDK在智慧公厕项目中使大华惠智双目半球网络摄像机DH-IPC-HD4140X-E2获取人流量统计数据 首先根据说明书登录摄像头&#xff0c;一般摄像头都有自己的账号和密码(可能是admin admin 也可能是admin 888888 还有可能是admin 12345)&#xff0c;…...

DC插装式流量阀压力阀

Cartridge Valves 电磁阀 止回阀 运动控制阀 流量控制阀 溢流阀 压力控制阀 顺序阀 梭阀 方向阀 配件 Zero Profile Valves 止回阀 运动控制阀 流量控制阀 溢流阀 梭阀 In-Line Valves 止回阀和梭阀 方向阀 配件 微型系列 AB20S APIDC-30S C10B C10S C10S…...

NumPy 数组学习手册:6~7

原文&#xff1a;Learning NumPy Array 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 六、性能分析&#xff0c;调试和测试 分析&#xff0c;调试和测试是开发过程的组成部分。 您可能熟悉单元测试的概念。 单元测试是程序员编写的用于测试其代码的自动测试。 例如&…...

【笔试强训选择题】Day6.习题(错题)解析

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、Day6习题&#xff08;错题&#xff09;解析 二、Day6习题&#xff08;原题&#xff09;练习 总结 前言 一、Day6习题&#xff08;错题&#xff09;解析…...

磁盘分区-LINUX

1、主分区&#xff08;primary&#xff09; 磁盘在Linux当中的命名&#xff1a; IDE /dev/hda hdb SCSI sda sdb 分区数字表示&#xff1a;sda1 、sda2、sda3 磁盘分区相当于给磁盘打隔断 ① 系统中必须要存在的分区&#xff0c;系统盘选择主分区安装 ② 数字编号只能是1-4&am…...

SpringAOP入门基础银行转账实例(进阶版)------------事务处理

SpringAOP入门基础银行转账实例**&#xff08;进阶版&#xff09;**------------事务处理 由上一节讲述的通过Connection和QueryRunner对事务进行的处理(详情可以去我之前写的博客文章&#xff1a;https://blog.csdn.net/m0_56245143/article/details/130069160?spm1001.2014…...

【python学习】基础篇-常用函数-format函数 格式化操作

format()可以对数据进行格式化处理操作&#xff0c;语法如下: format(value&#xff0c;format_spec) value 为要转换的数据&#xff0c;fommat spec 为格式化解释&#xff0c; 当参数 format spec 为空时&#xff0c;等同于函数 str(value)的方式。 format spec 可以设置非常复…...

团团面试经验

1、Redis同时访问大量不存在的key会发生什么&#xff1f; 如果是缓存和数据库中都不存在&#xff0c;那么就会发生缓存穿透。 举个例子&#xff1a;某个黑客故意制造一些非法的 key 发起大量请求&#xff0c;导致大量请求落到数据库&#xff0c;结果数据库上也没有查到对应的数…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...