Python爬虫的scrapy框架

1. Scrapy 框架

  • Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛。
  • 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非常之方便。
  • Scrapy 使用了 Twisted['twɪstɪd] 异步网络框架来处理网络通讯,可以加快我们的下载速度,不用自己去实现异步框架,并且包含了各种中间件接口,可以灵活的完成各种需求。

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

8986d6be-2de6-47b6-9318-e6822b63bb08.png
  • 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)

Ubuntu的安装方式

  • 通过pip3安装Scrapy框架

sudo pip3 install scrapy

  • 新建项目

scrapy startproject 项目名称

  • 新建爬虫文件

scrapy genspider 爬虫文件名 爬虫文件的网络地址

爬虫文件一般如下所示:
# -*- coding: utf-8 -*-
import scrapy
class JobboleSpider(scrapy.Spider):

    name = 'jobbole'
    allowed_domains = ['jobbole.com']
    start_urls = ['http://blog.jobbole.com/all-posts/']

def parse(self, response):
    pass

########这里的三个属性和一个方法都是必须有的

  • name = "" :这个爬虫的识别名称,必须是唯一的,在不同的爬虫必须定义不同的名字。
  • allow_domains = [] 是搜索的域名范围,也就是爬虫的约束区域,规定爬虫只爬取这个域名下的网页,不存在的URL会被忽略。
  • start_urls = () :爬取的URL元祖/列表。爬虫从这里开始抓取数据,所以,第一次下载的数据将会从这些urls开始。其他子URL将会从这些起始URL中继承性生成。
  • parse(self, response) :解析的方法,每个初始URL完成下载后将被调用,调用的时候传入从每一个URL传回的Response对象来作为唯一参数,主要作用如下:
    • 负责解析返回的网页数据(response.body),提取结构化数据(生成item)
    • 生成需要下一页的URL请求。

Scrapy Shell的使用

Scrapy终端是一个交互终端,我们可以在未启动spider的情况下尝试及调试代码,也可以用来测试XPath或CSS表达式,查看他们的工作方式,方便我们爬取的网页中提取的数据。(ipython的界面显示更友好)

启动Scrapy Shell

scrapy shell "http://hr.tencent.com/position.php?&start=0#a"

scrapy shell -s USER_AGENT="Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36" "http://hr.tencent.com/position.php?&start=0#a"
__*在Scrapy Shell 中,可以使用xpath语法或者css语法
如:response.xpath('//title').extract(),

当然Scrapy 的commend不仅仅如此,但是不属于我们课程重点,不做详细介绍。 例如:

  • scrapy -h 查看所有可用的命令:
  • scrapy view -h 查看view命令的详细内容:
  • scrapy list列出当前项目中所有可用的spider
  • scrapy runspider xxxx.py在未创建项目的情况下,运行一个编写在Python文件中的spider。
  • scrapy version输出Scrapy版本

官方文档详细作用讲解和使用: http://scrapy-chs.readthedocs.io/zh_CN/latest/topics/shell.html

Scrapy Settings.py文件配置

Scrapy设置(settings)提供了定制Scrapy组件的方法。可以控制包括核心(core),插件(extension),pipeline及spider组件。比如 设置 Pipeliine、LOG_LEVEL等。
BOT_NAME
(也是项目名称)。
使用 startproject 命令创建项目时会被自动赋值。
SPIDER_MODULES = ['ziruproject.spiders'] NEWSPIDER_MODULE = 'ziruproject.spiders'
爬虫的文件路径
USER_AGENT
用户代理,一般设置这个参数用来伪装浏览器请求
ROBOTSTXT_OBEY
是否遵守ROBOT协议,为False时,表示不遵守,
为True时表示遵守(默认为True)
CONCURRENT_REQUESTS
默认: 16
Scrapy downloader(下载器) 处理的最大的并发请求数量。
DOWNLOAD_DELAY
下载延迟的秒数,用来限制访问的频率
CONCURRENT_REQUESTS_PER_DOMAIN
每个域名下能够被执行的最大的并发请求数据量,
默认为8
CONCURRENT_REQUESTS_PER_IP
默认: 0
对单个IP进行并发请求的最大值。
1.如果非0,则忽略CONCURRENT_REQUESTS_PER_DOMAIN
设定,使用该设定。
也就是说,并发限制将针对IP,而不是网站。

2.该设定也影响 DOWNLOAD_DELAY: 如果
CONCURRENT_REQUESTS_PER_IP 非0,
下载延迟应用在IP而不是网站上。
COOKIES_ENABLED
是否要携带cookies,一般情况下,不是必须要携带
cookies的请求,我们将这个参数设置为False,(默认为True)
TELNETCONSOLE_ENABLED
默认: True
表明 telnet 终端 (及其插件)是否启用的布尔值。
通过Telnet可以监听当前爬虫的状态、信息,
操作爬虫等...。
DEFAULT_REQUEST_HEADERS
默认: 如下
{
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8',
'Accept-Language': 'en',
}
用于Scrapy HTTP请求的默认标头
EXTENSIONS
我们可以在这个参数下自定义扩展
ITEM_PIPELINES
设置并激活管道文件,为了存储数据使用,
后面的数字表示优先级,数字越小,优先级越高
DOWNLOAD_TIMEOUT
默认: 180
下载器超时时间(单位: 秒)。
自动限速(AutoThrottle)扩展
该扩展能根据Scrapy服务器及您爬取的网站的负载自动限制爬取速度。

设计目标

更友好的对待网站,而不使用默认的下载延迟0。 自动调整scrapy来优化下载速度,使得用户不用调节下载延迟及并发请求数来找到优化的值。 用户只需指定允许的最大并发请求数,剩下的都交给扩展来完成.

数据缓存:
目的:用来将已经发送的请求缓存下来,一遍后续使用

是否启用缓存策略
HTTPCACHE_ENABLED = True
缓存超时时间

HTTPCACHE_EXPIRATION_SECS = 0
缓存保存路径

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容