scrapy框架

本文详细介绍了如何使用Scrapy框架进行图片和视频数据的爬取,包括设置ImagesPipeline和FilesPipeline进行文件下载,以及在middlewares.py中配置代理和UA池以应对防盗链策略。同时,文章提到了items.py的配置和settings.py的修改来定制爬取流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.scrapy框架准备

mac打开终端,如果是windows则点按win+r并输入cmd打开命令行,输入下列任意一行的代码内容进行安装

pip install scrapy -i https://pypi.tuna.tsinghua.edu.cn/simple # 大部分python版本
pip3 install scrapy -i https://pypi.tuna.tsinghua.edu.cn/simple # 有的版本是这样的,挨个试试

2.scrapy项目开始

1.创建一个工程

在终端(pycharm终端或者系统终端都可以)中键入:

1)

scrapy startproject name  # name为工程名称,可自行指定

3.scrapy图片数据爬取

​ 爬取并存储图片,scrapy给我们提供了一个ImagesPipelines模块,下面是使用方法

注意:爬取图片类型数据在安装scrapy的前提下,还需要安装Pillow模块包

1.pipelines.py

from scrapy.pipelines.images import ImagesPipeline
import scrapy

class xxxxPipeline(object):# 该类为创建爬虫文件是默认存在的管道类
    item = None
    def process_item(self,item,spider):
        # print(item)
        return item
    
# ImagesPipeline是专门用于文件下载的管道类,下载过程支持异步和多线程
class ImgPipeline(ImagesPipeline): # 该类名称随意,但是一定要继承ImagesPipeline父类
    
    # 重写父类的三个方法,三个方法名称固定,不可更改
    def get_media_requests(self,item,info):
        yield scrapy.Request(item['src'])
        
    def file_path(self,request,response=None,info=None):
        file_name = request.url.split('/')[-1]
        return file_name
    
    def item_completed(self,results,item,info):
        return item  # 该返回值会传递给下一个即将被执行的管道类

2.settings.py

ITEM_PIPELINES = {
   'xxx.pipelines.xxxPipeline': 300,  # 默认存在的管道(处理item)
   'xxx.pipelines.ImgPipeline': 301  # 
}
IMAGES_STORE = './imgs'   # 引号里为路径 ,可以自行指定,即最终图片存储的目录

4.scrapy视频数据爬取

爬取并存储视频,scrapy给我们提供了一个FilesPipeline方法,下面是使用方法

1.items.py配置

import scrapy

class xxxItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    video_url = scrapy.Field()
    video_name = scrapy.Field()

2.pipelines.py配置

import scrapy
from scrapy.pipelines.files import FilesPipeline # 该类用于视频数据保存

class VideoDownloadPipeline(FilesPipeline): # 类名称任意,但一定要继承FilesPipeline父类
    
    # 重写父类的三个方法
    def get_media_requests(self, item, info):
        # 依次对视频地址发送请求,meta用于传递视频的文件名
        yield scrapy.Request(url=item['video_url'], meta={'title': item['file_name']})

    def file_path(self, request, response=None, info=None, *, item=None):
        filename = request.meta['title']  # 获取视频文件名
        return filename  # 返回下载的视频文件名

    def item_completed(self, results, item, info):
        print(item['file_name'],'is ok!')
        return item

3.1middlewares.py配置(可能需要用到代理池或UA池,看自己需求)

import random 
from fake_useragent import UserAgent

class xxxDownloaderMiddleware:
    http = [
        'xxxxx:xxxx' # 网上自己找ip代理
    ]
    https = [
        'xxxxx:xxxx' # 网上自己找ip代理
    ]
    # 拦截请求
    def process_request(self, request, spider):
        request.headers['User-Agent'] = str(UserAgent().random)
        if request.url.split(':')[0] == 'http':
            request.meta['Proxy'] = 'http://' + random.choice(self.http)
        else:
            request.meta['Proxy'] = 'https://' + random.choice(self.https)

        return None

    # 拦截所有响应
    def process_response(self, request, response, spider):
        return response

    # 拦截所有发生异常
    def process_exception(self, request, exception, spider):  
        pass

3.2middlewares.py配置(视频网址可能采取防盗链)

class LishipinDownloaderMiddleware:
	
    def process_request(self, request, spider):
        # 在请求头里添加信息
        request.headers['User-Agent'] = 'xxx' # 指定UA
        request.headers['Referer'] = 'xxx' # 防盗链
        return None

    def process_response(self, request, response, spider):
        return response

    def process_exception(self, request, exception, spider):
        pass

4.settings.py配置

# 打开管道
ITEM_PIPELINES = {
    # xxx为所创建的工程名
    'xxx.pipelines.files.FilesPipeline': 300, # 默认管道类
    'xxx.pipelines.VideoDownloadPipeline': 301,  # 创建的管道类
                 } # 数字为优先级

# 打开中间件(看自己需求是否开启)
DOWNLOADER_MIDDLEWARES = {
    # 第一个xxx为工程名,第二个xxx为默认中间件类名(一般情况下第二个xxx和第一个xxx一致)
   'xxx.middlewares.xxxDownloaderMiddleware': 290,
} # 数字为优先级

FILES_STORE = './video' # 视频保存路径,自行指定
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值