前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Scrapy入门

Scrapy入门

原创
作者头像
待你如初见
修改2019-03-22 14:16:43
6820
修改2019-03-22 14:16:43
举报
文章被收录于专栏:待你如初见

Scrapy

简介

  • Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。
  • 其最初是为了 页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。

各组件作用

Scrapy Engine

  • 引擎负责控制数据流在系统中所有组件中流动,并在相应动作发生时触发事件。 详细内容查看下面的数据流(Data Flow)部分。

调度器(Scheduler)

  • 调度器从引擎接受request并将他们入队,以便之后引擎请求他们时提供给引擎。 初始的爬取URL和后续在页面中获取的待爬取的URL将放入调度器中,等待爬取。同时调度器会自动去除重复的URL(如果特定的URL不需要去重也可以通过设置实现,如post请求的URL)下载器(Downloader)
  • 下载器负责获取页面数据并提供给引擎,而后提供给spider。

Spiders

  • Spider是Scrapy用户编写用于分析response并提取item(即获取到的item)或额外跟进的URL的类。 每个spider负责处理一个特定(或一些)网站

Item Pipeline

  • Item Pipeline负责处理被spider提取出来的item。典型的处理有清理、 验证及持久化(例如存取到数据库中)

当页面被爬虫解析所需的数据存入Item后,将被发送到项目管道(Pipeline),并经过几个特定的次序处理数据,最后存入本地文件或存入数据库

下载器中间件(Downloader middlewares)

  • 下载器中间件是在引擎及下载器之间的特定钩子(specific hook),处理Downloader传递给引擎的response。 其提供了一个简便的机制,通过插入自定义代码来扩展Scrapy功能。

Spider中间件(Spider middlewares)

  • Spider中间件是在引擎及Spider之间的特定钩子(specific hook),处理spider的输入(response)和输出(items及requests)。 其提供了一个简便的机制,通过插入自定义代码来扩展Scrapy功能。

数据流(Data flow)

  • 引擎打开一个网站(open a domain),找到处理该网站的Spider并向该spider请求第一个要爬取的URL(s)。
  • 引擎从Spider中获取到第一个要爬取的URL并在调度器(Scheduler)以Request调度。
  • 引擎向调度器请求下一个要爬取的URL。
  • 调度器返回下一个要爬取的URL给引擎,引擎将URL通过下载中间件(请求(request)方向)转发给下载器(Downloader)。
  • 一旦页面下载完毕,下载器生成一个该页面的Response,并将其通过下载中间件(返回(response)方向)发送给引擎。
  • 引擎从下载器中接收到Response并通过Spider中间件(输入方向)发送给Spider处理。
  • Spider处理Response并返回爬取到的Item及(跟进的)新的Request给引擎。
  • 引擎将(Spider返回的)爬取到的Item给Item Pipeline,将(Spider返回的)Request给调度器。
  • (从第二步)重复直到调度器中没有更多地request,引擎关闭该网站。

开始第一个爬虫

工具和环境

  • 语言:python 3.7
  • IDE: Pycharm
  • 浏览器:Chrome
  • 爬虫框架:Scrapy 1.5.2

下载pip包

代码语言:txt
复制
pip install scrapy
图片.png
图片.png

创建scrapy项目

代码语言:txt
复制
# 选择要在哪个目录下创建爬虫项目
scrapy startproject 项目名
图片.png
图片.png

使用PyCharm打开项目后文件结构如下

图片.png
图片.png
代码语言:txt
复制
* scrapy.cfg: 项目的配置文件
* test/: 项目的Python模块,将会从这里引用代码
* test/items.py: 项目的目标文件
* test/pipelines.py: 项目的管道文件
* test/settings.py: 项目的设置文件
* test/spiders/: 存储爬虫代码目录
  • 创建一个名为book的爬虫,指定爬取域的范围
代码语言:txt
复制
# scrapy genspider 爬虫名 "爬虫范围"
scrapy genspider book "dangdang.com"
图片.png
图片.png
图片.png
图片.png
  • 也可以由我们自行创建book.py并编写上面的代码,只不过使用命令可以免去编写固定代码的麻烦要建立一个Spider, 你必须用scrapy.Spider类创建一个子类,并确定了三个强制的属性 和 一个方法
  • name = "" :这个爬虫的识别名称,必须是唯一的,在不同的爬虫必须定义不同的名字
  • allow_domains = [] 是搜索的域名范围,也就是爬虫的约束区域,规定爬虫只爬取这个域名下的网页,不存在的URL会被忽略
  • start_urls = () :爬取的URL元祖/列表。爬虫从这里开始抓取数据,所以,第一次下载的数据将会从这些urls开始。其他子URL将会从这些起始URL中继承性生成
  • parse(self, response) :解析的方法,每个初始URL完成下载后将被调用,调用的时候传入从每一个URL传回的Response对象来作为唯一参数,主要作用如下:
    • 负责解析返回的网页数据(response.body),提取结构化数据(生成item)生成需要下一页的URL请求

爬去数据

  • 编写代码
代码语言:txt
复制
class BookSpider(scrapy.Spider):
    name = 'book'
    allowed\_domains = ['dangdang.com']
    start\_urls = ['http://category.dangdang.com/pg1-cp01.54.92.01.00.00.html'] # 修改url爬去指定类别书籍
    # response 为以请求后响应结果
    def parse(self, response):
    # 使用Xpath获取内容  
        for each in response.xpath('//\*[@id="component\_59"]/li'):
            # extract() 获取文本内容
            title = each.xpath("p[1]/a/text()").extract()  # 获取数据标题
            price = each.xpath("p[3]/span[1]/text()").extract() # 获取价格
            star = each.xpath("p[4]/a/text()").extract() # 获取评分
            detail = each.xpath("p[2]/text()").extract()  # 获取描述信息
            if not detail:
                detail = ["本书暂无detail、、、、、、"]
            print('detail', detail)
            print("title", title)
            print('price', price)
            print('star', star)
  • response
图片.png
图片.png
  • 执行爬虫
代码语言:txt
复制
# scrapy crawl 爬虫名
scrapy crawl book
图片.png
图片.png
  • 结果
图片.png
图片.png

补充

项目(Project-only)命令

  • crawl:使用spider进行爬取。
  • scrapy crawl myspider
  • check:运行contract检查。
  • scrapy check -l
  • list:列出当前项目中所有可用的spider。每行输出一个spider。
  • edit
  • parse:获取给定的URL并使用相应的spider分析处理。如果您提供 --callback 选项,则使用spider的该方法处理,否则使用 parse 。
代码语言:txt
复制
--spider=SPIDER: 跳过自动检测spider并强制使用特定的spider
--a NAME=VALUE: 设置spider的参数(可能被重复)
--callback or -c: spider中用于解析返回(response)的回调函数
--pipelines: 在pipeline中处理item
--rules or -r: 使用 CrawlSpider 规则来发现用来解析返回(response)的回调函数
--noitems: 不显示爬取到的item
--nolinks: 不显示提取到的链接
--nocolour: 避免使用pygments对输出着色
--depth or -d: 指定跟进链接请求的层次数(默认: 1)
--verbose or -v: 显示每个请求的详细信息
scrapy parse http://www.example.com/ -c parse_item
  • genspider:在当前项目中创建spider
代码语言:txt
复制
scrapy genspider [-t template] <name> <domain>
scrapy genspider -t basic example example.com
  • deploy:将项目部署到Scrapyd服务
  • bench:运行benchmark测试

参考资料

https://www.cnblogs.com/cutd/p/6208861.html

http://www.runoob.com/w3cnote/scrapy-detail.html

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Scrapy
    • 简介
      • 各组件作用
        • Scrapy Engine
          • 调度器(Scheduler)
            • Spiders
              • Item Pipeline
                • 下载器中间件(Downloader middlewares)
                  • Spider中间件(Spider middlewares)
                    • 数据流(Data flow)
                    • 开始第一个爬虫
                      • 工具和环境
                        • 下载pip包
                          • 创建scrapy项目
                            • 使用PyCharm打开项目后文件结构如下
                              • 爬去数据
                                • 补充
                                  • 项目(Project-only)命令
                                  • 参考资料
                              相关产品与服务
                              消息队列 TDMQ
                              消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
                              领券
                              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档