[Python 크롤러 시리즈 자습서 29-100] 미스 시스터는 스크래피 프레임 워크를 통해 전체 뷰티 네트워크를 탐색하고 필요한 양을 파악하고 주로 사용자 지정 파이프 라인 (그림 및 CSV)을 배우는 방법을 가르칩니다.

2021 년인데 좋아하는 뷰티 사진을 크롤링하지 않았습니다. 내 크롤러가 겉으로 보이나요? 하지만 괜찮아요. 현재 인터페이스가 바뀌었지만 2021 년에 전체 뷰티 네트워크를 얻는 방법에 대해 이야기 할 것입니다. 이것은 개선 된 프로젝트입니다. 저는 이해하기 어려운 몇몇 아이디어 등 제 자신의 많은 아이디어에 참여했습니다. 제가 직접 사용하고 있습니다. 간단하게 깨달았고, 좋은 실현이라고 생각합니다.보실 수 있습니다. 첫 번째 크롤링의 결과입니다.

소개

Scrapy 프레임 워크 기반 뷰티 웹 크롤링

크롤러 항목 주소 : http://www.meinv.hk/?cat=2

크롤러가 정상적으로 실행 중이지만 데이터가없는 경우 가능한 이유는 사이트에 액세스하려면 사다리가 필요하기 때문입니다.

여기서는 주로 커스텀 픽쳐 파이프 라인과 커스텀 csv 데이터 파이프 라인의 두 가지 기술 포인트를 배웁니다.

구현 프로세스

프로젝트를 만드는 것은 말할 것도없이 너무 간단합니다.

웹 사이트 열기


클릭하는 과정에서 구체적인 크롤링 아이디어를 얻고, 먼저 인기있는 추천 태그를 크롤링 한 다음 각 미녀의 특정 사진의 URL을 얻는다.

그런 다음 규칙을 사용하십시오.

응답에서 URL을 크롤링하는 규칙은 규칙에 지정되어 있습니다. 크롤링을 통해 얻은 URL은 다시 요청되고 콜백 함수 및 팔로우 속성의 설정에 따라 구문 분석 또는 추적됩니다.

여기에서 두 가지 사항이 강조됩니다.

  • 하나는 첫 번째 URL 요청의 응답을 포함하여 반환 된 모든 응답에서 URL을 추출하는 것입니다.
  • 두 번째는 규칙 목록에 지정된 모든 규칙이 실행된다는 것입니다.

pipeline.py를 입력하고 scrapy.pipelines.images에서 가져 오기 이미지를 가져오고 ImagesPipeline을 상속합니다.

스크래피와 함께 제공되는 ImagesPipeline을 기반으로 사용자 지정 파이프 라인을 완료 할 수 있습니다.
ImagesPipeline에서 세 가지 메소드를 다시 작성할 수 있습니다. get_media_requests (), file_path (), item_completed ()

여기에 사진 설명 삽입

특정 코드

사용자 지정 파이프 라인 (그림 및 CSV)을 사용하고 있으므로 item.py 를 작성할 필요가 없습니다.

mv.py

from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule

class MvSpider(CrawlSpider):
    name = 'mv'
    allowed_domains = ['www.meinv.hk']
    start_urls = ['http://www.meinv.hk/?cat=2']

    # 增加提取 a 标签的href连接的规则
    # 将提取到的href连接,生成新的Request 请求, 同时指定新的请求后解析函数
    rules = (
        # allow 默认使用正则的表达式,查找所有a标签的href
        # follow 为True时,表示在提取规则连接下载完成后,是否再次提取规则中连接
        Rule(LinkExtractor(allow=r'p=\d+'), callback='parse_item', follow=True),

    )

    def parse_item(self, response):
        item = {}
        info = response.xpath('//div[@class="wshop wshop-layzeload"]/text()').extract_first()
        try:
            item['hometown'] = info.split("/")[2].strip().split()[1]
            item['birthday'] = info.split("/")[1].strip().split()[1]
        except:
            item['birthday'] = "未知"
            item['hometown'] = "未知"
        item['name'] = response.xpath('//h1[@class="title"]/text()').extract_first()
        images = response.xpath('//div[@class="post-content"]//img/@src')
        try:
            item['image_urls'] = images.extract()
        except:
            item['image_urls'] = ''
        item['images'] = ''
        item['detail_url'] = response.url
        yield item

middlewares.py

import random

from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware


class RandomUserAgentMiddleware(UserAgentMiddleware):
    def __init__(self, user_agent_list):
        super().__init__()
        self.user_agent_list = user_agent_list

    @classmethod
    def from_crawler(cls, crawler):
        return cls(user_agent_list=crawler.settings.get('USER_AGENT_LIST'))

    def process_request(self, request, spider):
        user_agent = random.choice(self.user_agent_list)
        if user_agent:
            request.headers['User-Agent'] = user_agent
        return None

pipelines.py

import csv
import os
from hashlib import sha1

from scrapy import Request
from scrapy.pipelines.images import ImagesPipeline
from meinv import settings


class MvImagePipeline(ImagesPipeline):
    def get_media_requests(self, item, info):
        for url in item['image_urls']:
            yield Request(url, meta={'name': item['name']})

    def item_completed(self, results, item, info):
        #将下载完成后的图片路径设置到item中
        item['images'] = [x for ok, x in results if ok]
        return item


    def file_path(self, request, response=None, info=None):
        # 为每位人员创建一个目录,存放她自己所有的图片
        author_name = request.meta['name']
        author_dir = os.path.join(settings.IMAGES_STORE, author_name)
        if not os.path.exists(author_dir):
            os.makedirs(author_dir)
        #从连接中提取文件名和扩展名
        try:
            filename = request.url.split("/")[-1].split(".")[0]
        except:
            filename = sha1(request.url.encode(encoding='utf-8')).hexdigest()
        try:
            ext_name = request.url.split(".")[-1]
        except:
            ext_name = 'jpg'

        # 返回的相对路径
        return '%s/%s.%s' % (author_name, filename, ext_name)


class MeinvPipeline(object):
    def __init__(self):
        self.csv_filename = 'meinv.csv'
        self.existed_header = False
    def process_item(self, item, spider):
        # item dict对象,是spider.detail_parse() yield{}输出模块
        with open(self.csv_filename, 'a', encoding='utf-8') as f:
            writer = csv.DictWriter(f, fieldnames=(
                'name', 'hometown', 'birthday', 'detail_url'))
            if not self.existed_header:
                # 如果文件不存在,则表示第一次写入
                writer.writeheader()
                self.existed_header = True
            image_urls = ''
            for image_url in item['image_urls']:
                image_urls += image_url + ','
            image_urls.strip("\"").strip("\'")
            data = {
                'name': item['name'].strip(),
                'hometown': item['hometown'],
                'birthday': item['birthday'].replace('年', '-').replace('月', '-').replace('日', ''),
                'detail_url': item['detail_url'],
            }
            writer.writerow(data)
            f.close()
        return item

Setting.py

import os

BOT_NAME = 'meinv'

SPIDER_MODULES = ['meinv.spiders']
NEWSPIDER_MODULE = 'meinv.spiders'

# Obey robots.txt rules
ROBOTSTXT_OBEY = False

DOWNLOAD_DELAY = 1

DOWNLOADER_MIDDLEWARES = {
   'meinv.middlewares.RandomUserAgentMiddleware': 543,
}

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# ImagePipeline 存放图片使用的目录位置
IMAGES_STORE = os.path.join(BASE_DIR, 'images')

ITEM_PIPELINES = {
    'meinv.pipelines.MeinvPipeline': 300,
    'meinv.pipelines.MvImagePipeline':100
}


USER_AGENT_LIST = [
    'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1'
]

1. 파일 디렉토리

2. 누군가의 사진

3.csv 파일 내용

여기에 사진 설명 삽입

마지막으로 아름다운 사진 몇 장

코드 다운로드

https://download.csdn.net/download/weixin_54707168/15902904

추천

출처blog.csdn.net/weixin_54707168/article/details/114984536