文章目录
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' # 视频保存路径,自行指定