爬虫框架srcapy入门

目录

  1. 参考
  2. 概述
  3. 安装
  4. 编写scrapy程序
  5. 问题总结

1. 参考

  • [1] docs.scrapy.org/en/latest/intro/tutorial
  • [2] docs.scrapy.org/en/latest/intro/install
  • [3] rwxwsblog/如何让你的scrapy爬虫不再被ban
  • [4] 生无可恋的程序员/Python--Scrapy爬虫获取作者ID的全部文章列表数据
  • [5] liuhehe123/scrapy--解决css选择器遇见含空格类提取问题response.css()
  • [6] yamadeee/Scrapy Selector选择器
  • [7] stackoverflow/scraping the file with html saved in local system
  • [8] runoob/Scrapy 入门教程

2. 概述

Scrapy 是用 Python 实现的一个为了爬取网站数据、提取结构性数据而编写的应用框架。

Scrapy架构图(绿线是数据流向)

image
  • Scrapy Engine(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。
  • Scheduler(调度器): 负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。
  • Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理,
  • Spider(爬虫):负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器)。
  • Item Pipeline(管道):负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方。
  • Downloader Middlewares(下载中间件):可以当作是一个可以自定义扩展下载功能的组件。
  • Spider Middlewares(Spider中间件):可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)

3. 安装

安装依赖

apt-get install python-dev python-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev

安装scrapy

pip3 install Scrapy

4. 编写scrapy程序

创建scrapy工程

scrapy startproject project_name
project_name/
    scrapy.cfg            # deploy configuration file
    tutorial/             # project's Python module, you'll import your code from here
        __init__.py
        items.py          # project items definition file
        middlewares.py    # project middlewares file
        pipelines.py      # project pipelines file
        settings.py       # project settings file
        spiders/          # a directory where you'll later put your spiders
            __init__.py

文件说明:

  • scrapy.cfg:项目的配置信息,主要为Scrapy命令行工具提供一个基础的配置信息。(真正爬虫相关的配置信息在settings.py文件中)
  • items.py:设置数据存储模板,用于结构化数据,如:Django的Model
  • pipelines:数据处理行为,如:一般结构化的数据持久化
  • settings.py:配置文件,如:递归的层数、并发数,延迟下载等
  • spiders:爬虫目录,如:创建文件,编写爬虫规则

示例程序,放在spiders目录

import scrapy


class QuotesSpider(scrapy.Spider):
    name = "quotes"

    def start_requests(self):
        urls = [
            'http://quotes.toscrape.com/page/1/',
            'http://quotes.toscrape.com/page/2/',
        ]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        page = response.url.split("/")[-2]
        filename = 'quotes-%s.html' % page
        with open(filename, 'wb') as f:
            f.write(response.body)
        self.log('Saved file %s' % filename)

QuotesSpider继承于scrapy.Spider,并定义了一些属性和方法:

  • name: 标识这个Spider。它在项目中必须是唯一的,也就是说,不能为不同的Spiders设置相同的名称。
  • start_requests():必须返回一个可迭代的请求(可以返回一个请求列表或编写一个生成器函数),Spiders将开始从中爬行。后续请求将从这些初始请求中依次生成。
  • parse():它将被调用来处理为每个请求下载的响应。response参数是TextResponse的一个实例,它包含页面内容,并且有进一步有用的方法来处理它。parse()方法通常解析响应,将抓取的数据提取为dict,并找到要跟踪的新url,并从中创建新的请求(请求)。

运行scrapy

scrapy crawl quotes
  • 这个命令使用刚刚添加的名称为quotes的运行Spider,它将发送对quotes.toscrape.com域名的一些请求。会得到一个类似的输出:
(omitted for brevity)
2016-12-16 21:24:05 [scrapy.core.engine] INFO: Spider opened
2016-12-16 21:24:05 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2016-12-16 21:24:05 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023
2016-12-16 21:24:05 [scrapy.core.engine] DEBUG: Crawled (404)  (referer: None)
2016-12-16 21:24:05 [scrapy.core.engine] DEBUG: Crawled (200)  (referer: None)
2016-12-16 21:24:05 [scrapy.core.engine] DEBUG: Crawled (200)  (referer: None)
2016-12-16 21:24:05 [quotes] DEBUG: Saved file quotes-1.html
2016-12-16 21:24:05 [quotes] DEBUG: Saved file quotes-2.html
2016-12-16 21:24:05 [scrapy.core.engine] INFO: Closing spider (finished)`

检查当前目录中的文件。应该已经创建了两个新文件:quotes-1.html和quotes-2.html,以及对应url的内容,正如我们的解析方法所指示的那样。

可以使用Feed导出结果,使用以下命令输出为json格式数据:

scrapy crawl quotes -o quotes.json

5. 问题总结

5.1 HTTP 403

解决方法:
在Settings.py中增加UA的设置,伪装为浏览器的访问

USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36'

5.2 class名称中有空格

参考[5],空格用“.”替代空格

5.3 怎么解析本地文件

url使用file的地址符,如下所示:

file:///path_of_directory/example.html

你可能感兴趣的:(爬虫框架srcapy入门)