Python基础之Scrapy进阶
在上一篇文章Python基础之Scrapy简介中,简述了Scrapy的基本原理,安装步骤,创建项目以及如何通过Scrapy进行简单的爬虫,同时遗留了两个问题,即分页爬取,和异步内容爬取。本文以一个简单的爬取某股票网站为例,简述Scrapy在分页和接口数据爬取的相关应用,仅供学习分享使用,如有不足之处,还请指正。
Scrapy架构图
关于Scrapy架构图,如下所示: 绿线是数据流向
关于Scrapy架构各项说明,如下所示:
- Scrapy Engine(引擎): 负责 Spider、ItemPipeline、Downloader、Scheduler 中间的通讯, 信号、数据传递等。
- Scheduler(调度器): 它负责接受引擎发送过来的 Request 请求,并按照一定的方式进行 整理排列,入队,当引擎需要时,交还给引擎。
- Downloader(下载器):负责下载 Scrapy Engine(引擎)发送的所有 Requests 请求,并将 其获取到的 Responses 交还给 Scrapy Engine(引擎),由引擎交给 Spider 来处理,
- Spider(爬虫):它负责处理所有 Responses,从中分析提取数据,获取 Item 字段需要的 数据,并将需要跟进的 URL 提交给引擎,再次进入 Scheduler(调度器),
- Item Pipeline(管道):它负责处理 Spider 中获取到的 Item,并进行进行后期处理(详细 分析、过滤、存储等)的地方。
- Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能 的组件。
- Spider Middlewares(Spider 中间件):你可以理解为是一个可以自定扩展和操作引擎和 Spider 中间通信的功能组件(比如进入 Spider 的 Responses;和从 Spider 出去的 Requests)
目标分析
本次爬取的是某财富网站的沪深A股,共232页,如下所示:
在Chrome浏览器,通过开发者工具(F12),进行分析,发现我们需要爬取的内容,均在id为table_wraper_table中,如下所示:
通过以上分析,似乎已经胜利在望,但通过查询源代码,发现网址请求到的页面中,table是空的,并没有我们想要的股票数据内容,如下所示:
通过以上步骤的排查,说明所见即所得,有时也不一定通用。既然页面不是一次请求获取的,那么就可能是通过ajax的方式异步获取的,需要进一步排查Network,即网络请求信息。继续排查跟踪网络请求信息,发现股票信息是通过以下接口获取的,返回的是json格式的字符串,我们获取对应内容后,只需要解析json即可获取相应的数据,如下所示:
通过分析接口请求的url,发现对应的页码和每页请求条数,即可以变化的量,对于多页,则轮询并替换即可,如下所示:
创建爬虫
在之前stockstar项目的基础上,再次创建一个爬虫,如下所示:
Scrapy爬虫开发
通过命令行创建项目后,基本Scrapy爬虫框架已经形成,剩下的就是业务代码填充。
定义爬取内容
定义需要爬取哪些字段内容,如下所示:
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.htmlimport scrapyclass StockstarItem(scrapy.Item):"""定义需要爬取的字段名称"""# define the fields for your item here like:# name = scrapy.Field()stock_type = scrapy.Field() # 股票类型stock_id = scrapy.Field() # 股票IDstock_name = scrapy.Field() # 股票名称stock_price = scrapy.Field() # 股票价格stock_chg = scrapy.Field() # 涨跌幅
定制业务逻辑
Scrapy的爬虫结构是固定的,定义一个类,继承自scrapy.Spider,类中定义属性【爬虫名称,域名,起始url】,重写父类方法【parse】,根据需要爬取的页面逻辑不同,在parse中定制不同的爬虫代码,如下所示:
class EastmoneySpider(scrapy.Spider):name = 'eastmoney'allowed_domains = ['eastmoney.com/']start_urls = ['http://**.****.********.com/api/qt/clist/get?cb=jQuery112405581218321729968_1630076590847&pn=1&pz=20&po=1&np=1&fields=f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f136,f115,f152&_=1630076590848']index = 1def parse(self, response):item = StockstarItem()text = response.texttext = text[text.find('(') + 1:] # 去掉小括号前面的text = text[0:-2] # 去掉小括号后面的# print(text) # 此处用于打印处理好的原始字符obj = json.loads(text)print('********************本次抓取第' + str(self.index) + '页股票********************')data = obj['data']total = data['total']diffs = data['diff']total_page = total / 20if total % 20 > 0:total_page += 1 # 如果求模大于0,则也码加1for diff in diffs:item['stock_type'] = '沪深A股'item['stock_id'] = str(diff['f12'])item['stock_name'] = str(diff['f14'])item['stock_price'] = str(diff['f2'])item['stock_chg'] = str(diff['f3']) + '%'yield item# 当第一页解析完,进行下一页解析self.index += 1print('总页码:' + str(total_page))if self.index <= total_page:next_page = 'http://**.****.******.com/api/qt/clist/get?cb=jQuery112405581218321729968_1630076590847&pn=' + str(self.index) + '&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fields=f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f11,f62,f128,f136,f115,f152&_=1630076590848'yield scrapy.Request(next_page, callback=self.parse,dont_filter=True)else:print('当前是最后一页')
注意:为了不泄露目标网站,爬取地址做了模糊处理
数据处理
在Pipeline中,对抓取的数据进行处理,本例为简便,在控制进行输出,如下所示:
class StockstarPipeline:def process_item(self, item, spider):str_item = '股票类型:'+item['stock_type']+' 股票代码:'+item['stock_id']+' 股票名称:'+item['stock_name']+' 股票价格:'+item['stock_price']+' 股票涨跌幅:'+item['stock_chg']print(str_item) # 打印self.save_data(str_item) # 保存return itemdef save_data(self,str_item):"""保存数据:param str_item: 保存的内容文件:return:"""with open('stocks.txt', 'a', encoding='utf-8') as f:f.write(str_item+'\n')
注意:在对item进行赋值时,只能通过item['key']=value的方式进行赋值,不可以通过item.key=value的方式赋值。
Scrapy运行
因scrapy是各个独立的页面,只能通过终端命令行的方式运行,格式为:scrapy crawl 爬虫名称,如下所示:
scrapy crawl eastmoney
结果展示
本文爬取的内容,存储在文本文件中,可以用于后续的进一步分析,如下所示:
备注
以上就是Scrapy爬取异步内容,及多页爬取的简单介绍,希望能够抛转引玉,共同学习。
夏日南亭怀辛大
【作者】孟浩然 【朝代】唐
山光忽西落,池月渐东上。
散发乘夕凉,开轩卧闲敞。
荷风送香气,竹露滴清响。
欲取鸣琴弹,恨无知音赏。
感此怀故人,中宵劳梦想。
Python基础之Scrapy进阶相关推荐
- python基础_面向对象进阶
@property装饰器 之前我们讨论过Python中属性和方法访问权限的问题,虽然我们不建议将属性设置为私有的,但是如果直接将属性暴露给外界也是有问题的,比如我们没有办法检查赋给属性的值是否有效.我 ...
- python开发需要掌握哪些知识-Python基础进阶需要掌握哪些知识点?
Python基础进阶需要掌握哪些知识点?Python将是每个程序员的标配,有编程基础再掌握Python语言对于日后的升职加薪更有利.Python语言简洁利于理解,语法上相对容易能够让开发者更专注于业务 ...
- python基础函数及用法意思_Python基础之函数基本用法与进阶详解
本文实例讲述了Python基础之函数基本用法与进阶.分享给大家供大家参考,具体如下: 目标 函数参数和返回值的作用 函数的返回值 进阶 函数的参数 进阶 递归函数 01. 函数参数和返回值的作用 函数 ...
- Python基础+进阶(万字总结,基础案例+执行结果)
Python基础篇 第一章:基础语法 输出相关: 基本输出案例 print("HelloWorld")# 执行结果: ''' HelloWorld ''' 转义字符 # 转义字符& ...
- 小姐姐用一周的时间,偷偷带你学Python,从小白到进阶,全站式保姆的Python基础教程导航帖(已完结)
第一部分.基础知识目录 小姐姐带你们偷偷的学Python,然后你们要惊呆所有人(第一天) 小姐姐带你们偷偷的学Python,然后你们要惊呆所有人(第二天) 小姐姐带你们偷偷的学Python,然后你们要 ...
- python基础练习题:简单有趣#32:创建字谜【难度:1级】--景越Python编程实例训练营,不同难度Python习题,适合自学Python的新手进阶
python基础练习题:简单有趣#32:创建字谜[难度:1级]: 任务 现在给你两个字符串S和长度相同的T,由大写英文字母.你的任务是找到获得一些anagram的串T从字符串s需要"更换操作 ...
- python教程07-while语句的基本使用、for...in循环的使用、break与continue、打印矩形三角形九九乘法表、基础题、进阶题
python教程_小白入门/2020/7/20 行百里者半九十,你可一定要坚持下去啊 前几天家里有事更新给耽误了,后续会稳定更新的,一起加油! 学习目标 文章目录 python教程_小白入门/2020 ...
- python基础练习题:Covfefe【难度:1级】--景越Python编程实例训练营,不同难度Python习题,适合自学Python的新手进阶
python基础练习题:Covfefe[难度:1级]: Covfefe 你给出的字符串.你必须用'covfefe但替换的单词(S)coverage,如果你没有找到字符串中的单词'coverage,你必 ...
- Python基础练习题:杂乱无章的页面列表【难度:1级】--景越Python编程实例训练营,不同难度Python习题,适合自学Python的新手进阶
Python基础练习题:杂乱无章的页面列表[难度:1级]: 你得到了一本古老的书,不幸的是有几页错误的位置,幸运的是你的计算机有一个从"1"到"n"的顺序的每个 ...
最新文章
- hdu 1251+hdu 1671(字典树)
- Apple Pay,呸!
- AndroidService 深度分析(2)
- 计算机网络聚合怎么设置,交换机的端口聚合如何配置
- 7-227 寻找大富翁 (25 分)
- SQL Server的代码生成器
- ltp-ddt的makefile结构
- EF中执行Sql语句
- TCP数据的传输过程
- java编译软件 Eclipse 的安装与使用
- FPGA作业1:利用74161设计20进制计数器
- 阿里云 php shopex,开shopex
- hdu 5145 NPY and girls 莫队
- Win10激活(家庭版升级到专业版)带你5分钟解决
- Wing IDE安装与破解方法
- 用计算机华为隐藏空间,真香,华为手机开启隐私空间双系统,一部手机当两部用...
- 哇!协议和算法竟然不是一回事!千万别再说错了!
- 移远4G模块通信模块使用
- Eclipse 断点不生效原因之一 Tigger Point 断点右下角出现类似箭头
- 前端数据库indexedDB入门
热门文章
- 20051031: 换了一台显示器
- Unity Animator BlendTree
- ABAP推送企业微信机器人1-文本类型<转载>
- CVPR 2021 Tutorial 可解释性机器学习汇总!视频 + PDF附下载
- 服务器(Dell T360+2块Tesla P100)配置显卡驱动和cuda最终版(终于配置好了)
- 【概率论】6-2:大数定理(The Law of Large Numbers)
- 无尘车间净化装修方案
- npmjs 注册上传代码流程
- 为什么越来越多人觉得“元宇宙”是个骗局?
- 百度小程序开发的基础