Scrapy フレームワークの紹介
Scrapy フレームワークは、クローラを迅速に開発するためのフレームワークであり、少量のコードを記述するだけでクローラの効果を実現できます。
アドバンテージ
- 重複するコードの量を減らす
- 開発効率の向上
荒れたコンポーネント
- スパイダー フォルダー: クローラーを、クローラー間で独立した名前で保存します。
- init.py : 初期化ファイル
- settings.py: 設定ファイル、クローラの設定を設定します
- middlewares.py: リクエストをインターセプトし、Cookie、UserAgent、IP などの設定などのミドルウェア接続を構成するために使用されるミドルウェア ファイル。
- Pipelines.py: データを永続化するために使用されるパイプライン ファイル
- item.py: 取得する必要がある要素エンティティの属性を設定するために使用されるクラス ファイル
Scrapy フレームワークを使用して開発する
Douban Web サイトをクロールします。Python
環境では、pip を使用して Scrapy をインストールし、開発ディレクトリでコマンド ラインを開きます。
pip install Scrapy
インストールが完了したら、クローラー プロジェクトを作成します。プロジェクト名はカスタマイズできます。ここでは douban_scrapy です。
scrapy startproject douban_scrapy
作成後、生成されたクローラーディレクトリに入ります
cd douban_scrapy
クローラー ディレクトリに入ったら、クローラーを作成します。クローラーの名前はカスタマイズできます。ここでは douban です。クローラー名の後にクロール対象の Web サイトが続き、カスタマイズできます。
scrapy genspider douban https://movie.douban.com/top250
クローラーを作成した後、スパイダー フォルダー内に作成したばかりのクローラーが表示されます。次に、クローラー ディレクトリ内の settings.py ファイルを開いてクローラーの構成を設定し、このファイルに次のコードを追加します。
ログレベルの構成
LOG_LEVEL="WARNING"
プロキシを設定し、クローラを偽装します。UserAgent はブラウザの開発者ツールから取得できますが、以下と同じである必要はありません。
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.200"
サイトのローカルルールに従ってください
ROBOTSTXT_OBEY = True
最大リクエスト行数
CONCURRENT_REQUESTS = 8
頻繁なリクエストにより IP がブロックされるのを避けるためにリクエストを遅延します。
DOWNLOAD_DELAY = 3
クローラー情報を構成した後、item.py ファイルを開き、クロールするクラスを作成します
import scrapy
class MovieItem(scrapy.Item):
title = scrapy.Field()
rank = scrapy.Field()
subject = scrapy.Field()
作成したばかりのクローラー ファイル (douban.py) を開き、解析メソッドを変更します。
# 记住要用这个方式导入类
from ..items import MovieItem
(此方法用于解析得到的html文件)
def parse(self, response):
sel = scrapy.Selector(response)
list_items = sel.css('#content > div > div.article > ol > li')
for list_item in list_items:
movie_item = MovieItem()
movie_item['title'] = list_item.css('span.title::text').extract_first()
movie_item['rank'] = list_item.css('span.rating_num::text').extract_first()
movie_item['subject'] = list_item.css('span.inq::text').extract_first()
yield movie_item
Pipelines.py ファイルを開き、永続性情報を構成します。
方法 1: Excel 形式で保存し
、Excel ライブラリをインストールする
pip install openpyxl
Excel パイプライン クラスを構成する
class ExcelPipeline:
def __init__(self):
self.wb = openpyxl.Workbook()
self.ws = self.wb.active
self.ws.title = 'Top'
self.ws.append(('标题', '评分', '主题'))
def close_spider(self, spider):
self.wb.save('电影数据.xlsx')
def process_item(self, item, spider):
title = item.get('title', '')
rank = item.get('rank', '')
subject = item.get('subject', '')
self.ws.append((title, rank, subject))
return item
方法 2: mysql データベースとして保存し
、mysql データベースをインストールする
pip install pymysql
mysqlデータベースを構築するためのパイプラインクラス
class MysqlPipeline:
def __init__(self):
self.conn = pymysql.connect(host='127.0.0.1', port=3306, user='root',
password='1234', database='spider', charset='utf8mb4')
self.cursor = self.conn.cursor()
self.data = []
def close_spider(self, spider):
if len(self.data) > 0:
self.__write_to_DB()
self.conn.close()
def process_item(self, item, spider):
title = item.get('title', '')
rank = item.get('rank', 0)
subject = item.get('subject', '')
self.data.append((title, rank, subject))
if len(self.data) == 100:
self.__write_to_DB()
self.data.clear()
return item
def __write_to_DB(self):
self.cursor.executemany(
'insert into tb_douban_movie(title, rating, subject) values (%s,%s,%s)',
self.data
)
self.conn.commit()
上記 2 つの設定後、再度 settings.py ファイルを開いてパイプライン クラス情報を設定します。
ITEM_PIPELINES = {
# 设置管道类的优先级,数值越小优先级越高
"douban_scrapy.pipelines.ExcelPipeline": 300,
"douban_scrapy.pipelines.MysqlPipeline": 200,
}
コマンドラインを開き、クローラーディレクトリに再度入ります
cd douban_scrapy
クローラーを起動し、映画データという名前の Excel ファイルを取得します。データベースを表示してデータを見つけ、クロールを完了します。
scrapy scrawl douban