【Python堪能100日】44日目:Python Webクローラー開発_クローラー基礎(クローラーデータストレージ:基本ファイルストレージ、MySQL、NoSQL:MongDB、Redisデータベースストレージ+実戦コード)

目次

1 データストレージ

1.1 クローラーストレージ: 基本的なファイルストレージ

1.2 クローラーストレージ: MySQL データベースを使用する

1.3 クローラー NoSQL データベースの使用

1.3.1 MongoDB の概要

1.3.2 MongoDB の使用法

1.3.1 クローラーストレージ: MongoDB データベースを使用する

1.4 Redisデータベースの使用

1.4.1 主な特長

1.4.2 一般的な用途

1.4.3 Redisデータベースの使用

 1.4.4 クローラーストレージ: Redis データベースを使用する

2 実際のWebクローラデータ保管例

3 Webページ上の書籍情報の実際のクローリング


1 データストレージ

1.1 クローラーストレージ: 基本的なファイルストレージ

   クローラーでは、テキスト ファイル (txt)、JSON ファイル、CSV ファイルなど、さまざまな形式を使用してキャプチャされたデータを保存できます。

テキストファイルの保存例:

with open('data.txt', 'w') as file:
    file.write('Hello, World!')

JSON ファイルストレージの例:

import json

data = {'name': 'John', 'age': 30}
with open('data.json', 'w') as file:
    json.dump(data, file)

CSVファイルの保存例:

import csv

data = [['name', 'age'], ['John', 30], ['Alice', 25]]
with open('data.csv', 'w', newline='') as file:
    writer = csv.writer(file)
    writer.writerows(data)

1.2 クローラーストレージ: MySQL データベースを使用する

        MySQL はリレーショナル データベース管理システムであり、Pythonmysql.connectorモジュールを使用して MySQL データベースに接続し、操作できます。

        クローラーで MySQL データベースを使用する基本的な手順には、データベースへの接続、データ テーブルの作成、キャプチャされたデータのデータベースへの保存が含まれます。以下は、クローラーで MySQL データベースを使用して、クロールされた書籍情報を保存する方法を示す簡単な例です。

例: キャプチャした書籍情報を MySQL データベースに保存する

mysql-connector-pythonまず、 MySQL データベースに接続するための Python ライブラリであるライブラリがインストールされていることを確認します。

pip install mysql-connector-python

次に、MySQL データベースに名前を付けたデータベースbooksと、book_info書籍情報を格納する名前のデータ テーブルを作成する必要があります。

CREATE DATABASE books;
USE books;

CREATE TABLE book_info (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255),
    author VARCHAR(255),
    price DECIMAL(10, 2)
);

次に、次のコード例を使用して、キャプチャした書籍情報を MySQL データベースに保存できます。 

import requests
import mysql.connector
from bs4 import BeautifulSoup

# 抓取数据
url = 'https://www.example.com/books'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')

# 连接到 MySQL 数据库
connection = mysql.connector.connect(
    host='localhost',
    user='username',
    password='password',
    database='books'
)
cursor = connection.cursor()

# 解析并存储数据到数据库
book_elements = soup.find_all('div', class_='book')
for book_element in book_elements:
    title = book_element.find('h2').text
    author = book_element.find('p', class_='author').text
    price = float(book_element.find('p', class_='price').text.replace('$', ''))
    
    # 插入数据
    insert_query = "INSERT INTO book_info (title, author, price) VALUES (%s, %s, %s)"
    values = (title, author, price)
    cursor.execute(insert_query, values)

connection.commit()

# 关闭连接
cursor.close()
connection.close()

print("Book data saved to MySQL database.")

この例では、キャプチャした書籍情報を MySQL データベースに保存する方法を示します。実際のアプリケーションでは、実際の状況に応じてデータベース接続パラメータ、Web ページの解析方法、データ テーブルの構造を変更する必要があります。同時に、例外処理などのメカニズムを追加して、データ ストレージの安定性を確保することもできます。 

1.3 クローラー NoSQL データベースの使用

        NoSQL (Not Only SQL) は、データの保存に従来のテーブルやリレーションシップを使用しない非リレーショナル データベースです。大規模、高性能、分散環境でのデータ ストレージに適しています。

1.3.1 MongoDB の概要

        MongoDB は、データをドキュメントの形式で保存するオープンソースの NoSQL データベースです。柔軟なスキーマ設計、水平方向の拡張性、および高いパフォーマンスが特徴です。

1.3.2 MongoDB の使用法

from pymongo import MongoClient

# 创建数据库连接
client = MongoClient('mongodb://localhost:27017/')

# 创建或选择数据库和集合
db = client['mydb']
collection = db['mycollection']

# 插入文档
data = {'name': 'John', 'age': 30}
insert_result = collection.insert_one(data)
print(insert_result.inserted_id)

# 查询文档
query = {'name': 'John'}
result = collection.find_one(query)
print(result)

# 更新文档
update_query = {'name': 'John'}
new_values = {'$set': {'age': 31}}
collection.update_one(update_query, new_values)

# 删除文档
delete_query = {'name': 'John'}
collection.delete_one(delete_query)

# 关闭连接
client.close()

1.3.1 クローラーストレージ: MongoDB データベースを使用する

        クローラーで MongoDB データベースを使用する手順には、データベースへの接続、コレクション (テーブルと同様) の作成、収集されたデータのコレクションへの保存が含まれます。次の例は、MongoDB データベースを使用して、クロールされた書籍情報をクローラーに保存する方法を示しています。

例: キャプチャした書籍情報を MongoDB データベースに保存する

pymongoまず、 MongoDB データベースに接続するための Python ライブラリであるライブラリがインストールされていることを確認します。

pip install pymongo

次に、MongoDB データベースを起動し、データベース (たとえばbooks_db) とコレクション (たとえばbook_collection) を作成する必要があります。

次に、次のコード例を使用して、取得した書籍情報を MongoDB データベースに保存できます。

import requests
import pymongo
from bs4 import BeautifulSoup

# 抓取数据
url = 'https://www.example.com/books'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')

# 连接到 MongoDB 数据库
client = pymongo.MongoClient('mongodb://localhost:27017/')
db = client['books_db']
collection = db['book_collection']

# 解析并存储数据到集合
book_elements = soup.find_all('div', class_='book')
for book_element in book_elements:
    title = book_element.find('h2').text
    author = book_element.find('p', class_='author').text
    price = float(book_element.find('p', class_='price').text.replace('$', ''))
    
    # 插入数据
    book_data = {'title': title, 'author': author, 'price': price}
    collection.insert_one(book_data)

print("Book data saved to MongoDB database.")

         この例では、キャプチャした書籍情報を MongoDB データベースに保存する方法を示します。実際のアプリケーションでは、実際の状況に応じてデータベース接続パラメータ、Web ページの解析方法、およびコレクション名を変更する必要があります。同時に、例外処理などのメカニズムを追加して、データ ストレージの安定性を確保することもできます。

1.4 Redisデータベースの使用

    Redis データベースは通常、キャッシュ、データ ストレージ、メッセージ キューなどのシナリオで使用されます。Redis の目的については以下で詳しく説明し、Python で Redis を使用する方法を示す基本的な例を示します。

1.4.1 主な特長

  1. インメモリ データベース: Redis データベースはデータをメモリに保存するため、アクセスは非常に高速です。
  2. 複数のデータ構造: Redis は文字列、ハッシュ、リスト、セット、順序付きセットなどの複数のデータ構造をサポートしており、さまざまなデータ ストレージのニーズに適しています。
  3. 永続性: Redis はメモリ内のデータをディスクに永続化し、再起動後にデータを復元できます。
  4. 分散: Redis は分散デプロイメントをサポートしており、マスター/スレーブのレプリケーションやフラグメンテーションなどのメカニズムを設定できます。
  5. 高いパフォーマンス: Redis は効率的なデータ構造とストレージ エンジンを使用しており、優れた読み取りおよび書き込みパフォーマンスを備えています。
  6. トランザクションのサポート: Redis はトランザクションをサポートしており、アトミック性を確保するために複数の操作を 1 つのトランザクションにパッケージ化して実行できます。
  7. パブリッシュ/サブスクライブ: Redis は、メッセージ パブリッシュ モードとサブスクリプション モードを実装するためのパブリッシュ/サブスクライブ メカニズムを提供します。
  8. 有効期限:キーの有効期限を設定できます。その後、キーは自動的に削除されます。
  9. Lua スクリプト: Redis は、サーバー側で複雑な操作を実行できる Lua スクリプトの実行をサポートしています。

1.4.2 一般的な用途

  1. キャッシュ: Redis は、よく使用されるデータをキャッシュしてデータ アクセスを高速化するのに適しています。
  2. セッション管理: Web アプリケーションでは、Redis を使用してユーザー セッション情報を保存できます。
  3. リアルタイム統計: Redis は、リアルタイム統計、カウンター、その他の機能に使用できます。
  4. メッセージ キュー: Redis のパブリッシュ/サブスクライブ メカニズムは、軽量のメッセージ キューを実装できます。
  5. Leaderboard: Redis の順序付けられたコレクションを使用して、リーダーボードなどの機能を実装できます。
  6. 分散ロック: Redis を使用して分散ロックを実装し、同時アクセスを制御できます。
  7. データベースの負荷を軽減する:データベースの負荷を軽減するために、クエリ結果の一部を Redis に保存します。

1.4.3 Redisデータベースの使用

Redis (Remote Dictionary Server) は、オープンソースの高性能キー/値ストレージ システムであり、キャッシュ、データ ストレージ、メッセージ キュー、カウンター、リアルタイム分析などのさまざまなアプリケーション シナリオで広く使用されています。

 1 インストールredisモジュール

pip install redis

    2 使用例

import redis

# 创建连接
r = redis.Redis(host='localhost', port=6379, db=0)

# 存储数据
r.set('key', 'value')  # 存储字符串类型数据
r.hset('user:1', 'name', 'John')  # 存储哈希类型数据
r.hset('user:1', 'age', 30)  # 存储哈希类型数据

# 获取数据
value = r.get('key')
print("Value:", value.decode('utf-8'))

user_info = r.hgetall('user:1')
print("User Info:", user_info)

# 删除数据
r.delete('key')
r.hdel('user:1', 'age')

# 设置过期时间
r.setex('key', 3600, 'value')  # 设置键的过期时间(单位为秒)

# 发布和订阅
def subscriber():
    pubsub = r.pubsub()
    pubsub.subscribe(['channel'])  # 订阅名为 'channel' 的频道
    for message in pubsub.listen():
        print("Received:", message['data'])
        
def publisher():
    r.publish('channel', 'Hello, Subscribers!')  # 向频道发布消息

# 事务
def perform_transaction():
    with r.pipeline() as pipe:
        while True:
            try:
                pipe.watch('balance')  # 监视键 'balance'
                balance = int(pipe.get('balance'))
                if balance >= 10:
                    pipe.multi()  # 开始事务
                    pipe.decrby('balance', 10)  # 减少余额
                    pipe.incrby('expenses', 10)  # 增加支出
                    pipe.execute()  # 执行事务
                    break
                else:
                    print("Insufficient balance.")
                    break
            except redis.WatchError:
                continue

# 持久化
r.save()  # 手动触发持久化操作
r.bgsave()  # 后台进行持久化

# 关闭连接
r.close()

これらの例では、さまざまな保存方法 (テキスト、JSON、CSV、データベース) を使用してクローラーによってクロールされたデータを保存する方法と、MySQL、MongoDB、および Redis データベースに接続して操作する方法を紹介します。具体的な使用方法はニーズや環境に応じて若干異なりますが、これらの例に基づいてより深く学び、実践することができます。

 1.4.4 クローラーストレージ: Redis データベースを使用する

例: クロールされた Web ページのリンクを Redis データベースに保存する

redisまず、ライブラリ (Redis データベースに接続するための Python ライブラリ) がインストールされていることを確認します。

次に、Redis サーバーを起動する必要があります。次に、次のコード サンプルを使用して、クロールされた Web ページのリンクを Redis データベースに保存できます。

import requests
import redis
from bs4 import BeautifulSoup

# 抓取数据
url = 'https://www.example.com'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')

# 连接到 Redis 数据库
r = redis.Redis(host='localhost', port=6379, db=0)

# 解析并存储数据到 Redis 数据库
link_elements = soup.find_all('a')
for link_element in link_elements:
    link = link_element.get('href')
    if link and link.startswith('http'):
        r.sadd('links', link)

print("Links data saved to Redis database.")

この例では、ターゲット Web ページからすべてのリンクを取得し、saddRedis のコレクション データ型 (メソッド) を使用してそれらを Redis データベースに保存します。

この例は単なるデモンストレーションであり、実際のニーズに応じて、データ クリーニング、重複排除、永続化などの機能をクローラに追加できます。同時に、実際の状況に応じて Redis データベースの接続パラメーターを構成する必要があります。

2 実際のWebクローラデータ保管例

        以下は、クロールされたデータをテキスト ファイル、JSON ファイル、および MySQL データベースにクローラーに保存する方法を示す簡単な例です。

import requests
import json
import mysql.connector

# 抓取数据
response = requests.get('https://api.example.com/data')
data = response.json()

# 文本文件存储
with open('data.txt', 'w') as file:
    for item in data:
        file.write(f"{item['name']} - {item['value']}\n")

# JSON 文件存储
with open('data.json', 'w') as file:
    json.dump(data, file, indent=4)

# 数据库存储
connection = mysql.connector.connect(
    host='localhost',
    user='username',
    password='password',
    database='mydatabase'
)

cursor = connection.cursor()
for item in data:
    query = "INSERT INTO data_table (name, value) VALUES (%s, %s)"
    values = (item['name'], item['value'])
    cursor.execute(query, values)

connection.commit()
cursor.close()
connection.close()

3 Webページ上の書籍情報の実際のクローリング

urllibWeb クローラーの簡単な例。ライブラリ、ライブラリ、プロキシ、データ ストアの使用をカバーしますBeautiful Soupこの例では、Web ページ上の書籍情報を取得し、取得したデータを JSON ファイルに保存します。

import urllib.request
from bs4 import BeautifulSoup
import json

# 定义目标网页的 URL
url = 'https://www.example.com/books'

# 定义代理(如果需要使用代理)
proxies = {'http': 'http://proxy.example.com:8080'}

# 发起请求,使用代理
req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'})
response = urllib.request.urlopen(req, proxies=proxies)

# 解析网页内容
soup = BeautifulSoup(response, 'html.parser')

# 创建一个空的书籍列表
books = []

# 获取书籍信息
book_elements = soup.find_all('div', class_='book')
for book_element in book_elements:
    title = book_element.find('h2').text
    author = book_element.find('p', class_='author').text
    price = book_element.find('p', class_='price').text
    books.append({'title': title, 'author': author, 'price': price})

# 存储到 JSON 文件
with open('books.json', 'w') as file:
    json.dump(books, file, indent=4)

print("Books data saved to 'books.json'")

おすすめ

転載: blog.csdn.net/qq_35831906/article/details/132412330