框架:继承了很多功能并且具有很强通用性的项目模板
scrapy:高性能的持久化存储,异步的数据下载,高性能数据解析,分布式
环境安装:
linux和mac操作系统:
-
- pip install scrapy
windows系统:
-
- pip install wheel
- 下载twisted,下载地址为http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
- 安装twisted:pip install Twisted‑17.1.0‑cp36‑cp36m‑win_amd64.whl
- pip install pywin32 pip install scrapy
测试:在终端里录入scrapy指令,没有报错即表示安装成功
基本使用:
scrapy startproject xxxx
spiders子目录创建一个爬虫文件:
- cd 工程目录中
- scrapy genspider spiderName url
- 执行工程:
scrapy crawl spiderName
scrapy crawl spiderName --nolog #不打印日志信息
settings下写 LOG_LEVEL = 'ERROR' #日志只写错误类型
数据解析:
xpath返回列表 是Selector对象 Selector.extract() /extract_first()或列表.extract()表示列表中每一个的selector的data对应字符串的提取
持久化存储:
1.基于终端指令
-要求:只可以将parse方法的返回值存储到本地的文本文件中
- scrapy crawl 1ocilang -o 路径 (.csv常用 json常用 jsonlines jl xml marshal pickle)
- 优点:简洁高效...
-缺点:局限性 只能存指定后缀文本值 只能存parse的return值
2.基于管道(常用)
- 编码流程:
- 数据解析
- 在item中定义相关属性
- 将解析的数据封装存储到item类型的对象中(手动实例化)
- 将item类型的对象提交给管道进行持久化存储操作 #yield item
- 在管道类额process_item中要将其接收到的item对象中存储的数据进行持久化存储
-
class SecondbloodPipeline(object): #构造方法 def __init__(self): self.fp = None #定义一个文件描述符属性 #下列都是在重写父类的方法: #开始爬虫时,执行一次 def open_spider(self,spider): print('爬虫开始') self.fp = open('./data.txt', 'w') #因为该方法会被执行调用多次,所以文件的开启和关闭操作写在了另外两个只会各自执行一次的方法中。 def process_item(self, item, spider): #将爬虫程序提交的item进行持久化存储 self.fp.write(item['author'] + ':' + item['content'] + '\n') return item #结束爬虫时,执行一次 def close_spider(self,spider): self.fp.close() print('爬虫结束')
-
在配置文件中开启管道
全站数据爬取:
class ExampleSpider(scrapy.Spider): name = 'example' # allowed_domains = ['example.com'] start_urls = ['xxx'] pageNum = 1 url = 'xxxxxxxx%s' def parse(self, response): li_list = response.xpath('//*[@id="main"]/div[3]/ul/li') for li in li_list: src = 'http://pic.netbian.com/'+li.xpath('./a/img/@src').extract()[0] print(src) if self.pageNum<194: self.pageNum+=1 url = self.url%self.pageNum yield scrapy.Request(url=url, callback=self.parse)
图片资源:
setting下配置
IMAGES_STORE = ‘./imgs’
from scrapy.pipelines.images import ImagesPipeline import scrapy class ImgproPipeline(object): item = None def process_item(self, item, spider): # print(item) return item #ImagesPipeline专门用于文件下载的管道类,下载过程支持异步和多线程 class ImgPipeLine(ImagesPipeline): #对item中的图片进行请求操作 def get_media_requests(self, item, info): yield scrapy.Request(item['src']) #定制图片的名称 def file_path(self, request, response=None, info=None): url = request.url file_name = url.split('/')[-1] return file_name def item_completed(self, results, item, info): return item #该返回值会传递给下一个即将被执行的管道类