原文地址https://program-park.top/2023/12/01/reptile_5/

本文章中所有内容仅供学习交流使用,不用于其他任何目的,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关。

1. 简介

  Scrapy一个为了爬取网站数据提取结构数据编写应用框架,是目前 Python 中最受欢迎的爬虫框架之一,简单、方便、易上手。 它的应用领域很多,比如网络爬虫开发数据挖掘、数据监测自动化测试等。
  Scrapy 吸引人的地方在于它是一个框架,将 request异步调度处理)、下载器(多线程的 Downloader)、解析器selector)和 twisted(异步处理)等封装在一起,任何人都可以根据需求方便的修改项目。它也提供了多种类型爬虫基类,如 BaseSpider、sitemap 爬虫等,最新版本又提供了 Web2.0 爬虫支持
  官方网址https://scrapy.org/

2. Scrapy安装

  使用 pip 直接安装:

pip install scrapy

  Scrapy 依赖的库比较多,比如 lxml、TwistedpyOpenSSL 等等,我这边的建议是,先执行pip install scrapy命令查看安装提示是否报错,如报错就根据报错信息将缺少的依赖pip 安装即可,这些对于开发人员属于基本的东西,所以我就不放详细过程了。

3. Scrapy的架构

  架构组件

  注意:所有模块(除引擎外)之间是相互独立的,只跟引擎进行交互,并不能直接互相交互。即各大组件(除引擎)之间一定是不能够直接进行交流的。

4. Scrapy的数据流

  1. Engine 首先打开一个网站,找到处理该网站的 Spider ,并向该 Spider 获取第一个爬取的 URL。
  2. Engine 从 Spider 处获取第一个爬取的 URL ,并通过 Scheduler 以 Request 的形式调度
  3. Engine 向 Scheduler 请求下一个要爬取的 URL。
  4. Scheduler 返回下一个要爬取的 URL 给 Engine,Engine 将 URL 通过 Downloader Middlewares 转发给 Downloader下载。
  5. 一旦页面下载完毕, Downloader 生成页面的 Response,并将其通过 Downloader Middlewares 发送给 Engine。
  6. Engine 从下载器中接收到 Response,并将其通过 Spider Middlewares 发送给 Spider 处理。
  7. Spider 处理 Response ,并返回爬取到的 Item 及新的 Request 给 Engine。
  8. Engine 将 Spider 返回的 Item 给 Item Pipeline,将新的 Request 给 Scheduler。
  9. 重复2步到第8步,直到 Scheduler 中没有更多的 Request,Engine 关闭该网站,爬取结束

  用户需要自己的爬取请求输入对应的 Spider 中,同时将自己文件的加工请求写入对应的 Item Pipeline 中,所以一般使用 Scrapy 框架都只修改 Spider 和 Item Pipeline。

5. Scrapy开发流程

  下面以爬取慕课网免费课程https://www.imooc.com/course/list)第一页信息为例概述开发 Scrapy 项目流程

5.1 创建项目

  进入创建项目所在的文件夹下,执行scrapy startproject MyReptile命令创建项目,MyReptile是项目名称

  在 PyCharm点击File选择Open,找到刚刚创建的项目并打开

  打开项目之后可以看到,我们创建的项目目录结构如下

5.2 创建Spider

  Spider 是自定义的类,Scrapy 用它从网页中抓取数据,并解析抓取结果。这个类必须继承 Scrapy 提供的 Spider 类scrapy.Spider,并定义 Spider 的名称和起始请求,以及怎样处理爬取结果方法
  进入刚刚创建文件夹执行命令scrapy genspider myspider www.imooc.com创建一个 Spider,myspider是 Spider 名称www.imooc.com是网站域名


  执行完毕之后,spiders文件夹下就生成了一个myspider.py文件

  文件代码中有三个属性和一个方法

5.3 创建Item

  创建完 Spider 文件之后,接着定义一个容器保存要爬取的数据,我们对items.py文件进行更改或者创建一个新的文件定义 item 都行。
  创建 Item 需要继承 scrapy.Item 类,并且定义类型scrapy.Field字段例如我们要爬取慕课网站课程信息,包括课程名称课程 URL,课程图片 URL,课程描述学习人数。

import scrapy

class MyreptileItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    # 课程名称
    title = scrapy.Field()
    # 课程url
    url = scrapy.Field()
    # 课程标题图片url
    image_url = scrapy.Field()
    # 课程描述
    introduction = scrapy.Field()
    # 学习人数
    student = scrapy.Field()

5.4 编写Spider

  之后编写 Spider 中parse()内容parse()方法参数 responsestart_urls里 URL 爬取后的结果,所以在parse()中,我们可以直接对 response内容进行解析:

import scrapy

# 引入容器
from MyReptile.items import MyreptileItem

class MyspiderSpider(scrapy.Spider):
    name = 'myspider'
    allowed_domains = ['www.imooc.com']
    start_urls = ['https://www.imooc.com/course/list']

    # 填写爬写方法
    def parse(self, response):
        # 实例化一个容器保存爬取信息
        item = MyreptileItem()
        # 这部分是爬取部分使用xpath方式选择信息,具体方法根据网页结构而定
        # 先获取每个课程的div
        for box in response.xpath('//div[@class="course-card-container"]/a[@target="_blank"]'):
            # 获取div中的课程标题
            # strip() 方法用于移除字符串头尾指定字符默认为空格)
            # extract()返回的所有数据,存在一个list里。extract_first()返回的是一个string,是extract()结果第一个值。
            item['title'] = box.xpath('.//h3/text()').extract()[0].strip()
            # 获取每个div中的课程路径
            item['url'] = 'http://www.imooc.com' + box.xpath('.//@href').extract()[0]
            # 获取div中的标题图片地址
            item['image_url'] = 'http:'+box.xpath('.//img[@data-original]').extract()[0]
            # 获取div中的课程简介
            #item['introduction'] = box.xpath('.//p[@class="course-card-desc"]/text()').extract()[0].strip()
            item['introduction'] = box.xpath('.//p/text()').extract()[0].strip()
            # 获取div中的学生人数
            item['student'] = box.xpath('.//div[@class="course-card-info"]/span[2]/text()').extract()[0].strip()

            # 返回信息
            yield item

5.5 运行Spider

  执行完以上步骤后,我们可以执行命令scrapy crawl myspider运行爬虫,控制台就会给出爬取的数据。
  运行完 Scrapy 后,我们只在控制台看到了输出结果,我们可以利用 Scrapy 提供的 Feed Exports 轻松抓取输出的结果例如,我们想将结果保存csv 文件,可以在 Pycharm 的 Terminal 窗口执行如下命令crawl myspider -o myspider.csv
  输出格式支持很多种,例如 jsonxml 、 pickle 、 marshal 等。 下面命令对应的输出分别为 jsonxml 、 pickle 、 marshal 格式以及远程输出。

scrapy crawl myspider -o myspider.json
scrapy crawl myspider -o myspider.xml 
scrapy crawl myspider -o myspider.pickle 
scrapy crawl myspider -o myspider.marshal 
scrapy crawl myspider -o ftp://user:pass@ftp.example.com/myspider.csv

  其中, ftp 输出需要正确配置用户名密码地址、输出路径,否则会报错

参考文献

  【1】https://zhuanlan.zhihu.com/p/598764670
  【2】https://zhuanlan.zhihu.com/p/431078183?utm_id=0
  【3】https://blog.csdn.net/weixin_52245535/article/details/128695051
  【4】https://www.cnblogs.com/hsiang/p/15139627.html
  【5】https://m.biancheng.net/view/2027.html
  【6】https://www.zhihu.com/question/439914883/answer/2607880092
  【7】https://www.jianshu.com/p/063026368b3c
  【8】https://www.coonote.com/python-note/python-scrapy-intro.html
  【9】https://www.bilibili.com/video/BV1Db4y1m7Ho?p=90

原文地址:https://blog.csdn.net/weixin_44758876/article/details/134181705

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_27934.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注