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

爬虫【Scrapy框架的概念与执行流程】

Scrapy框架的概念与执行流程

简介

学习Scrapy的原因

1、Scrapy不能解决剩下的10%的爬虫需求
2、能够让开发过程方便、快速
3、Scrapy框架能够让我们的爬虫效率更高

什么是Scrapy

文档地址:

中文:https://www.osgeo.cn/scrapy/
英文:https://docs.scrapy.org/en/latest/

Scrapy使用了Twisted['twistid']异步网络框架、可以加快我们的下载速度
Scrapy是一个为了爬虫网站数据,提取结构性数据而编写的应用框架,我们只需要实现少量的代码,就能够快速的抓取

异步与非阻塞的区别

使用Scrapy

scrapy startproject my_spider

scrapy genspider baidu baidu.com

运行Scrapy脚本,要在根目录下
scrapy crawl baidu

案例 - 抓取蜻蜓FM

scrapy startproject fm
cd fm
scrapy genspider qingting https://m.qingting.fm/rank/
cd fm # 切换到有spiders的目录
scrapy crawl qingting # 运行

通过cmdline来快速启动

from scrapy import cmdline
pass
if __name__ == '__main__':
    cmdline.execute("scrapy crawl qingting".split())

解析函数中的yield能够传递的对象只能是:BaseItemRequestdictNone

执行流程

Spiders(类) -> requests(对象) -> ScrapyEngine(引擎) -> Scheduler(队列)[ request, request, request ] -> Downloader(下载器) -> 返回给引擎 -> 提交给Spider -> 执行parse函数
SpiderMiddlewares(过滤和发送请求之前 可以运行的代码)
DownloaderMiddlewares( 下载器中间件 )
Item( 数据校验 )
Pipeline( 数据保存 )

使用scrapy进行爬虫

案例 - 蜻蜓FM

qingting.py

import scrapy
from scrapy import cmdline
from scrapy.http import HtmlResponse

class QingtingSpider(scrapy.Spider):
    name = "qingting"
    allowed_domains = ["m.qingting.fm", "pic.qtfm.cn"]
    start_urls = ["https://m.qingting.fm/rank/"]

    def parse(self, response, **kwargs):
        a_list = response.xpath('//div[@class="rank-list"]/a')
        # print(a_list)
        for a_temp in a_list:
            rank_number = a_temp.xpath('./div[@class="badge"]/text()').extract_first()
            title = a_temp.xpath('.//div[@class="title"]/text()').extract_first()
            rank_desc = a_temp.xpath('.//div[@class="desc"]/text()').extract_first()
            img_url = a_temp.xpath('./img/@src').extract_first()
            # print(rank_number, title, rank_desc, img_url)
            yield {
   
                'type' : 'info',
                'rank_number' : rank_number,
                'title' : title,
                'img_url' : img_url,
                'desc' : rank_desc
            }
            # 需要在parse函数中 重新构建一个新的request对象并对图片地址发送请求
            # 如果解析函数中存在自定义形参 则 需要cb_kwargs进行传参,key值必须和形参名相同
            yield scrapy.Request(img_url, callback=self.image_parse, cb_kwargs={
   'image_name' : title})

    # 图片解析函数
    @staticmethod
    def image_parse(response: HtmlResponse, image_name):
        yield{
   
            'type' : 'image',
            'image_name' : image_name+'.jpg',
            'image_content' : response.body,
        }


if __name__ == '__main__':
    cmdline.execute("scrapy crawl qingting".split())

pipelines.py

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
# useful for handling different item types with a single interface
from itemadapter import ItemAdapter

import os
import pymongo


class FmPipeline:
    def process_item(self, item, spider):
        # 1. 获取yield
        type = item.get('type')
        if type == 'image':
            download_url = os.getcwd() + '/download/'
            if not os.path.exists(download_url):
                os.mkdir(download_url)
            image_name = item.get('image_name')
  
http://www.dtcms.com/a/107512.html

相关文章:

  • c++中%符号使用的注意事项/易错点
  • limma差异分析
  • Scala面向对象
  • 多层内网渗透测试虚拟仿真实验环境(Tomcat、ladon64、frp、Weblogic、权限维持、SSH Server Wrapper后门)
  • 鸿蒙开发_TS快速入门_TS中模块化操作_模块的导入导出---纯血鸿蒙HarmonyOS5.0工作笔记008
  • MySQL主从复制(三)
  • 【Axure元件分享】时间范围选择器
  • 阿里云国际站代理商:模型训练中断数据丢失怎么办?
  • DAY 34 leetcode 349--哈希表.两个数组的交集
  • 【Linux网络与网络编程】04.TCP Socket编程
  • BUUCTF-web刷题篇(7)
  • 软件工程面试题(二十四)
  • 【C++重点】deque
  • linux内核漏洞检测利用exp提权
  • Echarts 地图下钻实现过程记录
  • Bootstrap 表格:高效布局与动态交互的实践指南
  • Java8 到 Java21 系列之 Lambda 表达式:函数式编程的开端(Java 8)
  • 深入剖析 Hive Fetch 抓取机制:原理、优化与实践
  • 【Axure元件分享】月份范围选择器
  • msvcr110.dll丢失的几种修复方法指南,msvcr110.dll是什么文件
  • 第四章、Isaacsim在GUI中构建机器人(2):组装一个简单的机器人
  • 10.使用路由缓存提升性能
  • DHT11数字温湿度传感器驱动开发全解析(下) | 零基础入门STM32第八十八步
  • emqx中LwM2M
  • 第七天 - re正则表达式模块 - 日志文件模式匹配 - 练习:Nginx日志分析器
  • 企业数据治理实践:“七剑” 合璧,释放数据价值
  • python string 类型字符拼接 +=的缺点,以及取代方法
  • python/pytorch杂聊
  • Nature旗下 | npj Digital Medicine | 图像+转录组+临床变量三合一,多模态AI预测化疗反应,值得复现学习的完整框架
  • 大智慧前端面试题及参考答案