网络爬虫框架:Scrapy
Scrapy是一个非常优秀的爬虫框架,通过Scrapy框架,可以非常轻松的实现强大的爬虫系统。
一、Scrapy简介
Scrapy主要包括如下6个部分:
- Scrapy Engine:用来处理整个系统的数据流,触发各种事件。
- Scheduler:从URL队列中取出一个URL。
- Downloader:从internet上下载web资源。
- Spider:接收下载器下载的原始数据,作进一步的处理。
- Item Pipeline:接收网络爬虫传过来的数据,以便做进一步处理。
- 中间件:整个Scrapy框架有很多中间件,如下载中间件、网络爬虫中间件等。这些中间件相当于过滤器,夹在不同部分之间截获数据流,并进行特殊的加工处理。
二、创建项目
以下操作全部是在pycharm的终端里写的
1、创建scrapy项目的命令:scrapy startproject 项目名字
2、以下是在创建项目后会进行提示的,根据提示创建爬虫,注意example只是一个例子,这个可以自己随便写。
示例:
cd 项目名字 这一步是进入当前项目路径
scrapy genspider example example.com 再创建爬虫文件
现在对创建的几个py文件进行说明(有的需要自己手动修改):
1、scrapy.cfg 详细项目配置文件,不需要做改动
2、items.py 定义数据存储模型
以下仅仅是一个实例:
# Define here the models for your scraped items
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
import scrapy
# 实际是一个模板类 主要是用来定义数据存储模型
# 通过这个类实例化 数据实际存到实例(对象)中
class MyspiderItem(scrapy.Item):
# 实际是一个模板类(数据建模) 事先定义好你要爬取的字段
name = scrapy.Field() # 租房标题
content = scrapy.Field() # 详情信息
price = scrapy.Field() # 价格
link = scrapy.Field() # 详情链接
3、middlewares.py 用于编写中间件(下载中间件+爬虫中间件) -- 无特殊需求,一般不需要编写。
4、pipelines.py 管道 -- 主要用于编写数据处理步骤 (数据的清洗+保存),以下代码有些我们需要手动改变,大家创建时需要注意。
# 需要手动修改成自己浏览器的UA
USER_AGENT = 'mySpider (+http://www.yourdomain.com)'
# Obey robots.txt rules
ROBOTSTXT_OBEY = False # 需要手动修改为False
# 注意:如果只设置浏览器代理获取不了数据,那么需要手动开启下面的代码,将需要的请求头传入
#DEFAULT_REQUEST_HEADERS = {
# 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
# 'Accept-Language': 'en',
#}
# 开启管道类才能写入数据
ITEM_PIPELINES = {
'mySpider.pipelines.MyspiderPipeline': 300,
}
5、最后,在自己创建的爬虫里面获取数据
以下是一个示例:
import scrapy
class LianjiaSpider(scrapy.Spider):
# 爬虫名字
name = 'lianjia'
# 限定爬取的域名范围
allowed_domains = ['cs.lianjia.com']
# 起始请求的URL,一开始这个是需要根据自己的url进行修改
start_urls = ['https://cs.lianjia.com/zufang/']
# 该方法会接受下载中间件传过来的response,并对其进行解析
def parse(self, response):
#注意:这里不用再使用requests获取源代码,scrapy框架已经为我们处理了,我们直接用xpath语法进行解析即可。
pass
三、定位元素以及提取数据、属性值的方法
解析并获取scrapy爬虫中的数据:利用xpath规则字符串进行定位和提取
1、response.xpath方法的返回结果是一个类似list类型,其中包含的是selector对象,操作和列表一样,但是有一些额外的方法
2、额外方法extract():返回一个包含字符串的列表
3、额外方法extract_first():返回列表的第一个字符串,列表为空没有返回None
四、保存数据
利用管道pipeline来处理(保存)数据
以下是对保存数据的一个示例(仅供参考)
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
# useful for handling different item types with a single interface
import json
from itemadapter import ItemAdapter
class MyspiderPipeline:
def __init__(self):
self.file = open('lianjia.json','w')
# 爬虫文件中提取数据的方法每yield一次item,就会运行一次
# 该方法为固定名称函数
def process_item(self, item, spider):
# 参数item默认是一个 <class 'mySpider.items.MyspiderItem'>类信息,需要处理成字典
dict_data = dict(item)
print(type(item), type(dict_data))
# 将返回的字典数据转为JSON数据
json_data = json.dumps(dict_data,ensure_ascii=False)+',\n'
# 写入JSON数据
self.file.write(json_data)
# 参数item:是爬虫文件中yield的返回的数据对象(引擎会把这个交给管道中的这个item参数)
print("建模之后的返回值:",item,)
# 默认使用完管道之后将数据又返回给引擎
return item
#实现自动关闭文件
def __del__(self):
self.file.close()