[파일] scrapy Scrapy 사진 및 사용자 정의 사진 펜던트 기능 블록을 다운로드

1. 브라우저 머리 파충류 위장, 프록시 IP를 설정

또는 setting.py에서 사용자 지정 ImagesPipeline의 USER_AGENT에 배치. 파이프 라인 미들웨어에 사진 원칙적으로 동등한 요청에 미들웨어 응답은 절편 그들에게 전송 한 후 추가 수정을 수정할 수.
예를 들면 :

#例如,在自定义管道上边添加
    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. 크롤러 액세스 지연, 다음 코드 설정 파일을 추가합니다 :

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)

정의 파일 다운로드 경로를 저장하는 새로운 필드와 같은 기본 scrapy의 images_url이기 때문에 4. 다음 코드 설정 파일을 추가합니다 :

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:]

마지막으로 제출 된 이미지 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) 자동 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 = scrapy.Field()

필드는 다음 파일 크롤러에 저장되고, 제출 된 문서 리퍼러 필드까지의 파이프 라인의 get_media_requests 마지막 방법.

    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. 절대 위치 아래의 서브 디렉토리이다. 방법은 IMAGES_STORE을 정의하는 setting.py 파일입니다. 다음 코드 파일 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.

게시 56 개 원래 기사 · 원 찬양 2 ·은 30000 +를 볼

추천

출처blog.csdn.net/fan13938409755/article/details/104819176