【Scrapy 图片和文件】scrapy自定义图片下载挂件功能板块

1.浏览器头来伪装爬虫、设置代理Ip

在setting.py或者在自定义的ImagesPipeline中设置USER_AGENT。原理图片管道相当于一个中间件,中间件把response发送的请求拦截下来,然后加以修改再修饰。
比如:

#例如,在自定义管道上边添加
    def get_media_requests(self, item, info):
 
        image_url = item["pic_url"]
        # headers是请求头主要是防反爬虫
        header = {
            "referer":item["referer"],
            "user-agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36",
                  }
        yield scrapy.Request(image_url, headers=header)

设置代理IP如下代码,这里使用下载的中间间来调度。

import  random
PROXY_http = [
    '153.180.102.104:80',
    '195.208.131.189:56055',
]
PROXY_https = [
    '120.83.49.90:9000',
    '95.189.112.214:35508',
]
class MovieproDownloaderMiddleware(object):
    #拦截正常的请求,参数request就是拦截到的请求对象
    def process_request(self, request, spider):
        #实现:将拦截到的请求尽可能多的设定成不同的请求载体身份标识
        request.headers['User-Agent'] = random.choice(user_agent_list)
        #代理操作
        if request.url.split(':')[0] == 'http':
            request.meta['proxy'] = 'http://'+random.choice(PROXY_http) #http://ip:port
        else:
            request.meta['proxy'] = 'https://' + random.choice(PROXY_https)  # http://ip:port
        return None
    #拦截响应:参数response就是拦截到的响应
    def process_response(self, request, response, spider):
        return response
    #拦截发生异常的请求
    def process_exception(self, request, exception, spider):
        #拦截到异常的请求然后对其进行修正,然后重新进行请求发送
        # 代理操作
        if request.url.split(':')[0] == 'http':
            request.meta['proxy'] = 'http://' + random.choice(PROXY_http)  # http://ip:port
        else:
            request.meta['proxy'] = 'https://' + random.choice(PROXY_https)  # http://ip:port

        return request  #将修正之后的请求进行重新发送

2.设置爬虫访问延迟,在setting文件中添加如下代码:

DOWNLOAD_DELAY = 3

3.怎么自创建下载分目录,在自定义图片下载管道文件中

    def item_completed(self, results, item, info):
        # image_path 得到的是保存在full目录下用哈希值命名的图片列表路径
        # image_path = ['full/5db315b42dfc54a0d2bd0488c87913dfc25a71ef.jpg']
        image_path = [x["path"] for ok,x in results if ok]
 
        # 定义分类保存的路径
        # img_path 得到的是settings中定义的路径+套图名称
        new_path = '%s\%s'%(self.IMAGES_STORE,item["pic_title"])
 
        # 如果目录不存在,则创建目录
        if not os.path.exists(new_path):
            os.mkdir(new_path)

4.自定义新的字段去存储文件下载路径,因为scrapy默认的是images_url,在setting文件中添加如下代码:

IMAGES_URLS_FIELD = '你自定义的图像下载地址'
IMAGES_RESULT_FIELD = '你自定义下载的图片名称'

5.怎么命名新的文件名,并转移到新的路径下,在自定义的图片管道下载文件中:

实现方式(1)

from scrapy.pipelines.images import ImagesPipeline
from scrapy.utils.project import get_project_settings
import scrapy
import os
import shutil
    def item_completed(self, results, item, info):
        # 将文件从默认下路路径移动到指定路径下
        # self.IMAGES_STORE + "\\" + image_path[0] 就是原路径 G:\Fa24\full/5db315b42dfc54a0d2bd0488c87913dfc25a71ef.jpg
        # image_path[0][image_path[0].find("full\\")+6:] 把原目录'full/5db315b42dfc54a0d2bd0488c87913dfc25a71ef.jpg'中的“full/”去掉#,得到的是哈希值命名的图片名
        pic_name = image_path[0][image_path[0].find("full\\")+6:] 
        old_path = self.IMAGES_STORE + "\\" + image_path[0]
        #把文件从默认路径转移的新的路径
        shutil.move(old_path, new_path + "\\" + pic_name)
        # 哈希值的名字太长太长了,改一下名吧
        os.rename(new_path + "\\" + pic_name,new_path + "\\" + item["pic_name"])
        # 把图片路径传回给item
        item["pic_url"] = new_path + "\\" + item["pic_name"]
        # item["pic_url"] = new_path + "\\" + image_path[0][image_path[0].find("full\\")+6:]

注意最后提交的image_url提交的是文件的存储位置。

提交方式(2)在自定义管道中的file_path方法中,其中包含了洗图片名称字符串乱码的方法,怎么给图片改名字

  def get_media_requests(self, item, info):
#这里要把image_urls字段提交上去,用meta来提交
        image_url = item['image_urls']
        yield scrapy.Request(image_url,meta={'name':item['image_name']})

    def file_path(self, request, response=None, info=None):
        name = request.meta['name'] # 接收上面meta传递过来的图片名称                                       
        name = re.sub(r'[?\\*|“<>:/]', '', name) # 过滤windows字符串,不经过这么一个步骤,你会发现有乱码或无法下载
        filename= name +'.jpg' #添加图片后缀名
        return filename

提交方式(3)在py文件中file_path方法中自动添加文档分类,这个必须要写get_media_requests

    def file_path(self, request, response=None, info=None):
        item = request.meta['item']
        title = item['name']
        image_guid = request.url.split('/')[-1]
        filename = 'full/{0}/{1}'.format(title, image_guid)
        return filename
 
    def get_media_requests(self, item, info):
        """
        :param item: spider.py中返回的item
        :param info:
        :return:
        """
        for img_url in item['imgs_url']:
            referer = item['url']
            yield Request(img_url, meta={'item': item,
                                         'referer': referer})

6.图片反倒链

具体做法,在item.py建立一个字段,专门来储存referer字段

# 反爬虫用的反重定向地址
referer = scrapy.Field()

然后在爬虫文件中存储该字段,最后在管道文件中的get_media_requests方法中把referer字段提交上去。

    def get_media_requests(self, item, info):
 
        image_url = item["pic_url"]
        # headers是请求头主要是防反爬虫
        header = {
            "referer":item["referer"],
            "user-agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36",
                  }
        yield scrapy.Request(image_url, headers=header)

7.怎么将设置图片下载位置的起始文件夹,起始在管道文件中改变的目录是绝对位置下的分目录。方法是在setting.py文件中把IMAGES_STORE给定义了。在setting.py文件中添加如下代码

import os
project_dir = os.path.abspath(os.path.dirname(__file__))
IMAGES_STORE = os.path.join(project_dir, 'images')

8.测试的时候只输出错误信息,并且输出到特定的文件中,在setting.py文件中添加如下字段:

LOG_LEVEL = 'ERROR'
#将日志信息存储到指定文件中,不在终端输出
LOG_FILE = 'log.txt'

9.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Scrapy是一个强大的Python爬虫框架,可以用于抓取网页数据。在Scrapy中,可以使用自定义的Pipeline来实现图片下载功能。 首先,你需要在Scrapy项目中创建一个自定义的Pipeline来处理图片下载。在该Pipeline中,你可以使用Python的requests库或者Scrapy提供的内置函数来下载图片。 以下是一个简单的示例代码,展示了如何在Scrapy中实现图片下载功能: ```python import scrapy from scrapy.pipelines.images import ImagesPipeline class MyImagesPipeline(ImagesPipeline): def get_media_requests(self, item, info): for image_url in item['image_urls']: yield scrapy.Request(image_url) def file_path(self, request, response=None, info=None): # 自定义图片保存路径 image_guid = request.url.split('/')[-1] return 'images/%s' % (image_guid) ``` 在上述代码中,`get_media_requests`方法用于获取要下载的图片URL,并通过`yield`关键字将其传递给Scrapy引擎进行下载。`file_path`方法用于指定图片保存的路径。 接下来,在你的Scrapy项目的settings.py文件中,将自定义的Pipeline添加到ITEM_PIPELINES配置项中: ```python ITEM_PIPELINES = { 'your_project_name.pipelines.MyImagesPipeline': 1, # 其他的Pipeline... } ``` 最后,在你的Spider中,将需要下载图片的URL添加到item中,并在item中定义一个字段来存储这些URL: ```python import scrapy class MySpider(scrapy.Spider): name = 'my_spider' def start_requests(self): # 构造请求并发送给Scrapy引擎 yield scrapy.Request(url='http://example.com', callback=self.parse) def parse(self, response): # 解析网页内容,提取图片URL并存储到item中 item = {} item['image_urls'] = response.css('img::attr(src)').getall() yield item ``` 在上述代码中,`parse`方法中使用了CSS选择器来提取网页中的图片URL,并将其存储到item的`image_urls`字段中。 这样,当你运行Scrapy爬虫时,图片将会被下载并保存到指定的路径中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值