话不多说,直接上来。 项目代码如下
一、创建项目
scrapy startproject ImagesRename
# 下面写的创建爬虫的 自己写一个 ,自己写自己的需求, 我这里随便写一下。
cd ImagesRename
scrapy genspider baidu baidu.com
二、编写item
import scrapy
class ImagesrenameItem(scrapy.Item):
imgurl = scrapy.Field()
imgname = scrapy.Field()
三、spiders目录下创建蜘蛛文件:编写相应蜘蛛.
# -*- coding: utf-8 -*-
"""
招财猫需求, 请求图片地址,下载存入 OSS 数据库。
数据库 及 oss 对应库 为招财猫数据库;
-- 2021-10-25
"""
import re
import scrapy
from redis import Redis
from xinxuqiu.items import Imag
from xinxuqiu.pipelines import XinxuqiuPipeline
class ZhaocaimaoSpider(scrapy.Spider):
name = 'demo'
# 这个位置随便写的,主要是我的需求是查询数据库。 根据个人需求写,有请求首页的写请求首页
start_urls = ['https://www.baidu.com/']
# 查询mysql 数据库
select_db = XinxuqiuPipeline()
# 缓存
redis_db = Redis(host='127.0.0.1', port=6379, db=1)
# 这个位置是重构setting里面的东西,看不懂的可以不管,我这里是spider多,每个单独设计
custom_settings = {
'DOWNLOAD_DELAY': 0.1,
'CONCURRENT_REQUESTS': 32,
'DOWNLOADER_MIDDLEWARES': {
'xinxuqiu.middlewares.RandomUserAgentMiddlware': 300,
'xinxuqiu.middlewares.ProxyMiddleware': 200,
},
'ITEM_PIPELINES': {
'xinxuqiu.pipelines.ImagespiderPipeline': 300,
'xinxuqiu.pipelines.XinxuqiuPipeline': 350,
}
}
def parse(self, response):
# 我的需求是查询数据库,用url在下载.,自己的需求根据自己定。
# 可以从网页提取图片url
count, rows = self.select_db.select_db()
if count:
for sku_images in rows:
if ',' in sku_images[0]:
data_list = sku_images[0].split(',')
# print(data_list)
for data in data_list:
# print(data)
name = re.search('images/(.*)\?', data).group(1) if data else None
if name and self.redis_db.sadd('img_name', name):
item = Imag()
item['name'] = name
item['imgurl'] = data
yield item
else:
sku_image = sku_images[0].replace('marking_text', 'marking_text_20')
name = re.search('images/(.*)\?', sku_image).group(1) if sku_image else None
if name and self.redis_db.sadd('img_name', name):
item = Imag()
item['name'] = name
item['imgurl'] = sku_image
yield item
四、编写pipeline
import re
from scrapy.pipelines.images import ImagesPipeline
from scrapy import Request
class ImagespiderPipeline(ImagesPipeline):
def get_media_requests(self, item, info):
# 每一张图片地址下载,若传过来的是一个集合则需循环然后在yield
yield Request(item['imgurl'],meta={'name': item['name']})
# 重命名,若不重写这函数,图片名为哈希,就是一串乱七八糟的名字
def file_path(self, request, response=None, info=None):
# 提取url前面名称作为图片名。 这个位置可以自己设置
image_guid = request.url.split('/')[-1]
# 接收上面meta传递过来的图片名称。
name = request.meta['name']
# 过滤windows字符串,不经过这么一个步骤,你会发现有乱码或无法下载
name = re.sub(r'[?\\*|“<>:/]', '', name)
# 分文件夹存储的关键:{0}对应着name;{1}对应着image_guid
# 前面是文件名称, 后面的是图片名称,这里是个路径的写法
# filename = u'{0}/{1}'.format(name, image_guid) 根据自己需求来判断。
filename = u'{0}'.format(name) # 我这里只用了图片名称
return filename
五、设置
# setting 里面把这个设置进去
ITEM_PIPELINES = {
'xinxuqiu.pipelines.ImagespiderPipeline': 300,
}
# 设置图片存储目录
# 路径自己随便设置, 这个位置是写在 setting 里面的
IMAGES_STORE = 'E:\demo'
六、运行
scrapy crawl demo