Scrapy框架学习(一)—-Scrapy介绍及第一个项目
scrapy的介绍
Scrapy
使用纯python
实现的爬虫框架,采用Twisted
网络异步框架来处理网络通讯层,并包含了各种中间件接口。可以灵活的完成需要爬取网站数据,并提取结构性数据。
Scrapy的中文文档
Scrapy官方文档
Scrapy架构图
Scrapy Engine(引擎)
:负责Spider
、ItemPipeline
、Downloader
、Scheduler
中间的通讯,信号,数据传递等。Scheduler(调度器)
:它负责接受Scrapy Engine(引擎)
发送过来的Request请求,并按照一定的方式进行整理排列,当Scrapy Engine(引擎)
需要时,交还给Scrapy Engine(引擎)
。Downloader(下载器)
:负责下载Scrapy Engine(引擎)
发送的所有请求Requests请求,并将其获得Responses交还给Scrapy Engine(引擎)
,由Scrapy Engine(引擎)
交给Spider
来处理。Spider(爬虫)
:它负责处理所有Responses,分析并提取数据,获得item字段需要的数据,并将需要跟进的url提交给Scrapy Engine(引擎)
,再次进入Scheduler(调度器)
。Item Pipeline(管道)
:它负责处理Spider
中获取的Item数据,并进行后期的处理(详细分析,过滤,存储等)。Downloader Middlewares(下载中间件)
:你可以当作是一个可以自定义扩展下载功能的组件。Spider Middlewares(Spider 中间件)
:可以理解为是一个自定义扩展和操作Scrapy Engine(引擎)
和Spider
中间通信的功能组件。
scrapy安装
采用pip安装
pip install scrapy
scrapy创建项目
当我们安装好scrapy框架后,接着就是创建项目。
创建一个scrapydemo
的项目,进入该目录。在命令行中执行下面命令:
scrapy startproject srcapytest1
创建成功如下图所示:
scrapy目录结构及解释
项目创建完成,我们来看下项目的结构,如下图:
下面简单介绍下各个主要文件的作用:
scrapy.cfg
:项目的配置文件scrapytest1
:项目的Python模块,将会从这里引用代码scrapytest1/items.py
:项目的目标文件scrapytest1/pipelines.py
:项目的管道文件scrapytest1/settings.py
:项目的设置文件scrapytest1/spiders/
:存储爬虫代码的目录
scrapy的简单爬虫示例
以爬取https://www.baidu.com
为例,获取它的title标签的内容。
1. 配置settings中的Headers
将settings.py
文件中的DEFAULT_REQUEST_HEADERS
的注释打开,添加User-Agent
头字段
DEFAULT_REQUEST_HEADERS = {
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0.1; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
}
2. 定义Item类
在items.py模块中定义一个BaiduItem,如:
import scrapy
class BaiduItem(scrapy.Item):
# 定义需要保存数据的字段
title = scrapy.Filed()
Item类是我们需要保存的数据对象,里面定义的字段就是我们需要的字段的映射。
3. 定义Spider类
在spiders目录下创建一个baidu_spider.py
文件,在文件中定义BaiduSpider
类
import scrapy
# 导入BaiduItem类
from scrapydemo.items import BaiduItem
class BaiduSpider(scrapy.Spider):
# name 用于区别Spider。 该名字必须是唯一的,您不可以为不同的Spider设定相同的名字。
name='baidu'
# allowed_domians 是搜索的域名范围,也就是爬虫的约束区域,规定爬虫只爬取这个域名下的网页,不存在的URL会被忽略
# allowed_domians = ['baidu.com']
# start_urls 包含了Spider在启动时进行爬取的url列表。 因此,第一个被获取到的页面将是其中之一。 后续的URL则从初始的URL获取到的数据中提取。
start_urls=['https://www.baidu.com']
def parse(self, response):
# 获取响应信息,通过xpath解析规则,获取title数据
title = response.xpath('//title/text()').extarct()
# 创建一个BaiduItem的对象
item = BaiduItem()
# 通过item对象保存title数据
item['title'] = title
# 将item对象返回
return item
Spider类是写的就是我们的爬虫代码,其中有些重要的属性和方法:
- name
定义spider名字的字符串。
例如,如果spider爬取 mywebsite.com ,该spider通常会被命名为 mywebsite
- allowed_domains
包含了spider允许爬取的域名(domain)的列表,可选。
- start_urls
初始URL元祖/列表。当没有制定特定的URL时,spider将从该列表中开始进行爬取。
- start_requests(self)
该方法必须返回一个可迭代对象(iterable)。该对象包含了spider用于爬取(默认实现是使用 start_urls 的url)的第一个Request。
当spider启动爬取并且未指定start_urls时,该方法被调用。
- parse(self, response)
当请求url返回网页没有指定回调函数时,默认的Request对象回调函数。用来处理网页返回的response,以及生成Item或者Request对象。
- log(self, message[, level, component])
使用 scrapy.log.msg() 方法记录(log)message。 更多数据请参见 logging
3. 执行scrapy crawl 命令
将解析的title
内容,写入baidu.xml
文件中
scrapy crawl baidu -o baidu.xml
baidu
是BaiduSpider
中的name
属性们用来标识Spider的。
-o baidu.xml
:将解析的结果输出到baidu.xml
文件中。(可以输出的文件类型有json
,csv
,xml
等)
输出baidu.xml
文件内容:
<?xml version="1.0" encoding="utf-8"?>
<items>
<item><title>百度一下</title></item>
</items>