IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Python基础之Scrapy进阶 -> 正文阅读

[Python知识库]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.html

import scrapy


class StockstarItem(scrapy.Item):
    """
    定义需要爬取的字段名称
    """
    # define the fields for your item here like:
    # name = scrapy.Field()
    stock_type = scrapy.Field()  # 股票类型
    stock_id = scrapy.Field()  # 股票ID
    stock_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 = 1

    def parse(self, response):
        item = StockstarItem()
        text = response.text
        text = 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 / 20
        if total % 20 > 0:
            total_page += 1  # 如果求模大于0,则也码加1
        for 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 += 1
        print('总页码:' + 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 item

    def 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知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-08-29 09:02:32  更:2021-08-29 09:04:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 12:29:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码