【Python_Scrapy学习笔记(六)】Scrapy框架基本使用流程

news2024/11/25 7:10:25

Scrapy框架基本使用流程

前言

本文中介绍 Scrapy 框架的基本使用流程,并以抓取汽车之家二手车数据为例进行讲解。

正文

1、Scrapy框架基本使用流程

  1. 创建爬虫项目:scrapy startprojecct 项目名

  2. cd到项目文件夹:cd 项目名

  3. 创建爬虫文件:scrapy genspider 爬虫文件名 浏览器地址栏中的域名

  4. 定义抓取的数据结构:编写 items.py 文件

       import scrapy
       class 项目名item(scrapy.Item):
            scrapy.Field()
            price = scrapy.Field()
            link = scrapy.Field()
            ... ...
    
  5. 爬虫文件解析提取数据:编写 爬虫文件名.py 文件

    import scrapy
       from ..items import 项目名item
       
       class 类名Spider(scrapy.Spider):
            name = "爬虫文件名" # 爬虫名
            allowed_domains = ["浏览器地址栏中的域名"] # 允许爬取的域名:在创建爬虫文件的时候指定的域名
            start_urls = [""]  # 第一页的url地址
            
            def parse(self, response):
                解析提取数据
                item=项目名item()
                item["name"]=xxx
                # 数据交给管道文件处理的方法
                yield item
                # 需要进行跟进的url地址,如何交给调度器入队列
                yield scrapy.Request(url=url, callback=self.parse)
    
  6. 管道文件处理爬虫文件提取的数据:编写 pipelines.py 文件

    class 项目名spiderPipeline:
            def process_item(self, item, spider):
                # 具体处理数据的代码
                return item    
    
  7. 全局配置:编写 settings.py 文件

       ROBOTSTXT_OBEY = False # robots协议
       CONCURRENT_REQUESTS = 32 # 最大并发数
       DOWNLOAD_DELAY = 1 # 下载延迟时间
       COOKIES_ENABLED = False # Cookies检查
       DEFAULT_REQUEST_HEADERS = {
        "Cookie": "",
        "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko)"
        }  # 请求头
        ITEM_PIPELINES = {
        # 项目目录名.模块名.类名:优先级(1-1000不等)
        }  # 开启管道       
    
  8. 运行爬虫:run.py
    在项目文件夹下创建: run.py 文件并运行

       from scrapy import cmdline
       cmdline.execute('scrapy crawl 爬虫文件名'.split())
    

2、scrapy框架项目启动方式

  1. 基于start_urls启动:从爬虫文件的start_urls变量中遍历url地址,交给调度器入队列,把下载器返回的响应对象交给爬虫文件的parse()函数处理

  2. 重写start_requests()方法:去掉start_urls变量

       def start_requests(self):
            生成要爬取的url地址
            利用scrapy.Requst()交给调度器
    

3、基于Scrapy框架实现汽车之家二手车数据抓取

  1. 项目需求:抓取汽车名称、价格、链接
    在这里插入图片描述

  2. url地址规律:

    https://www.che168.com/china/a0_0msdgscncgpi1ltocsp1exx0/
    https://www.che168.com/china/a0_0msdgscncgpi1ltocsp2exx0/
    https://www.che168.com/china/a0_0msdgscncgpi1ltocsp3exx0/
    https://www.che168.com/china/a0_0msdgscncgpi1ltocsp4exx0/
    ...
    https://www.che168.com/china/a0_0msdgscncgpi1ltocsp{}exx0/
    
  3. 创建项目和爬虫文件:

    scrapy startproject CarSpider # 创建项目
    cd CarSpider # 进入项目目录
    scrapy genspider car www.che168.com # 创建爬虫文件
    
  4. item.py:定义要抓取的数据结构,定义的方式是抓取什么数据,就写什么字段

    import scrapy
    
    
    class CarspiderItem(scrapy.Item):
        # define the fields for your item here like:
        # name = scrapy.Field()
        # 汽车的名称、价格、和详情页链接,相当于定义了一个字典,只赋值了key,未赋值value
        name = scrapy.Field()
        price = scrapy.Field()
        link = scrapy.Field()
    
  5. car.py:爬虫文件,提取具体的数据,给item赋值,将数据交给管道(yield item)
    start_url :存放第一页的url地址,在此项目中可以采用第二种项目启动方式,重写start_requests() 方法,一次性生成所有要抓取的url地址,并一次性交给调度器入队列

    class CarSpider(scrapy.Spider):
        name = "car"
        allowed_domains = ["www.che168.com"]
    
        # i = 1
    
        # 1、删除掉 start_urls 变量
        # start_urls = ["https://www.che168.com/china/a0_0msdgscncgpi1ltocsp1exx0/"]  # 从第一页开始
    
        def start_requests(self):
            """
            2、重写 start_requests() 方法:一次性生成所有要抓取的url地址,并一次性交给调度器入队列
            :return:
            """
            for i in range(1, 3):
                url = "https://www.che168.com/china/a0_0msdgscncgpi1ltocsp{}exx0/".format(i)
                # 交给调度器入队列,并指定解析函数
                yield scrapy.Request(url=url, callback=self.detail_page)
    
        def detail_page(self, response):
            item = CarspiderItem()  # 给item.py的CarspiderItem类做实例化
            # 先写基准xpath //body/div/div/ul/li
            li_list = response.xpath("//body/div/div/ul[@class='viewlist_ul']/li")
            for li in li_list:
                item["name"] = li.xpath("./@carname").get()
                item["price"] = li.xpath("./@price").get()
                item["link"] = li.xpath("./a/@href").get()
                yield item  # yield item:把抓取的数据提交给管道文件处理
    

    response.xpath() 使用说明:结果为列表,列表中元素为选择器对象 ,[<selector xpath='xxx' data='A'>,<selector xpath='xxx' data='B'> ]
    列表.extract():序列化列表中所有选择器为字符串[‘A’,‘B’]
    列表.extract_first()|get():序列化并提取第1个数据 ‘A’

  6. pipelines.py:管道文件

    # useful for handling different item types with a single interface
    import pymysql
    from .settings import *
    from itemadapter import ItemAdapter
    
    
    class CarspiderPipeline:
        def process_item(self, item, spider):
            print(item["name"], item["price"], item["link"])  # 打印,执行具体的数据处理
            return item
    
  7. settings.py:进行全局配置

    BOT_NAME = "CarSpider"
    
    SPIDER_MODULES = ["CarSpider.spiders"]
    NEWSPIDER_MODULE = "CarSpider.spiders"
    
    # Obey robots.txt rules
    ROBOTSTXT_OBEY = False
    
    # 设置日志级别:DEBUG < INFO < WARNING < ERROR < CARITICAL
    LOG_LEVEL = 'INFO'
    # 保存日志文件
    LOG_FILE = 'car.log'
    
    # 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)"
    }
    
    # Configure item pipelines
    # See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
    # 开启管道
    ITEM_PIPELINES = {
        # 项目目录名.模块名.类名:优先级(1-1000不等)
        "CarSpider.pipelines.CarspiderPipeline": 300,
        # "CarSpider.pipelines.CarMysqlPipeline": 400
    }
    
    # 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"  # 设置数据导出的编码"utf-8" "gb18030"
    
    
    
  8. run.py:写程序入口函数 , scrapy.cfg同目录

    from scrapy import cmdline
    
    cmdline.execute('scrapy crawl car'.split())
    
  9. 运行效果
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/424354.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PCB模块化设计06——HDMI接口PCB布局布线设计规范

目录PCB模块化设计06——HDMI接口PCB布局布线设计规范1、HDMI接口的定义2、HDMI管脚定义&#xff08;A型为例&#xff09;3、HDMI接口PCB布局要求4、HDMI接口布线要求PCB模块化设计06——HDMI接口PCB布局布线设计规范 1、HDMI接口的定义 高清晰度多媒体接口&#xff08;英文&…

Jina AI 创始人肖涵博士:揭秘 Auto-GPT 喧嚣背后的残酷真相

Auto-GPT 究竟是一个开创性的项目&#xff0c;还是一个被过度炒作的 AI 实验&#xff1f;本文为我们揭开了喧嚣背后的真相&#xff0c;并揭示了 Auto-GPT 不适合实际应用的生产局限性。 背景介绍 这两天&#xff0c;Auto-GPT&#xff0c;一款让最强语言模型 GPT-4 能够自主完成…

winform从入门到精通

环境 开发工具 visual studio 2019 16.11 community 基础框架 framework4.8 .net5需要开发工具小版本16.8以上 winform开发入门 windows桌面端应用开发框架 https://github.com/dotnet/winforms c#基础 partial class 创建项目 项目结构 引用&#xff1a;所依赖的系统库 …

编写猫咪相册应用 HTML

文章目录1. 标题元素标签2. p元素用于在网站上创建一段文本3. 注释4. 页面主要部分标识标签5. 通过使用img元素来为你的网站添加图片6. 使用锚点元素(a)链接到另一个页面7. 使用 section 元素将照片内容与未来的内容分开8. 无序列表(ul)元素&#xff0c;列表项(li)元素在列表中…

【C++11】final与override关键字和类的新功能

目录 一、final与override关键字 1.1 final 1.2 override 二、类的新功能 2.1 默认成员函数 2.2 类成员变量初始化 2.3 default关键字 2.4 delete关键字 注意&#xff1a;C专栏的所有测试代码都是在 vs2019 的环境下编译运行的 一、final与override关键字 这两个关键…

C++基础入门

C基础入门1.C认识1.1 第一个C程序1.1.1 创建项目1.1.2 创建文件1.1.3 编写代码1.1.4 运行程序1.3 变量1.4 常量1.5 关键字1.6 标识符命名规则2 数据类型2.1 整型2.2 sizeof关键字2.3 实型&#xff08;浮点型&#xff09;2.4 字符型2.5 转义字符2.6 字符串型2.7 布尔类型 bool2.…

Session、Cookie和Token

Session、Cookie和Token 参考&#xff1a;Session、Cookie、Token 【浅谈三者之间的那点事】 HTTP协议是一种无状态协议&#xff0c;即每次服务端接收到客户端请求时&#xff0c;都是一个全新的请求&#xff0c;服务器并不知道客户端的历史请求记录&#xff1b;Session和Cooki…

统信UOS + Windows双系统安装教程

全文导读&#xff1a;本文主要介绍了AMD架构下&#xff08;Intel/amd/兆芯/海光&#xff09;的机器同时安装Windows系统UOS系统的方法。 准备环境 1、下载好UOS系统镜像&#xff08;AMD64&#xff09;&#xff0c;下载地址&#xff1a;https://www.chinauos.com/resource/down…

第6章 接口、lambda表达式与内部类

文章目录Java与C异Java与C同接口接口概念接口与抽象类静态和私有方法默认方法解决默认方法冲突接口与回调&#xff08;不明白&#xff09;Comparator接口为什么有比较器Comparator接口实现步骤示例问题对象克隆为什么克隆浅拷贝&#xff1a;Object.clone方法的问题深拷贝数组的…

Firefox浏览器-渗透测试插件推荐

在日常工作中可能需要一些浏览器插件辅助我们做工作 下面是比较好的&#xff0c;当然不一定对你有用&#xff0c;找到适合自己的即可 FoxyProxy FoxyProxy是一个高级的代理管理工具&#xff0c;它完全替代了Firefox有限的代理功能。它提供比SwitchProxy、ProxyButton、 Quick…

3-5年以上的功能测试如何进阶自动化?【附学习路线】

做为功能测试人员来讲&#xff0c;从发展方向上可分两个方面&#xff1a; 1、业务流程方向 2、专业技能方向。 当确定好方向后&#xff0c;接下来就是如何达到了。(文末自动化测试学习资料分享) 一、业务流程方向 1、熟悉底层的业务 作为功能测试工程师来讲&#xff0c;了解…

Arduino-环境搭建

Arduino-环境搭建 文章目录Arduino-环境搭建下载开发软件调研Arduino入门教程本次学习所使用的Arduino开发板型号下载开发板的包——电脑联网&#xff0c;先插上开发板&#xff0c;再打开Arduino IDEArduino串口接收实验Arduino蓝牙接收实验Arduino蓝牙发送实验下载开发软件 官…

【python-Unet】计算机视觉~舌象舌头图片分割~机器学习(三)

返回至系列文章导航博客 1 简介 舌体分割是舌诊检测的基础&#xff0c;唯有做到准确分割舌体才能保证后续训练以及预测的准确性。此部分真正的任务是在用户上传的图像中准确寻找到属于舌头的像素点。舌体分割属于生物医学图像分割领域。分割效果如下&#xff1a; 2 数据集介…

一些二叉树相关面试题

文章目录1. 对折2. 判断是否是平衡二叉树3. 判断是否是搜索二叉树4. 二叉树的直径5. 寻找最大二叉搜索树6. 用递归套路判断是否是完全二叉树7. 派对的最大快乐值1. 对折 这个大家可以自己用纸对折一下&#xff0c;我这里就简单的说一下&#xff1a; 这是我们第一次对折的情况。…

使用PHP做个图片防盗链(全网详解)

概念&#xff1a; 防盗链是一种防范网络图片、视频等资源被他人盗链&#xff08;直接在其它网站使用&#xff09;的技术。在网站上添加防盗链功能可以防止其他网站恶意盗取自己网站的图片等内容&#xff0c;减少带宽消耗和保护网站内容安全。通常实现防盗链的方式是在网站服务…

js 使用 Array.from 快速生成0~5,步进值为0.1的数组

一、我们平常用的比较多的方法是for循环生成 let data[] for(let i0;i < 51;i){data.push(i/10) }二、用Array.from生成 先来认识一下我们今天的主角&#xff01;&#xff01;&#xff01; 1、释义 Array.from() 方法从一个类似数组或可迭代对象创建一个新的&#xff0c…

SpringMVC(三):请求流程处理

一、引言&#xff1a; 如下是我画的一个简单的SpringMVC的请求流程图&#xff0c;接下来会通过请求流程图去进行源码分析。 [1 ] 当我们客户端发送请求时&#xff0c;Servlet会进行请求的解析&#xff0c;然后交给DispatcherServlet进行统一分发。[2] DispatcherServlet会根…

北京君正案例:超能面板PRO采用4英寸IPS超清多彩屏,值不值得买?

清晨&#xff0c;窗帘自动拉开&#xff0c;悦耳音乐缓缓响起&#xff0c;面包机、咖啡机自动工作&#xff0c;开启新一天。离家时&#xff0c;一键关掉所有灯光和家电&#xff0c;节能安全&#xff0c;手机上便可查看家里设备状态&#xff0c;不用担心门没锁、灯没关等问题。下…

ClickHouse入门详解

ClickHouse基础部分详解一、ClickHouse简介二、ClickHouse单机版安装2.1、ClickHouse安装前准备环境2.2、ClickHouse单机安装三、ClickHouse数据类型四、ClickHouse的表引擎一、ClickHouse简介 对于其他乱起八糟的简介&#xff0c;我就不写了&#xff0c;只写干货. ClickHouse总…

Lumen6 /laravel 框架路由请求实现token验证

版本 Lumen6.0 中文文档&#xff1a;https://learnku.com/docs/lumen/5.7/cache/2411 实现功能效果 1、使用缓存存储用户token 2、从请求头head 中获取用户token 3、返回指定的认证失败结构体 4、对指定的接口路由做身份验证 第一步&#xff1a;解除注释 注意&#xff1…