python scrapy框架 保存数据 .json/.csv /.txt/.xlsx 数据库pymysql, pymongo 下载图片与文件

整理笔记如下:

一 保存为 .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,
}



猜你喜欢

转载自blog.csdn.net/qq_42336573/article/details/80952235