Pandas のワンクリック クロールとプロキシ IP の分析、およびプロキシ IP プールのメンテナンス

I.はじめに

プロキシ IP は現在、クローラーがデータを取得するために必要なツールの 1 つであり、IP ブロックや検証コードなどのクロール防止手段を回避するのに役立ちます。同時に、プロキシ IP を使用してマルチスレッドまたは分散クローラー機能を実装し、クローラーの効率を向上させることもできます。ただし、プロキシ IP の取得と検証は時間と労力がかかる作業であるため、プロキシ IP を自動的に取得して検証するためのツールが必要です。

Python では、プロキシ IP の取得および検証機能を実現するためにいくつかのサードパーティ ライブラリを使用できます。その中で、request ライブラリと urllib ライブラリがより一般的に使用されます。同時に、ProxyPool や ProxyScrape など、いくつかのサードパーティ ライブラリを使用してプロキシ IP プールを維持することもできます。ただし、これらのライブラリの使用にはいくつかの制限と欠陥があります。たとえば、request ライブラリと urllib ライブラリはプロキシ IP を自動的に切り替えることができず、ProxyPool や ProxyScrape などのライブラリはパブリック プロキシ IP のみを取得でき、有料のプライベート プロキシ IP は取得できません。

上記の問題を解決するには、Pandas ライブラリを使用して、ワンクリックでプロキシ IP のクローリングと分析、およびプロキシ IP プールのメンテナンスを実現できます。Pandas ライブラリは、Python で非常に一般的に使用されるデータ分析ライブラリであり、データのクリーニング、再編成、集計、その他の操作を含むデータを迅速に処理するのに役立ちます。同時に、Pandas ライブラリを使用して、HTML、XML、JSON、その他の形式のデータの解析など、Web ページ データを処理することもできます。この記事では、Pandas ライブラリを使用して、プロキシ IP の自動取得と検証、およびプロキシ IP プールのメンテナンスを実装する方法を紹介します。具体的には、次の内容について説明します。

  1. Pandas ライブラリを使用して HTML、XML、JSON、その他の形式の Web ページ データを解析する方法。
  2. Pandas ライブラリを使用してプロキシ IP を取得し、それを確認する方法。
  3. Pandas ライブラリを使用してプロキシ IP プールを管理する方法。
  4. Pandas ライブラリを使用してプロキシ IP プールを MySQL データベースに保存する方法。

2. Pandas ライブラリを使用して HTML、XML、JSON、その他の形式の Web ページ データを解析する方法

クロール プロセス中に、HTML、XML、JSON、その他の形式の Web ページ データを解析する必要がある状況によく遭遇します。Pandas ライブラリは、これらの形式のデータを迅速に解析し、DataFrame 形式に変換するのに役立ちます。次に、Pandas ライブラリを使用して HTML、XML、JSON などの形式の Web ページ データを解析する方法を紹介します。

1. Web ページのデータを HTML 形式で解析する

HTML 形式の Web ページ データを解析する場合、Pandas ライブラリの read_html() 関数を使用できます。read_html() 関数は、HTML ファイル内のテーブル タグ (<table>) に従ってテーブル データを自動的に解析し、DataFrame 形式に変換します。以下に例を示します。

import pandas as pd

url = 'http://www.nasdaq.com/markets/most-active.aspx'

# 使用Pandas库解析HTML格式的网页数据
dfs = pd.read_html(url)

# 打印解析出来的第一个表格
print(dfs[0])

上記のコードは、NASDAQ 株式市場で最も活発な銘柄を解析し、最初に解析されたテーブルを出力します。ご覧のとおり、Pandas ライブラリはテーブル データを DataFrame 形式に変換し、テーブル ヘッダーとインデックスを自動的に追加します。

2. Web ページのデータを XML 形式で解析する

XML 形式の Web ページ データを解析する場合、Pandas ライブラリの read_xml() 関数を使用できます。read_xml() 関数は、XML ファイル内のタグに基づいてデータを自動的に解析し、DataFrame 形式に変換します。以下に例を示します。

import pandas as pd

url = 'http://www.w3schools.com/xml/note.xml'

# 使用Pandas库解析XML格式的网页数据
df = pd.read_xml(url)

# 打印解析出来的数据
print(df)

上記のコードは、XML 形式のデータを解析し、解析されたデータを出力します。ご覧のとおり、Pandas ライブラリは XML データを DataFrame 形式に変換し、列名とインデックスを自動的に追加します。

3. Web ページデータを JSON 形式で解析する

Web ページ データを JSON 形式で解析する場合、Pandas ライブラリの read_json() 関数を使用できます。read_json() 関数は、JSON ファイル内のキーと値のペアに基づいてデータを自動的に解析し、DataFrame 形式に変換します。以下に例を示します。

import pandas as pd

url = 'https://jsonplaceholder.typicode.com/todos'

# 使用Pandas库解析JSON格式的网页数据
df = pd.read_json(url)

# 打印解析出来的数据
print(df)

上記のコードは、JSON 形式のデータを解析し、解析されたデータを出力します。ご覧のとおり、Pandas ライブラリは JSON データを DataFrame 形式に変換し、列名とインデックスを自動的に追加します。

3. Pandas ライブラリを使用してプロキシ IP を取得し、それを確認する方法

プロキシIPを使用する場合は、プロキシIPのWebサイトからプロキシIPを取得し、正常に使用できることを確認する必要があります。このプロセス中に、Pandas ライブラリを使用してプロキシ IP を取得および検証できます。

プロキシ IP を取得する場合、リクエスト ライブラリを通じてプロキシ IP Web サイトにリクエストを送信し、Pandas ライブラリを使用して返された HTML データを DataFrame 形式に解析できます。以下に例を示します。

import requests
import pandas as pd

url = 'http://www.zdaye.com/nn'

# 设置headers,模拟浏览器访问
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}

# 发送请求,获取代理IP
response = requests.get(url, headers=headers)
dfs = pd.read_html(response.text)

# 将DataFrame格式的数据转换成列表格式
data = dfs[0].values.tolist()

上記のコードは、Web サイトから国内の高密度プロキシ IPを取得し、返された HTML データを DataFrame 形式に解析し、DataFrame 形式のデータをリスト形式に変換します。

プロキシ IP を確認する場合、リクエスト ライブラリを通じて Web サイトにリクエストを送信し、プロキシ IP を使用してリクエストを送信できます。リクエストが成功した場合は、プロキシ IP が利用可能であることを意味し、リクエストが失敗した場合は、プロキシ IP が利用できないことを意味します。以下に例を示します。

import requests

proxies = {'http': 'http://123.56.74.156:80'}

# 设置headers,模拟浏览器访问
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}

# 发送请求,使用代理IP进行访问
response = requests.get('http://httpbin.org/ip', headers=headers, proxies=proxies)

# 如果请求成功,则表明该代理IP可用;如果请求失败,则表明该代理IP不可用
if response.status_code == 200:
    print('可用')
else:
    print('不可用')

上記のコードは、プロキシ IP 123.56.74.156:80 を使用して httpbin.org にリクエストを送信し、返されたステータス コードに基づいてプロキシ IP が利用可能かどうかを判断します。

4. Pandas ライブラリを使用してプロキシ IP プールを維持する方法

クロール プロセス中は、通常、ブロックされないようにプロキシ IP プールを使用します。プロキシ IP プールには複数のプロキシ IP を含めることができ、アクセス用に 1 つのプロキシ IP をランダムに選択できます。このプロセスでは、Pandas ライブラリを使用してプロキシ IP プールを維持できます。

プロキシ IP プールを維持するときは、プロキシ IP Web サイトから定期的にプロキシ IP を取得し、それを確認する必要があります。プロキシ IP が使用可能な場合はプロキシ IP プールに追加し、プロキシ IP が使用できない場合はプロキシ IP プールから削除します。以下に例を示します。

import requests
import pandas as pd
import time

# 设置代理IP池

# 理IP池的最大长度
MAX_PROXY_NUM = 100

# 代理IP池
proxy_pool = []

# 获取代理IP并验证,如果可用则加入代理IP池中
def get_and_verify_proxy(url):
    try:
        # 设置headers,模拟浏览器访问
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}

        # 发送请求,获取代理IP
        response = requests.get(url, headers=headers)
        dfs = pd.read_html(response.text)

        # 将DataFrame格式的数据转换成列表格式
        data = dfs[0].values.tolist()

        # 将获取的代理IP逐个进行验证
        for i in range(len(data)):
            protocol = data[i][4].lower()  # 协议类型(http/https)
            ip = data[i][0]  # IP地址
            port = data[i][1]  # 端口号
            proxies = {protocol: f'{protocol}://{ip}:{port}'}

            # 发送请求,使用代理IP进行访问
            response = requests.get('http://httpbin.org/ip', headers=headers, proxies=proxies, timeout=5)

            # 如果请求成功,则表明该代理IP可用;如果请求失败,则表明该代理IP不可用
            if response.status_code == 200:
                proxy = {'protocol': protocol, 'ip': ip, 'port': port}
                if proxy not in proxy_pool:
                    proxy_pool.append(proxy)
                    print(f'Add proxy: {proxy}, current length: {len(proxy_pool)}')
                    if len(proxy_pool) > MAX_PROXY_NUM:
                        proxy_pool.pop(0)
            else:
                continue

    except:
        pass

while True:
    url = 'http://www.xicidaili.com/nn'
    get_and_verify_proxy(url)
    time.sleep(30)

上記のコードは、 Webサイトから定期的にプロキシ IP を取得し、それを検証します。プロキシ IP が使用可能な場合はプロキシ IP プールに追加し、プロキシ IP が使用できない場合はプロキシ IP プールから削除します。同時に、プロキシ IP プールの最大長も設定します。プロキシ IP プールの長さが最大長を超える場合、最も古いプロキシ IP が削除されます。

5. Pandas ライブラリを使用してプロキシ IP プールを MySQL データベースに保存する方法

プロキシ IP プールを維持するプロセスでは、通常、後続の操作で使用するためにプロキシ IP プールをデータベースに保存する必要があります。このプロセスでは、Pandas ライブラリを使用してプロキシ IP プールを MySQL データベースに保存できます。

まず、MySQL データベースに接続するために pymysql ライブラリをインストールする必要があります。pip コマンドを使用してインストールできます。

pip install pymysql
```

安装完成后,就可以使用pymysql库来连接MySQL数据库了。下面是一个例子:

```python
import pymysql

# 连接MySQL数据库
def connect_mysql():
    conn = pymysql.connect(
        host='localhost',  # 数据库所在主机地址
        user='root',  # 登录数据库的用户名
        password='password',  # 登录数据库的密码
        database='proxy',  # 数据库名称
        charset='utf8mb4'  # 数据库编码格式
    )

    return conn

# 将代理IP池保存至MySQL数据库中
def save_proxy_to_mysql():
    conn = connect_mysql()

    # 将代理IP池转换成DataFrame格式
    df = pd.DataFrame(proxy_pool)

    # 将DataFrame格式的数据保存至MySQL数据库中
    df.to_sql('proxy', conn, index=False, if_exists='replace')

    # 关闭数据库连接
    conn.close()

save_proxy_to_mysql()

上記のコードは、プロキシ IP プールを DataFrame 形式に変換し、データを DataFrame 形式で proxy という名前の MySQL テーブルに保存します。プロキシ テーブルがすでに存在する場合は、まずテーブルが削除され、その後新しいテーブルが作成され、データが挿入されます。

6. まとめ

この記事では、Pandas ライブラリを使用してプロキシ IP の自動取得と検証、およびプロキシ IP プールのメンテナンスを実装する方法を紹介します。具体的には、Pandas ライブラリを使用して HTML、XML、JSON、その他の形式の Web ページ データを解析する方法、Pandas ライブラリを使用してプロキシ IP を取得して検証する方法、Pandas ライブラリを使用してプロキシを維持する方法について説明しました。 IP プール、および Pandas ライブラリの使用方法 プロキシ IP プールを MySQL データベースに保存します。この記事の説明を通じて、読者の皆様は、Pandas ライブラリを使用してプロキシ IP を迅速に取得し、検証する方法を習得したと思います。この記事が、クローリング プロセス中に発生する問題の解決に役立つことを願っています。

おすすめ

転載: blog.csdn.net/wq10_12/article/details/132975729