在上一篇文章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进阶相关推荐

  1. python基础_面向对象进阶

    @property装饰器 之前我们讨论过Python中属性和方法访问权限的问题,虽然我们不建议将属性设置为私有的,但是如果直接将属性暴露给外界也是有问题的,比如我们没有办法检查赋给属性的值是否有效.我 ...

  2. python开发需要掌握哪些知识-Python基础进阶需要掌握哪些知识点?

    Python基础进阶需要掌握哪些知识点?Python将是每个程序员的标配,有编程基础再掌握Python语言对于日后的升职加薪更有利.Python语言简洁利于理解,语法上相对容易能够让开发者更专注于业务 ...

  3. python基础函数及用法意思_Python基础之函数基本用法与进阶详解

    本文实例讲述了Python基础之函数基本用法与进阶.分享给大家供大家参考,具体如下: 目标 函数参数和返回值的作用 函数的返回值 进阶 函数的参数 进阶 递归函数 01. 函数参数和返回值的作用 函数 ...

  4. Python基础+进阶(万字总结,基础案例+执行结果)

    Python基础篇 第一章:基础语法 输出相关: 基本输出案例 print("HelloWorld")# 执行结果: ''' HelloWorld ''' 转义字符 # 转义字符& ...

  5. 小姐姐用一周的时间,偷偷带你学Python,从小白到进阶,全站式保姆的Python基础教程导航帖(已完结)

    第一部分.基础知识目录 小姐姐带你们偷偷的学Python,然后你们要惊呆所有人(第一天) 小姐姐带你们偷偷的学Python,然后你们要惊呆所有人(第二天) 小姐姐带你们偷偷的学Python,然后你们要 ...

  6. python基础练习题:简单有趣#32:创建字谜【难度:1级】--景越Python编程实例训练营,不同难度Python习题,适合自学Python的新手进阶

    python基础练习题:简单有趣#32:创建字谜[难度:1级]: 任务 现在给你两个字符串S和长度相同的T,由大写英文字母.你的任务是找到获得一些anagram的串T从字符串s需要"更换操作 ...

  7. python教程07-while语句的基本使用、for...in循环的使用、break与continue、打印矩形三角形九九乘法表、基础题、进阶题

    python教程_小白入门/2020/7/20 行百里者半九十,你可一定要坚持下去啊 前几天家里有事更新给耽误了,后续会稳定更新的,一起加油! 学习目标 文章目录 python教程_小白入门/2020 ...

  8. python基础练习题:Covfefe【难度:1级】--景越Python编程实例训练营,不同难度Python习题,适合自学Python的新手进阶

    python基础练习题:Covfefe[难度:1级]: Covfefe 你给出的字符串.你必须用'covfefe但替换的单词(S)coverage,如果你没有找到字符串中的单词'coverage,你必 ...

  9. Python基础练习题:杂乱无章的页面列表【难度:1级】--景越Python编程实例训练营,不同难度Python习题,适合自学Python的新手进阶

    Python基础练习题:杂乱无章的页面列表[难度:1级]: 你得到了一本古老的书,不幸的是有几页错误的位置,幸运的是你的计算机有一个从"1"到"n"的顺序的每个 ...

最新文章

  1. hdu 1251+hdu 1671(字典树)
  2. Apple Pay,呸!
  3. AndroidService 深度分析(2)
  4. 计算机网络聚合怎么设置,交换机的端口聚合如何配置
  5. 7-227 寻找大富翁 (25 分)
  6. SQL Server的代码生成器
  7. ltp-ddt的makefile结构
  8. EF中执行Sql语句
  9. TCP数据的传输过程
  10. java编译软件 Eclipse 的安装与使用
  11. FPGA作业1:利用74161设计20进制计数器
  12. 阿里云 php shopex,开shopex
  13. hdu 5145 NPY and girls 莫队
  14. Win10激活(家庭版升级到专业版)带你5分钟解决
  15. Wing IDE安装与破解方法
  16. 用计算机华为隐藏空间,真香,华为手机开启隐私空间双系统,一部手机当两部用...
  17. 哇!协议和算法竟然不是一回事!千万别再说错了!
  18. 移远4G模块通信模块使用
  19. Eclipse 断点不生效原因之一 Tigger Point 断点右下角出现类似箭头
  20. 前端数据库indexedDB入门

热门文章

  1. 20051031: 换了一台显示器
  2. Unity Animator BlendTree
  3. ABAP推送企业微信机器人1-文本类型<转载>
  4. CVPR 2021 Tutorial 可解释性机器学习汇总!视频 + PDF附下载
  5. 服务器(Dell T360+2块Tesla P100)配置显卡驱动和cuda最终版(终于配置好了)
  6. 【概率论】6-2:大数定理(The Law of Large Numbers)
  7. 无尘车间净化装修方案
  8. npmjs 注册上传代码流程
  9. 为什么越来越多人觉得“元宇宙”是个骗局?
  10. 百度小程序开发的基础