scrapy学习笔记
admin
2023-07-31 00:47:44
0

scrapy是python最有名的爬虫框架之一,可以很方便的进行web抓取,并且提供了很强的定制型,这里记录简单学习的过程和在实际应用中会遇到的一些常见问题

一、安装

在安装scrapy之前有一些依赖需要安装,否则可能会安装失败,scrapy的选择器依赖于lxml,还有Twisted网络引擎,下面是ubuntu下安装的过程

1. linux下安装

12345678910111213141516 # 1. 安装xml依赖库$ sudo aptget install libxml2 libxml2dev$ sudo aptget install libxslt1dev$ sudo aptget install pythonlibxml2 # 2. 安装lxml$ sudo pip install lxml # 3. 安装Twisted(版本可以换成最新的),用pip也可以,如果失败的话下载源码安装,如下$ wget https://pypi.python.org/packages/6b/23/8dbe86fc83215015e221fbd861a545c6ec5c9e9cd7514af114d1f64084ab/Twisted-16.4.1.tar.bz2#md5=c6d09bdd681f538369659111f079c29d$ tar xjf Twisted16.4.1.tar.bz2$ cd Twisted16.4.1$ sudo python setup.py install # 3. 安装scrapy$ sudo pip install scrapy

http://lxml.de/installation.html

2. Mac下安装

12345 # 安装xml依赖库$ xcodeselect install # 其实相关依赖pip会自动帮我们装上$ pip install scrapy

mac下安装有时候会失败,建议使用virtualenv安装在独立的环境下,可以减少一些问题,因为mac系统自带python,例如一些依赖库依赖的一些新的版本,而升级新版本会把旧版本卸载掉,卸载可能会有权限的问题

二、基本使用

1. 初始化scrapy项目

我们可以使用命令行初始化一个项目

1 $ scrapy startproject tutorial

这里可以查看scrapy更多其他的命令

初始化完成后,我们得到下面目录结构

123456 scrapy.cfg:         项目的配置文件tutorial/:          该项目的python模块, 在这里添加代码    items.py:       项目中的item文件    pipelines.py:   项目中的pipelines文件.    settings.py:    项目全局设置文件.    spiders/        爬虫模块目录

我们先看一下scrapy的处理流程

scrapy由下面几个部分组成

  • spiders:爬虫模块,负责配置需要爬取的数据和爬取规则,以及解析结构化数据
  • items:定义我们需要的结构化数据,使用相当于dict
  • pipelines:管道模块,处理spider模块分析好的结构化数据,如保存入库等
  • middlewares:中间件,相当于钩子,可以对爬取前后做预处理,如修改请求header,url过滤等

我们先来看一个例子,在spiders目录下新建一个模块DmozSpider.py

1234567891011121314151617 import scrapy class DmozSpider(scrapy.Spider):    # 必须定义    name = \”dmoz\”    # 初始urls    start_urls = [        \”http://www.dmoz.org/Computers/Programming/Languages/Python/Books/\”,        \”http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/\”    ]     # 默认response处理函数    def parse(self, response):        # 把结果写到文件中        filename = response.url.split(\”/\”)[2]        with open(filename, \’wb\’) as f:            f.write(response.body)

打开终端进入根目录,执行下面命令

1 $ scrapy crawl dmoz

爬虫开始爬取start_urls定义的url,并输出到文件中,最后输出爬去报告,会输出爬取得统计结果

123456789101112131415161718192021222324 20160913 10:36:43 [scrapy] INFO: Spider opened20160913 10:36:43 [scrapy] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)20160913 10:36:43 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:602320160913 10:36:44 [scrapy] DEBUG: Crawled (200) <GET http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/> (referer: None)20160913 10:36:45 [scrapy] DEBUG: Crawled (200) <GET http://www.dmoz.org/Computers/Programming/Languages/Python/Books/> (referer: None)20160913 10:36:45 [scrapy] INFO: Closing spider (finished)20160913 10:36:45 [scrapy] INFO: Dumping Scrapy stats:{\’downloader/request_bytes\’: 548, \’downloader/request_count\’: 2, \’downloader/request_method_count/GET\’: 2, \’downloader/response_bytes\’: 16179, \’downloader/response_count\’: 2, \’downloader/response_status_count/200\’: 2, \’finish_reason\’: \’finished\’, \’finish_time\’: datetime.datetime(2016, 9, 13, 2, 36, 45, 585113), \’log_count/DEBUG\’: 3, \’log_count/INFO\’: 7, \’response_received_count\’: 2, \’scheduler/dequeued\’: 2, \’scheduler/dequeued/memory\’: 2, \’scheduler/enqueued\’: 2, \’scheduler/enqueued/memory\’: 2, \’start_time\’: datetime.datetime(2016, 9, 13, 2, 36, 43, 935790)}20160913 10:36:45 [scrapy] INFO: Spider closed (finished)

这里我们完成了简单的爬取和保存的操作,会在根目录生成两个文件ResourcesBooks

2. 通过代码运行爬虫

每次进入控制台运行爬虫还是比较麻烦的,而且不好调试,我们可以通过CrawlerProcess通过代码运行爬虫,新建一个模块run.py

12345678910111213141516 from scrapy.crawler import CrawlerProcessfrom scrapy.utils.project import get_project_settings from spiders.DmozSpider import DmozSpider # 获取settings.py模块的设置settings = get_project_settings()process = CrawlerProcess(settings=settings) # 可以添加多个spider# process.crawl(Spider1)# process.crawl(Spider2)process.crawl(DmozSpider) # 启动爬虫,会阻塞,直到爬取完成process.start()

参考:http://doc.scrapy.org/en/latest/topics/practices.html#run-scrapy-from-a-script

三、Scrapy类

如上面的DmozSpider类,爬虫类继承自scrapy.Spider,用于构造Request对象给Scheduler

1. 常用属性与方法

属性

  • name:爬虫的名字,必须唯一(如果在控制台使用的话,必须配置)
  • start_urls:爬虫初始爬取的链接列表
  • parse:response结果处理函数
  • custom_settings:自定义配置,覆盖settings.py中的默认配置

方法

  • start_requests:启动爬虫的时候调用,默认是调用make_requests_from_url方法爬取start_urls的链接,可以在这个方法里面定制,如果重写了该方法,start_urls默认将不会被使用,可以在这个方法里面定制一些自定义的url,如登录,从数据库读取url等,本方法返回Request对象
  • make_requests_from_url:默认由start_requests调用,可以配置Request对象,返回Request对象
  • parse:response到达spider的时候默认调用,如果在Request对象配置了callback函数,则不会调用,parse方法可以迭代返回ItemRequest对象,如果返回Request对象,则会进行增量爬取

2. Request与Response对象

每个请求都是一个Request对象,Request对象定义了请求的相关信息(url, method, headers, body, cookie, priority)和回调的相关信息(meta, callback, dont_filter, errback),通常由spider迭代返回

其中meta相当于附加变量,可以在请求完成后通过response.meta访问

请求完成后,会通过Response对象发送给spider处理,常用属性有(url, status, headers, body, request, meta, )

详细介绍参考官网

  • https://doc.scrapy.org/en/latest/topics/request-response.html#request-objects
  • https://doc.scrapy.org/en/latest/topics/request-response.html#response-objects

看下面这个例子

1

相关内容

热门资讯

500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
python绘图库Matplo... 本文简单介绍了Python绘图库Matplotlib的安装,简介如下: matplotlib是pyt...
Prometheus+Graf... 一,Prometheus概述 1,什么是Prometheus?Prometheus是最初在Sound...