Python爬虫之Scrapy框架结构
Scrapy项目结构
scrapy.cfg
myproject/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
spider1.py
spider2.py
...
文件介绍:
- scrapy.cfg:项目的配置文件
- myproject/:项目的Python模块,将会从这里引用代码
- myproject/items.py:项目的目标文件
- myproject/pipelines.py:项目的管道文件
- myproject/settings:项目的设置文件
- myproject/spiders/:存储爬虫代码目录
项目步骤
一、明确目标
- 打开items.py文件
- items中定义结构化数据字段,用来保存爬取到的数据,有点像Python中的dict,提供了一些额外的保护减少错误
- 可以通过创建一个scrapy.Item类,并且定义类型为scrapy.Field的类属性来定义一个Item
- 接下来,创建一个自定义Item子类,和构建item模型
例如:
import scrapy
class BeautyItem(scrapy.Item):
name = scrapy.Field()
age = scrapy.Field()
img = scrapy.Field()
二、制作爬虫
- 在当前目录下输入命令
scrapy genspider spider_name "allowed_domains"
将在myproject/spiders/目录下创建一个名为'spider_name'的爬虫文件,并制定爬虫域的范围(allowed_domains,用于限定爬取的数据来源不超过这个域名范围)
- 打开该目录下的spider_name.py文件,默认增加了下列代码:
import scrapy
class Spider_name(scrapy.Spider):
name = "spider_name"
allowed_domains = ["allowed_domains"]
start_urls = ['http://www.allowed_domains']
def parse(self, response):
pass
其实也可以由我们自行创建爬虫文件并编写上面的代码,只不过使用命令可以免去编写固定代码的麻烦
要创建一个Spider,你必须用scrapy.Spider类创建一个子类,并确定了两个强制的属性和一个方法
- name = "" :爬虫的识别名称,必须是唯一的,不同的爬虫必须定义不同的名称
- allowed_domains = [] :是搜索的域名范围,也就是爬虫的约束区域,规定爬虫只爬取这个域名下的网页,不存在的URL会被忽略(非必要属性)
- start_urls = [] :爬取的url列表。爬虫从这里开始爬取数据,所以第一此下载的数据将会从这些urls开始,其他子URL将会从起始URL继承性生成
- parse(self, response) :解析的方法,每个初始URL完成下载后将被调用,调用的时候传入从每一个URL传回的Response对象来作为唯一参数,主要作用如下:
- 负责解析返回的网页数据(response.body),提取结构化数据(生成item)
- 生成需要下一页的URL请求
保存数据
scrapy保存信息的最简单的方法主要有四种,-o输出指定格式的文件,命令如下:
# json格式 scrapy crawl spider_name -o file_name.json # json line格式 scrapy crawl spider_name -o file_name.jsonl # csv逗号表达式,可用excel打开 scrapy crawl spider_name -o file_name.csv # xml格式 scrapy crawl spider_name -o file_name.xml
Item Pipelines
当Item在Spider中被收集之后,它将会被传递到Item Pipeline,这些Item Pipeline组件按定义的顺序处理Item。
每个Item Pipeline都是实现了简单方法的Python类,比如决定此Item是丢弃还是存储。以下是Item Pipeline的一些典型应用:
- 验证爬取的数据(检查item包含某些字段,比方说name字段)
- 查重(并丢弃)
- 将爬取结果保存到文件或数据库中
编写Item pipeline很简单,item pipeline组件是一个独立的Python类,其中process_item()方法必须实现
import something
class somethingPipeline(Object):
def __init__(self):
# 可选实现,做参数初始化(如打开保存目录文件)等
# do something
def process_item(self, item, spider):
# item(Item对象) - 被爬取的item
# spider(Spider对象) - 爬取该item的spider
# 这个方法必须实现,每个item pipeline组件都需要调用该方法
# 必须返回一个Item对象,被丢弃的item将不会被之后的pipeline组件锁处理
return item
def open_spider(self, spider):
# spider(Spider对象) - 被开启的spider
# 可选实现,当spider被开启时被调用
def close_spider(self, spider):
# spider(spider对象) - 被关闭的spider
# 可选实现,当spider被关闭时被调用