[Pythonクローラーシリーズチュートリアル29-100]スクレイピーなフレームワークを通じて、Miss Sisterは、ビューティーネット全体、必要な量をクロールし、主にカスタムパイプライン(写真とCSV)を学習する方法を教えます。

2021年ですが、お気に入りの美容写真をクロールしていません。クローラーは外を見ていますか?でも大丈夫です。現在のインターフェースは変わったのですが、2021年に美容ネットワーク全体をどうやって手に入れるかをお話します。これは改善されたプロジェクトです。理解しにくいものも含め、自分のアイデアの多くに参加しました。自分で使っていますが、簡単に実現できて良かったと思いますので、ご覧ください。最初のクロールの結果。

前書き

Scrapyフレームワークに基づく美容ウェブクロール

クローラーのエントリアドレス:http//www.meinv.hk/? cat = 2

クローラーは正常に実行されているがデータがない場合、考えられる理由は、サイトにアクセスするためのはしごが必要なことです。

ここでは、主に2つの技術的なポイント、カスタム画像パイプラインとカスタムcsvデータパイプラインについて学習します。

実装プロセス

プロジェクトの作成は、言うまでもなく単純すぎます。

ウェブサイトを開く


クリックの過程で、特定のクロールのアイデアが取得されます。最初に、人気のある推奨タグがクロールされ、次に各美しさの特定の画像のURLが取得されます。

次に、ルールを使用します。

応答でURLをクロールするためのルールは、ルールで指定されています。クロールによって取得されたURLは再度要求され、コールバック関数とfollow属性の設定に従って解析またはフォローアップされます。

ここでは2つのポイントが強調されています。

  • 1つは、最初のURL要求からの応答を含め、返されたすべての応答からURLを抽出することです。
  • 2つ目は、ルールリストで指定されたすべてのルールが実行されることです。

pipe.pyと入力し、scrapy.pipelines.imagesからインポートしてImagesPipelineをインポートし、ImagesPipelineを継承します

カスタムパイプラインは、scrapyに付属のImagesPipelineに基づいて完成させることができます。
ImagesPipelineの3つのメソッドを書き換えることができます: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

ミドルウェア.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

pipes.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
おすすめ