scrapy框架
介绍:scrapy框架为异步处理框架,使用纯python实现的爬虫框架,可扩展性强,可以灵活完成各种需求,我们只需要定制几个模块就可以轻松实现爬虫。是使用比较广泛的一种框架
框架介绍
- Scrapy Engine(引擎):负责Spider、itemPIPline、Downloader、Scheduler中间的通讯,信号,数据传输等。
- item:项目,他定义了爬取结果的数据结构,爬取的数据会被赋值成item对象。
- Scheduler(调度器):负责接收引擎发送的Request请求,并按照一定方式进行整理排列、入队,当引擎需要时交还给引擎。
- Downloader(下载器):负责下载Scrapy Engine发送的所有request请求,并将获取到的Response交还给Scrapy Engine由引擎交还给Spider处理
- Spider(爬虫):负责处理所有的Response,从中分析提取数据,获取item字段需要的数据,并将需要的URL提交给引擎,在此进入调度器。
- itemPipline(管道):负责处理spider中获取的item,并进行后期处理(详细解析、过滤、存储)
- DownLoader Middleware(下载中间件):可以当做一个自定义扩展的组件
- Spider Middleware(爬虫中间件):可以当做一个自定义扩展的组件和搜索引擎的spider中间通讯的功能(如进入Spider的Request和从spider出去的Request)
数据流
引擎打开一个网站>>处理该网站的Spider并向Spider请求一个要爬取的URL>>获取到URL通过调度器以Request形式调度>>引擎向调度器请求下一个要爬取的URL>>引擎获取到URL通过下载中间件发送给下载器>>下载完成,下载器生成Response,并发送给引擎>>引擎接受Response并通过爬虫中间件给Spider处理>>Spider处理Response返回爬取的Item即新的request给引擎>>引擎将Spider返回的Item对象给项目管道,将新的request给调度器重复上述第二步以后过程,直到调度器没有Request,引擎关闭网站
安装:
pip install Scrapy
如安装提示C++ 14.0xxx错误进入如下链接下载twisted 对应python版本
http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
先安装twisted再安装Scrapy
在cmd中运行scrapy 输出scrapy版本号即安装成功
创建项目
#在命令行中输入的操作
1.创建项目
scrapy startproject 项目名称
2.创建爬虫
scrapy genspider 爬虫文件名称 爬取网站的域名
#如猫眼
scrapy genspider maoyan maoyan.com
3.运行spider
scrapy crawl 爬虫文件名称
#以猫眼为例
scrapy crawl maoyan
4.代码运行后如果错误提示为win32api则安装下述第三方库
pip install pywin32
5.-o 输出指定格式的文件
scrapy crawl spider文件名(maoyan) -o xxx.json(还可以是json csv xml)
创建成功之后的路径
>MyScrapy #项目名称
>MyScrapy#项目主模块
__init__.py
items.py #定义爬虫的数据结构
middlewares.py#定义爬虫的中间件
piplines.py#项目的管道文件
settings.py #项目设置文件
scrapy.cfg #scrapy不是时的配置文件
>Spider#存储爬虫代码
__init__.py
爬虫代码.py
创建Spider
在test_scrapy目录下执行
scrapy genspider 爬虫文件名称 爬取网站的域名
#如猫眼
scrapy genspider maoyan maoyan.com
以猫眼为例
import scrapy
from MyScrapy.items import MyscrapyItem
class MaoyanSpider(scrapy.Spider):
# 每个项目的唯一名字,用于区分Spider
name = 'maoyan'
#允许爬取得域名
allowed_domains = ['maoyan.com']
#包含spider在启动时爬取的url列表,初始请求又它的定义
start_urls = ['https://maoyan.com/board/4']
def parse(self, response):
'''
parse:是Spider的一个方法,默认情况下,调用start_urls里面
的链接构成的请求完成下载执行后,返回的响应就会作为唯一参
数传递过来,该方法负责解析返回的响应,提取数据或者进一步
生成要处理的请求
'''
html = scrapy.Selector(response)
print(type(html))
print('*' * 20)
movie = html.xpath('//p[@class="star"]/text()').extract()
print(movie)
# items = []
for name in movie:
item = MyscrapyItem()
item['name'] = name
print(item['name'])
yield item
创建item
保存爬取的数据,使用方法和字典类似,但比字典多了额外的保护机制,可以避免拼写错误或者定义字段错误
import scrapy
class MyscrapyItem(scrapy.Item):
# define the fields for your item here like:
#定义name字段为Field()类型,可以直接将页面获取的内容在此定义
# name = scrapy.Field()
# movie = scrapy.Field()
name = scrapy.Field()
运行Spider
scrapy crawl 爬虫文件名称
#以猫眼为例
scrapy crawl maoyan
代码运行后如果错误提示为win32api则安装下述第三方库
pip install pywin32
保存数据
scrapy保存信息最简单的方法主要有四个
-o 输出指定格式的文件
scrapy crawl itcast -o xxx.json
#json lines格式,默认为Unicode编码
xxx.jsonl
xxx.csv
xxx.xml
存入数据库
使用Item Pipline将数据存入mongoDB数据库,或筛选某些有用Item,则可以定义Item Pipline来实现,常用Item Pipline来做如下操作
- 处理HTML数据
- 验证爬取数据 检查爬取字段
- 查重并丢弃重复数据
- 将爬取的数据保存到数据库
实现Item Pipline,只需要定义一个类并实现process_item()方法必须返回包含参数的数据和字典Item对象或抛出DropItem异常
from scrapy.conf import settings
import pymongo
class MyscrapyPipeline(object):
def __init__(self):
# 连接数据库
client = pymongo.MongoClient(host= \
settings['MONGO_HOST'],
port=settings['MONGO_PORT'])
self.db = client[settings['MONGO_DB']]
self.coll = self.db[settings['MONGO_COLL']]
def process_item(self, item, spider):
#将item转换成字典
postItem = dict(item)
#将数据插入
self.coll.insert(postItem)
return item
然后再settings.py中项目管道处配置连接数据库
# Configure item pipelines
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
'MyScrapy.pipelines.MyscrapyPipeline': 300,
}
MONGO_HOST='localhost'
MONGO_PORT = 27017
MONGO_DB = 'maoyan'
MONGO_COLL = 'TOP100'
selector用法
selector基于lxml来构建,支持xpath选择器,CSS选择器以及正则表达式,解析速度和准确度高。
selector也有自己的数据提取方法及selector(选择器)
直接使用
from scrapy import Selector
body = '<html><hrad><title>hello</title></hrad></html>'
selector = Selector(text=body)
title = selector.xpath('//title/text()').extract_first()
print(title)
在:: 获取属性 获取方法等
获取文本信息:
xpath:/text()
css:text
获取属性信息
xpath:/@属性名称
css: ::属性名称
返回结果为列表,只显示文本/节点内容,extract()
获取匹配结果列表中第一个元素内容extract_first()
正则匹配
借助re()方法实现
response.xpath(' ').re(正则表达式)
获取得到列表中第一个元素可以使使用re_first()方法response对象不能直接调用re()和re_first()
scrapy shell
该模式类似于scrapy请求url
在命令窗执行 scrapy shell url(要请求的网页连接)
然后进入到shell模式类似于python交互模式,在该模式下可以直接使用response.xpath/css进行信息提取