2022 クローラー クラス、Scrapy+BloomFilter を使用してインクリメンタル クローラーを作成

Nuggets コミュニティに記事を公開し、本文の最初の文に「『Nuggets・Sailing Plan』に参加しています」と追記

前に書く

今日で78回目のPythonクローラーブログ、ここにフラグを立てて、10月1日までに100件のクローラーケースを書き終えるように努力してください. 最初の記事から見た場合は、クローラーコーダーの資格があるはずです, 続けてください! !

引き続きインクリメンタル クローラーを取得します。この記事には 2 つの Python モジュールが含まれます。1 つは Scrapy で、もう 1 つは BloomFilter です。

BloomFilter(ブルームフィルター)の利用シーン

BloomFilter を発明した人物とその理由については、この記事では詳しく説明しませんが、以下では主に BloomFilter が使用されるシナリオについて説明します。

  1. ブラックリスト申請(メールブラックリスト)
  2. Web クローラーの重複排除 (これから学習するインクリメンタル クローラーに関連)
  3. KVシステムは、キーが存在するかどうかを迅速に判断します
  4. キャッシュ侵入の減少

今日マスターしなければならないライブラリはpybloom_live、そのソース コードについて呼び出されます. 最新バージョンについては、pypi.org/project/pyb… を参照してください。

まず、依存ライブラリを確認するために github に行きます. ここは非常に重要です. フォローアップに注意を払わないと簡単に覆されます. github.com/joseph-fox/…依存ライブラリをチェックインし、あなたには必要だbitarray

ここに画像の説明を挿入

最初にインストールしなかったため、次のエラーが発生しました. VC++14 は存在しないことに注意してください。

ここに画像の説明を挿入

開くhttps://www.lfd.uci.edu/~gohlke/pythonlibs/#bitarray対応するバージョンの Python がローカルにインストールされているコンピューターを見つけます. 私はバージョン 3.7 を使用しています, ダウンロードするだけです. このコンテンツのインストールについては、以前のブログで説明しました.

ここに画像の説明を挿入

第一歩:

ここに画像の説明を挿入

ステップ2:

インストールpybloom_live

ここに画像の説明を挿入

pybloom_live クイック スタート

pybloom_liveBloomFilter 固定容量と ScalableBloomFilter スケーラブルの 2 つの単純な使用方法があります。率直に言えば、固定および動的拡張です。

上記は私が投げたレンガです(Baidu、まだ多くの基本的な指示があります)

次にBloomFilterファイルを操作するクラスを使って重複排除を実現します.ここで重複排除BloomFilterはファイルの読み書きで行うことに注意してください.マルチプロセスやマルチスレッドのクローラーを書く場合は,それを使う際に相互排除と同期を追加する必要があります. . 条件は、ファイル I/O 操作と同様に、BloomFilterバッチ書き込みとバッチ読み取りに注意してください。そうしないと、効率が大きく影響されます。

クラスファイルを宣言しbloomcheck.py、次のコードを記述します。コードの説明はコメントに配置されています

from pybloom_live import BloomFilter
import os
import hashlib
class BloomCheck(object):
    def __init__(self):
        '''
        以下代码用于判断bf布隆文件是否存在,存在打开,不存在新建
        '''
        self.filename = 'bloomfilter.bf'
        is_exist = os.path.exists(self.filename)
        if is_exist:
            self.bf = BloomFilter.fromfile(open(self.filename, 'rb'))
        else:
            # capacity是必选参数,表示容量 error_rate是错误率
            self.bf = BloomFilter(capacity=100000000, error_rate=0.001)

    def process_item(self, data):
        data_encode_md5 = hashlib.md5(data.encode(encoding='utf-8')).hexdigest()
        if data_encode_md5 in self.bf:
            # 如果data存在,返回False
            return False

        else:
            # 如果data不存在,新增到bf文件中,返回True
            self.bf.add(data_encode_md5)
            return True

    def save_bloom_file(self):
        self.bf.tofile(open(self.filename, 'wb'))
复制代码

スクレイピー クローラー コード

基本的なクローラ部分についてはコアクローラのソースコード部分のみ表示responseします. 解析に関してはやはり基本的な判断を先に行います.titleすでに存在する場合bf文件(上記のコードで動的にファイルが作成されます) は追加されません. 、それ以外の場合、データは反復されます。

完全なコードは添付ファイルにアップロードされ、記事の最後でダウンロードできます

class IndexSpider(scrapy.Spider):
    name = 'index'
    allowed_domains = ['xz.aliyun.com']
    start_urls = ['http://xz.aliyun.com/']
    bf = BloomCheck()
    def parse(self, response):
        li_list = response.xpath("//a[@class='topic-title']")
        for li in li_list:
            de_item = DeItem()
            title = li.xpath("./text()").extract_first().strip()
            # 判断title是否在bf文件中,如果不在,返回新数据
            if self.bf.process_item(title):
                de_item['title'] = title
                de_item['url'] = "https://xz.aliyun.com" + li.xpath("./@href").extract_first()
                yield de_item
            else:
                print(f"--{title}--数据已经存在,不进行添加")

        # 保存数据
        self.bf.save_bloom_file()
复制代码

スクレイピーのスケジュールされたタスクを設定する

run.bat バッチファイルを作成し、クローラプログラムと同じディレクトリに配置します. 他のディレクトリも
変更できます. 以下のパスは独自のパスに変更できます.

@echo off
rem
E:
cd E:\crawl100\demo78\de\de

scrapy crawl index
rem pause
exit
复制代码

Windows のスケジュールされたタスク スケジュールをカスタマイズする [コントロール パネル] の [管理ツール] の下にある [タスク スケジューラ] を見つけて、[基本タスクの作成] を開きます。プログラムを起動した後、bat ファイルの場所を選択します。テスト時に時間に注意を払うようにタスクをスケジュールします。

ここに画像の説明を挿入

この場所では、比較的詳細なブログを見つけることができます。内容は比較的単純です。繰り返しません: blog.csdn.net/Gpwner/arti…

裏に書く

本日のインクリメンタルクローラーはこちらです、この記事が参考になれば幸いです~

おすすめ

転載: juejin.im/post/7146209736613068808