整理笔记如下:
一 保存为 .json类型
在pipelines.py中:
import json class JsonPipeline(object): def __init__(self): # 保存的文件 self.file = open('novel.json', 'wb') def process_item(self, item, spider): line = json.dumps(dict(item)) + "\n" self.file.write(line.encode('utf-8')) # 返回 爬虫数据 在items.py中的数据 return item配置settings.py文件:
# 放开配置 ITEM_PIPELINES = { # Qishu创建的项目名 'Qishu.pipelines.JsonPipeline': 300, }二 用命令行保存为.json/ .csv类型
# 第一个novel是爬虫文件名即novel.py(在spiders文件中) # 第二个是保存的文件名 scrapy crawl novel -o novel.json -s FEED_EXPORT_ENCODING=utf-8 scrapy crawl novel -o novel.csv-s FEED_EXPORT_ENCODING=utf-8三 保存为.txt类型
在pipelines.py中:
# 2. 保存伯乐在线所有最新文章:http://blog.jobbole.com/all-posts/ class BolePipeline(object): def __init__(self): self.file = open('bole.txt', 'a', encoding='utf-8') def process_item(self, item, spider): self.file.write('=================================================') self.file.write('\n') self.file.write(item['title']) self.file.write('\n') self.file.write(item['time']) self.file.write(item['cate']) self.file.write('\n') self.file.write(item['content']) self.file.write('\n') self.file.write(item['praise']) self.file.write(item['collect']) self.file.write(item['comment']) self.file.write('\n') return item配置settings.py文件:
ITEM_PIPELINES = { 'Bole.pipelines.BolePipeline': 300, }四 保存为xlsx.类型
在pipelines.py中:
# 爬取51Job时的数据 class JobPipeline(object): wb = Workbook() ws = wb.active # 设置表头 ws.append(['职位', '地址', '薪资', '公司', '类型', '经验', '保险', '岗位职责']) def process_item(self, item, spider): # 添加数据 line = [item['job'], item['address'], item['pay'], item['company'], item['type'], item['requests'], item['insures'], item['pmcs']] self.ws.append(line) # 按行添加 self.wb.save('51job.xlsx') return item配置settings.py文件:
ITEM_PIPELINES = { 'Job.pipelines.JobPipeline': 300, }五 保存为数据库pymongo
官方文档上也有
https://doc.scrapy.org/en/latest/topics/item-pipeline.html
在pipelines.py中:
import pymongo class MongoPipeline(object): def __init__(self, client, db): self.client = pymongo.MongoClient(client) self.db = self.client[db] # from_crawler()作用就是从settings.py中读取相关配置,然后可以将读取结果保存在类中使用。 @classmethod def from_crawler(cls, crawler): # 创建当前类的对象,并传递两个参数。 obj = cls( client=crawler.settings.get('MONGOCLIENT', 'localhost'), db=crawler.settings.get('DB', 'bole') ) return obj def process_item(self, item, spider): self.db['article'].update_one({'title': item['title']}, {'$set': dict(item)}, True) return item配置settings.py文件:
# 创建的参数 MONGOCLIENT = 'localhost' DB = 'bole' ITEM_PIPELINES = { 'Bole.pipelines.MongoPipeline': 301, }六 保存为数据库pymysql
在pipelines.py中:
import pymysql class MysqlPipeline(object): def __init__(self, host, db, user, passwd): # 连接数据库 self.connect = pymysql.connect( host=host, db=db, user=user, passwd=passwd, charset='utf8', use_unicode=True ) # 通过cursor执行增删改查 self.cursor = self.connect.cursor() # from_crawler(): 从setting.py中读取相关配置, 然后可以将读取结果保存在类中使用 @classmethod def from_crawler(cls, crawler): # 创建当前类的对象. 需传递setting中的四个参数 object = cls( host=crawler.settings.get('MYSQL_HOST', 'localhost'), user=crawler.settings.get('MYSQL_USER', 'root'), passwd=crawler.settings.get('MYSQL_PASSWD', '123456'), db=crawler.settings.get('MYSQL_DBNAME', 'bole') ) return object def process_item(self, item, spider): try: # sql语句 self.cursor.execute( "INSERT INTO article(title, time, cate, content, praise, collect, comment)VALUES (%s, %s, %s, %s, %s, %s, %s)", (item['title'], item['time'], item['cate'], item['content'], item['praise'], item['collect'], item['comment']) ) self.connect.commit() except Exception as e: print('存入数据失败 ', e) return item配置settings.py文件:
# MySQL ITEM_PIPELINES = { 'Bole.pipelines.MysqlPipeline': 302, } #设置参数: MYSQL_HOST = 'localhost' MYSQL_DBNAME = 'bole' MYSQL_USER = 'root' MYSQL_PASSWD = '123456'七 下载图片
素材中国图片网站:http://sc.chinaz.com/首页,找到 “图标” 分类;进入 图标 分类后,获取列表页的分类名称,列表页的详情页地址;请求详情页,将某一个分类的所有图标下载到本地,将每一个分类名称作为文件夹,内部保存该分类下的所有图片;自定义图片路径,自定义图片名称;
在pipelines.py中:
from scrapy.pipelines.images import ImagesPipeline from scrapy.http import Request # class TubiaoPipeline(object): # def process_item(self, item, spider): # return item class TubiaoSrcPipeline(ImagesPipeline): def get_media_requests(self, item, info): # src 是图片的网址 # 只是保存图片的网址,不下载的话, tubiao['src'] = src # 下载图片 图片的网址 在存入items中时, 必须是列表如: tubiao['src'] = [src] image_src = item['src'][0] yield Request(image_src, meta={'item': item}) def file_path(self, request, response=None, info=None): # 自定义图片下载路径 item = request.meta['item'] # 分类的名字 title = item['title'] # 图片的名字自定义 这是没有加密的 # scrapy 自带的下载图片 图片的名字是加密过的 name = item['src'][0].split('/')[-1] path = title + '/' + name return path def item_completed(self, results, item, info): print(results) return item配置settings.py文件:
# 配置图片的保存目录 IMAGES_STORE = 'imgs' # 在ImagesPipeline进行下载图片是,配置图片url对应的Item字段 IMAGES_URLS_FIELD = 'src' ITEM_PIPELINES = { # 启用scrapy自带的图片下载ImagesPipeline, 'scrapy.pipelines.images.ImagesPipeline': None, # 如果采用自定义的TubiaoSrcPipeline,需要将自带的ImagesPipeline设置为None。否则scrapy自带的也会下载 'Tubiao.pipelines.TubiaoSrcPipeline': 300, }八 下载文件
与下载图片类似
在pipelines.py中:
class QsFilesPipeline(FilesPipeline): def get_media_requests(self, item, info): file_src = item['txt_url'][0] yield Request(file_src, meta={'item': item}) def file_path(self, request, response=None, info=None): item = request.meta['item'] # 分类文件名 title = item['file_img'] # 文件名 name = item['txt_url'][0].split('/')[-1] # 分类下载 path = title + '/' + name return path def item_completed(self, results, item, info): print(results) return item配置settings.py文件:
# 配置小说文件的下载路径和对应的下载字段 FILES_STORE = 'files' FILES_URLS_FIELD = 'txt_url' ITEM_PIPELINES = { # 'scrapy.pipelines.files.FilesPipeline': None, # 'Qishu.pipelines.QsFilesPipeline': 300, }