Nuggets コミュニティに記事を公開し、本文の最初の文に「『Nuggets・Sailing Plan』に参加しています」と追記
前に書く
今日で78回目のPythonクローラーブログ、ここにフラグを立てて、10月1日までに100件のクローラーケースを書き終えるように努力してください. 最初の記事から見た場合は、クローラーコーダーの資格があるはずです, 続けてください! !
引き続きインクリメンタル クローラーを取得します。この記事には 2 つの Python モジュールが含まれます。1 つは Scrapy で、もう 1 つは BloomFilter です。
BloomFilter(ブルームフィルター)の利用シーン
BloomFilter を発明した人物とその理由については、この記事では詳しく説明しませんが、以下では主に BloomFilter が使用されるシナリオについて説明します。
- ブラックリスト申請(メールブラックリスト)
- Web クローラーの重複排除 (これから学習するインクリメンタル クローラーに関連)
- KVシステムは、キーが存在するかどうかを迅速に判断します
- キャッシュ侵入の減少
今日マスターしなければならないライブラリは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_live
BloomFilter 固定容量と 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…
裏に書く
本日のインクリメンタルクローラーはこちらです、この記事が参考になれば幸いです~