前言
scrapy简介
框架就是一个集成了很多功能并且具有很强通用性的一个项目模板
专门学习框架封装的各种功能的详细用法
scrapy就是爬虫中封装好的一个明星框架。功能:高性能的持久化存储,异步的数据下载,高性能的数据解析,分布式
scrapy框架的基本使用
创建一个工程:scrapy startproject xxxPro
cd xxxPro
在spiders子目录中创建一个爬虫文件
scrapy genspider spiderName www.xxx.com
执行工程:
scrapy crawl spiderName
scrapy数据解析
scrapy持久化存储
基于终端指令:
要求:只可以将parse方法的返回值存储到本地的文本文件中
注意:持久化存储对应的文本文件的类型只可以为:'json', 'jsonlines', 'jl', 'csv', 'xml', 'marshal', 'pickle
指令:scrapy crawl xxx -o filePath
好处:简介高效便捷
缺点:局限性比较强(数据只可以存储到指定后缀的文本文件中)
基于管道:
编码流程:
数据解析
在item类中定义相关的属性
将解析的数据封装存储到item类型的对象
将item类型的对象提交给管道进行持久化存储的操作
在管道类的process_item中要将其接受到的item对象中存储的数据进行持久化存储操作
在配置文件中开启管道
好处:
通用性强。
案例实现
需求:爬取网站风景图片的图片名
先通过终端指令scrapy startproject fengjiingPro新建文件,再通过scrapy genspider fengjing www.xxx.com建立spider文件。
在spider文件中,注释掉allow_domains,输入start_url。
为了获取每一页图片名称,需要生成每一页对应的url,因此设置要设置一个通用的url模板。
class MeinvSpider(scrapy.Spider): name = 'meinv' #allowed_domains = ['www.xxx.com'] start_urls = ['https://pic.netbian.com/4kfengjing/'] #生成一个通用的url模板 url='https://pic.netbian.com/4kfengjing/index_%d.html' page_num=2
定义prase函数。获取每个图片对应的li标签,再从li标签中获取图片名称,为了使page_num与之对应的url变化,用格式化format。最后使用生成器函数回调parse,实现递归。
def parse(self, response):
li_list=response.xpath('//*[@id="main"]/div[3]/ul/li')
for li in li_list:
img_name=li.xpath('./a/b/text() | ./a/text() ').extract_first()#./a/b/text() | ./a/text() 防止a标签下不存在b标签产生None
print(img_name)
if self.page_num<=10:
new_url=format(self.url%self.page_num)
self.page_num+=1
#手动请求发送:callback调函数是专门用于数据解析的,callback再次调用parse实现递归,再次执行parse函数
yield scrapy.Request( url=new_url,callback=self.parse)在setting文件中取消UA注释进行UA伪装,君子协定为False,并输入LOG_LEVEL='ERROR'表示仅输出错误的日志信息。
因为并没有进行持久化存储,直接将结果打印出来,所以items未用到。