程序笔记   发布时间:2022-07-05  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了学python,怎么能不学习scrapy呢,这篇博客带你学会它大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

在正式编写爬虫案例前࿰c;先对 scrapy 进行一下系统的学习。

scrapy 安装与简单运行

使用命令 pip install scrapy 进行安装࿰c;成功之后࿰c;还需要随手收藏几个网址࿰c;便于后续学习使用。

  • scrapy 官网:https://scrapy.org;
  • scrapy 文档:https://doc.scrapy.org/en/latest/intro/tutorial.html;
  • scrapy 更新日志:https://docs.scrapy.org/en/latest/news.html。

安装完毕之后࿰c;在控制台直接输入 scrapyc;出现如下命令表示安装成功。

@H_944_29@> scrapy
Scrapy 2.5.0 - no active project

Usage:
  scrapy @H_944_29@<command@H_944_29@> [options] [args]

Available commands:

学python,怎么能不学习scrapy呢,这篇博客带你学会它

上述截图是 scrapy 的内置命令列表࿰c;标准的格式的 scrapy <command> <options> <args>c;通过 scrapy <command> -h 可以查看指定命令的帮助手册。

scrapy 中提供两种类型的命令࿰c;一种是全局的࿰c;一种的项目中的࿰c;后者需要进入到 scrapy 目录才可运行。

这些命令无需一开始就完全记住࿰c;随时可查࿰c;有几个比较常用࿰c;例如:

**scrpy startproject <项目名> **

该命令先依据 项目名 创建一个文件夹࿰c;然后再文件夹下创建于个 scrpy 项目࿰c;这一步是后续所有代码的起点。

@H_944_29@> scrapy startproject my_scrapy
@H_944_29@> New Scrapy project 'my_scrapy', using template directory 'e:pythonprojectvenvlibsite-packagesscrapytemplatesproject', created in:  # 一个新的 scrapy 项目被创建了࿰c;使用的模板是 XXX࿰c;创建的位置是 XXX
    E:pythonProject滚雪球学Python第4轮@H_75_30@my_scrapy
You can start your first spider with:  # 开启你的第一个爬虫程序
    cd my_scrapy   # 进入文件夹
    scrapy genspider example example.com # 使用项目命令创建爬虫文件

上述内容增加了一些注释࿰c;可以比对着进行学习࿰c;默认生成的文件在 python 运行时目录࿰c;如果想修改项目目录࿰c;请使用如下格式命令:

scrapy startproject myproject [project_dir]

例如

scrapy startproject myproject d:/d1

命令依据模板创建出来的项目结构如下所示࿰c;其中红色下划线的是项目目录࿰c;而绿色下划线才是 scrapy 项目࿰c;如果想要运行项目命令࿰c;则必须先进入红色下划线 @H_868_6@my_scrapy 文件夹࿰c;在项目目录中才能控制项目。

学python,怎么能不学习scrapy呢,这篇博客带你学会它

下面生成一个爬虫文件 使用命令 scrapy genspider [-t template] <name> <domain> 生成爬虫文件࿰c;该方式是一种快捷操作࿰c;也可以完全手动创建。创建的爬虫文件会出现在 当前目录或者项目文件夹中的 spiders 文件夹中࿰c;name 是爬虫名字࿰c;domain 用在爬虫文件中的 alowed_domainsstart_urls 数据中࿰c;[-t template] 表示可以选择生成文件模板。

查看所有模板使用如下命令࿰c;默认模板是 basic

@H_944_29@> scrapy genspider -l
  basic
  crawl
  csvfeed
  xmlfeed

创建第一个 scrapy 爬虫文件࿰c;测试命令如下:

@H_944_29@>scrapy genspider pm imspm.com
Created spider 'pm' using template 'basic' in module:
  my_project.spiders.pm

此时在 spiders 文件夹中࿰c;出现 pm.py 文件࿰c;该文件内容如下所示:

import scrapy


class PmSpider(scrapy.Spider):
    name @H_944_29@= 'pm'
    allowed_domains @H_944_29@= ['imspm.com']
    start_urls @H_944_29@= ['http://imspm.com/']

    def parse(self, response):
        pass

测试 scrapy 爬虫运行 使用命令 scrapy crawl <spider>c;spider 是上文生成的爬虫文件名࿰c;出现如下内容࿰c;表示爬虫正确加载。

@H_944_29@>scrapy crawl pm
2021-10-02 21:34:34 [scrapy.utils.log] INFO: Scrapy 2.5.0 started (bot: my_project)
[...]

scrapy 基本应用

scrapy 工作流程非常简单:

  1. 采集第一页网页源码;
  2. 解析第一页源码࿰c;并获取下一页链接;
  3. 请求下一页网页源码;
  4. 解析源码࿰c;并获取下一页源码;
  5. […]
  6. 过程当中࿰c;提取到目标数据之后࿰c;就进行保存。

接下来为大家演示 scrapy 一个完整的案例应用࿰c;作为 爬虫 120 例 scrapy 部分的第一例。

@H_944_29@> scrapy startproject my_project 爬虫
@H_944_29@> cd 爬虫
@H_944_29@> scrapy genspider pm imspm.com

获得项目结构如下:

学python,怎么能不学习scrapy呢,这篇博客带你学会它

上图中一些文件的简单说明。

  • scrapy.cfg:配置文件路径与部署配置;
  • items.py:目标数据的结构;
  • @H_868_6@middlewares.py:中间件文件;
  • pipelines.py:管道文件;
  • setTings.py:配置信息。

使用 scrapy crawl pm 运行爬虫之后࿰c;所有输出内容与说明如下所示:

学python,怎么能不学习scrapy呢,这篇博客带你学会它

上述代码请求次数为 7 次࿰c;原因是在 pm.py 文件中默认没有添加 wwwc;如果增加该内容之后࿰c;请求次数变为 4。

学python,怎么能不学习scrapy呢,这篇博客带你学会它

现在的 pm.py 文件代码如下所示:

import scrapy


class PmSpider(scrapy.Spider):
    name @H_944_29@= 'pm'
    allowed_domains @H_944_29@= ['www.imspm.com']
    start_urls @H_944_29@= ['http://www.imspm.com/']

    def parse(self, response):
        print(response.text)

其中的 parse 表示请求 start_urls 中的地址࿰c;获取响应之后的回调函数࿰c;直接通过参数 response.text 属性进行网页源码的输出。

学python,怎么能不学习scrapy呢,这篇博客带你学会它

获取到源码之后࿰c;要对源码进行解析与存储 在存储之前࿰c;需要手动定义一个数据结构࿰c;该内容在 items.py 文件实现࿰c;对代码中的类名进行了修改࿰c;@H_868_6@myProjectItem → ArticleItem

import scrapy

class ArticleItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title @H_944_29@= scrapy.Field()  # 文章标题
    url @H_944_29@= scrapy.Field()  # 文章地址
    author @H_944_29@= scrapy.Field()  # 作者

修改 pm.py 文件中的 parse 函数࿰c;增加网页解析相关操作࿰c;该操作类似 pyquery 知识点࿰c;直接观察代码即可掌握。

    def parse(self, response):
        # print(response.text)
        list_item @H_944_29@= response.css('.list-item-default')
        # print(list_item)
        for item in list_item:
            title @H_944_29@= item.css('.title::text').extract_first()  # 直接获取文本
            url @H_944_29@= item.css('.a_block::attr(href)').extract_first() # 获取属性值
            author @H_944_29@= item.css('.author::text').extract_first()  # 直接获取文本
            print(title, url, author)

其中 response.css 方法返回的是一个选择器列表࿰c;可以迭代该列表࿰c;然后对其中的对象调用 css 方法。

  • item.css('.title::text')c;获取标签内文本;
  • item.css('.a_block::attr(href)')c;获取标签属性值;
  • extract_first():解析列表第一项;
  • extract():获取列表。

pm.py 中导入 items.py 中的 ArticleItem 类࿰c;然后按照下述代码进行修改:

    def parse(self, response):
        # print(response.text)
        list_item @H_944_29@= response.css('.list-item-default')
        # print(list_item)
        for i in list_item:
            item @H_944_29@= ArticleItem()
            title @H_944_29@= i.css('.title::text').extract_first()  # 直接获取文本
            url @H_944_29@= i.css('.a_block::attr(href)').extract_first()  # 获取属性值
            author @H_944_29@= i.css('.author::text').extract_first()  # 直接获取文本
            # print(title, url, author)
            # 对 item 进行赋值
            item['title'] @H_944_29@= title
            item['url'] @H_944_29@= url
            item['author'] @H_944_29@= author
            yield item

此时在运行 scrapy 爬虫࿰c;会出现如下提示信息。

学python,怎么能不学习scrapy呢,这篇博客带你学会它

此时完成了一个单页爬虫

接下来对 parse 函数再次改造࿰c;使其在解析完第 1 页之后࿰c;可以解析第 2 页数据。

    def parse(self, response):
        # print(response.text)
        list_item @H_944_29@= response.css('.list-item-default')
        # print(list_item)
        for i in list_item:
            item @H_944_29@= ArticleItem()
            title @H_944_29@= i.css('.title::text').extract_first()  # 直接获取文本
            url @H_944_29@= i.css('.a_block::attr(href)').extract_first()  # 获取属性值
            author @H_944_29@= i.css('.author::text').extract_first()  # 直接获取文本
            # print(title, url, author)
            # 对 item 进行赋值
            item['title'] @H_944_29@= title
            item['url'] @H_944_29@= url
            item['author'] @H_944_29@= author
            yield item
        next @H_944_29@= response.css('.nav a:nth-last-child(2)::attr(href)').extract_first()  # 获取下一页链接
        # print(next)
        # 再次生成一个请求
        yield scrapy.request(url@H_944_29@=next, callBACk@H_944_29@=self.parse)

上述代码中࿰c;变量 next 表示下一页地址࿰c;通过 response.css 函数获取链接࿰c;其中的 css 选择器请重点学习。 yield scrapy.request(url=next, callBACk=self.parsE) 表示再次创建一个请求࿰c;并且该请求的回调函数是 parse 本身࿰c;代码运行效果如下所示。

学python,怎么能不学习scrapy呢,这篇博客带你学会它

如果想要保存运行结果࿰c;运行下面的命令即可。

scrapy crawl pm @H_944_29@-o pm.json

学python,怎么能不学习scrapy呢,这篇博客带你学会它

如果想要将每条数据存储为单独一行࿰c;使用如下命令即可 scrapy crawl pm -o pm.jl

学python,怎么能不学习scrapy呢,这篇博客带你学会它

生成的文件还支持 csv 、 xml、marchal、pickle ࿰c;可自行尝试。

下面将数据管道利用起来 打开 pipelines.py 文件࿰c;修改类名 @H_868_6@myProjectPipeline → titlePipelinec;然后编入如下代码:

class titlePipeline:
    def process_item(self, item, spider):  # 移除标题中的空格
        if item["title"]:
            item["title"] @H_944_29@= item["title"].Strip()
            return item
        else:
            return DropItem("异常数据")

该代码用于移除标题中的左右空格。

编写完毕࿰c;需要在 setTings.py 文件中开启 ITEM_PIPELInes 配置。

ITEM_PIPELInes @H_944_29@= {
   'my_project.pipelines.titlePipeline': 300,
}

300PIPELInes 运行的优先级顺序࿰c;根据需要修改即可。再次运行爬虫代码࿰c;会发现标题的左右空格已经被移除。

到此 scrapy 的一个基本爬虫已经编写完毕。


scrapy imspm.com 超级产品经理频道爬虫

写在后面

今天是持续写作的第 245 / 365 天。 期待 关注c;点赞评论收藏

更多精彩

《爬虫 100 例࿰c;专栏销售中࿰c;买完就能学会系列专栏》

学python,怎么能不学习scrapy呢,这篇博客带你学会它

↓ ↓ ↓ ↓完整代码↓ ↓ ↓ ↓

大佬总结

以上是大佬教程为你收集整理的学python,怎么能不学习scrapy呢,这篇博客带你学会它全部内容,希望文章能够帮你解决学python,怎么能不学习scrapy呢,这篇博客带你学会它所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。