実戦|Pythonクローラーの使い方を教えます(詳細なソースコード付き)

爬虫類とは?

実践は理論から。クローラーを作る前に、まず関連するルールと原則を理解する必要があります。インターネットは法外の場所ではないことを知っておく必要があります。クローラーは、ある日突然、操作できなくなるかもしれません。まず、クローラーの定義を見てみましょう
ここに画像の説明を挿入
: Web クローラー (Web スパイダー、Web ロボットとも呼ばれ、FOAF コミュニティでは Web チェイサーと呼ばれることが多い) は、特定のルールに従って World Wide Web 上の情報を自動的に取得するプログラムまたはスクリプトです。 . 一言で言えば、オンライン情報ポーターです。

クローラーが従うべき規則を見てみましょう: ロボット プロトコルは、Web サイトのルート ディレクトリに格納されている ASCII エンコードされたテキスト ファイルであり、通常、この Web サイトのコンテンツを Web 検索エンジン ロボット (Web スパイダーとも呼ばれます) に伝えます。検索エンジンのロボットが得てはいけないものと、ロボットが得られるもの。一言で言えば、登れるものと登れないものを教えてくれます。

定義とルールを理解したら、最後に爬虫類の基本原則に慣れることです.それは非常に簡単です.ソウルペインターとして、理解できるように模式図を描きます.
ここに画像の説明を挿入
(⊙o⊙)… 恥ずかしい、どうしてねずみはこんなに字が汚いのか、書道を習ったと言うのが恥ずかしいので、とても恥ずかしいです。

プロジェクトの背景

理論的な部分はほとんど終わっていて、子供たちの中には私が長々としたと思うかもしれないので、ナンセンスな話はせずに実践的な部分について直接話しましょう。この小さなクローラー プロジェクトは、友人のニーズに応えて、中国木材価格指数ネットワークからマホガニーの価格データをクロールし、マホガニーの研究レポートの作成を容易にすることを目的としています。Web サイトは次のようになります:
ここに画像の説明を挿入
必須フィールドは赤いボックスでマークされています. データ量をざっと見てみると, 1751 ページに 50,000 を超えるレコードがあります. コピーして貼り付けようとすると、さる年まで粘ります。Python を数分間実行するだけで、すべてのデータが Excel に保存されます。非常に快適ではありませんか?
ここに画像の説明を挿入

プロジェクト戦闘

ツール: PyCharm

Python バージョン: Python 3.7

ブラウザ:Chrome(推奨)

初めてクローラーを書いている友人はとても面倒だと思うかもしれません. パニックにならないように, 浅いものから深いものへ, まずはデータのページをクロールしてみましょう.

1. ページをクロールする

まず、Web ページの構造を簡単に分析し、右クリックして確認し、[ネットワーク] をクリックして、Web ページを更新し、[名前] リストの最初のページをクリックし続ける必要があります。この Web サイトのリクエスト メソッドは GET であり、リクエストのヘッダーには、ユーザーのコンピューター システムやブラウザーのバージョンなどの情報が反映されていることがわかりました。
ここに画像の説明を挿入
次に、クローラーが必要とするすべてのライブラリーを pip でインストールしてインポートします. すべてのライブラリーの関数には注釈が付けられています.

import csv  #用于把爬取的数据存储为csv格式,可以excel直接打开的
import time  #用于对请求加延时,爬取速度太快容易被反爬
from time import sleep #同上
import random  #用于对延时设置随机数,尽量模拟人的行为
import requests  #用于向网站发送请求
from lxml import etree    #lxml为第三方网页解析库,强大且速度快

リクエスト URL を構築し、ヘッダー情報ヘッダーを追加します。つまり、上記の User-Agent をコピーし、 requests.get メソッドを介してサーバーにリクエストを送信し、html テキストを返します。ヘッダーを追加する目的は、あなたが Web サイトを訪れている実在の人物であることをサーバーに伝えることです。ヘッダーを追加せずにサーバーに直接アクセスすると、Python がアクセスしている他のサーバーに表示され、アンチクロールされる可能性が高く、一般的なアンチクロールは IP をブロックすることです。

url = 'http://yz.yuzhuprice.com:8003/findPriceByName.jspx?page.curPage=1&priceName=%E7%BA%A2%E6%9C%A8%E7%B1%BB'
headers = {
    'User-Agent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36",
}
response = requests.get(url, headers=headers, timeout=10)
html = response.text  
print(html)

上記のコードを実行してその効果を見てみましょう:
ここに画像の説明を挿入
これを見て、爬虫類に慣れていない友人は少し混乱するかもしれません.
ここに画像の説明を挿入
実はこれがウェブページのソースコードなので、右クリックしてソースコードを開いて見てみましょう。
ここに画像の説明を挿入
抽出する必要がある
ここに画像の説明を挿入
データは、この Web ページのソース コードに隠されているため、lxml ライブラリの etree メソッドを使用して Web ページを解析する必要があります。

parse = etree.HTML(html)  #解析网页

解析後、必要なデータを喜んで抽出できます。xpath、select、美麗スープ、最難関のre(正規表現)など、メソッドはたくさんあります。この記事でクロールするデータ構造は比較的単純なので、直接 xpath で遊んでみましょう。
ここに画像の説明を挿入
データの各行がソース コード内の id=173200 の tr に対応することがわかったので、まずこれらの tr を抽出します。

all_tr = parse.xpath('//*[@id="173200"]')

一部の友人は xpath を書くことができません。
ここに画像の説明を挿入
次に、必要な xpath を直接コピーする簡単な方法を見つけます。
ここに画像の説明を挿入
すべての tr が抽出されたので、特定のフィールドを tr から順番に抽出する必要があります。たとえば、製品名フィールドを抽出し、最初の tr をクリックして製品を選択し、その xpath をコピーします。他の分野も同様です。
ここに画像の説明を挿入
次の点に注意してください。 tr={key1 : value1, key2 : value2 } は Python 辞書データ型です (興味や必要に応じて、リストまたはタプル型として保存することもできます)。''.join は、取得したリストを文字列に変換することを指します。./ は以前の //*[@id="173200"] を継承することを指し、strip() は抽出されたデータに対して単純なフォーマット クリーニングを実行することを意味します。

for tr in all_tr:
    tr = {
        'name': ''.join(tr.xpath('./td[1]/text()')).strip(),
        'price': ''.join(tr.xpath('./td[2]/text()')).strip(),
        'unit': ''.join(tr.xpath('./td[3]/text()')).strip(),
        'supermaket': ''.join(tr.xpath('./td[4]/text()')).strip(),
        'time': ''.join(tr.xpath('./td[5]/text()')).strip()
    }

print(tr) を出力して、その効果を見てみましょう。
ここに画像の説明を挿入

この時点で、あなたの気分は次のようになっているかもしれません:
ここに画像の説明を挿入
しかし、まだ終わっていません。データはあります。ローカルに csv 形式で保存する必要があります。この手順は比較的簡単です。コードを直接貼り付けるだけです。

with open('wood.csv', 'a', encoding='utf_8_sig', newline='') as fp:
    # 'a'为追加模式(添加)
    # utf_8_sig格式导出csv不乱码
    fieldnames = ['name', 'price', 'unit', 'supermaket', 'time']
    writer = csv.DictWriter(fp, fieldnames)
    writer.writerow(tr)

新しく生成された wood.csv を開くと、次のようになります。
ここに画像の説明を挿入

2. 複数のページをクロールする

データのページをクロールしただけで、人々はあなたよりも速くコピーして貼り付けることができます。私たちの野心はここにはありませんが、詩と距離では、いや、膨大なデータを数秒で登ることです.

では、複数ページのデータをクロールするにはどうすればよいでしょうか。そうです、for ループです。

戻って URL を分析しましょう。

http://yz.yuzhuprice.com:8003/findPriceByName.jspx?page.curPage=1&priceName=%E7%BA%A2%E6%9C%A8%E7%B1%BB

次のように、内部の page.curPage を 2 に変更してみましょう:
ここに画像の説明を挿入
page.curPage を変更する限り、ページをめくることができる謎を見つけることができます。では、URL の前にループを追加するだけです。format(x) は、文字列をフォーマットし、無制限の数のパラメーターを受け入れることができる関数です。

for x in range(1,3):
    url = 'http://yz.yuzhuprice.com:8003/findPriceByName.jspx?page.curPage={}&priceName=%E7%BA%A2%E6%9C%A8%E7%B1%BB'.format(x)

これまでのところ、範囲を変更する限り、好きなだけページを上ることができますが、満足していますか? それは驚くべきことですか?

3. クローラーを改善する

上記のコードだけに従ってクローラーをクロールすると、12 ページを超えるクロール後にプログラムがクラッシュする可能性が非常に高くなります。途中でエラーが報告され、クローラーが失敗するということが何度もありました。せっかく書いた爬虫類、なんというか崩れる。
ここに画像の説明を挿入
エラーを報告する理由はたくさんあります. 爬虫類をプレイする人なら誰でも、バグのデバッグが非常に面倒で、絶え間ない試行錯誤が必要であることを知っています. このクローラーの主なバグは TimeoutError です。したがって、コードをさらに改善する必要があります。
ここに画像の説明を挿入
まず、上記のコードは関数にカプセル化する必要があります。関数を使用しないことには次の欠点があるためです。

1. 複雑化

2. 組織構造が十分に明確でない

3.可読性が低い

4. コードの冗長性

5. スケーラビリティが低い

次に、エラーが発生する可能性のある例外処理を追加します。それはtry...exceptです。

完成後、下図のようにパーツをインターセプトします。スペースの制限により、すべてのコードを掲載することはできません. 完全なコードが必要な友人は、WeChat で下の CSDN 公式認定の QR コードをスキャンして、無料で入手できます [100% 無料を保証].

ここに画像の説明を挿入

Python テクニカル リザーブについて

就職でも副業でもお金を稼ぐためにPythonを学ぶのは良いことですが、やはりPythonを学ぶには学習計画が必要です。最後に、Python を学びたい人を助けるために、Python 学習教材の完全なセットを全員が共有します!

無料で入手するには、ここをクリックしてください: CSDN まくる: 「Python 学習ルート & 学習教材の完全なセット」無料共有

Python研究概要

Pythonの全方位の技術ポイントを整理し、各分野の知識ポイントをまとめたもので、上記の知識ポイントに応じて対応する学習リソースを見つけることができ、より総合的に学習できるというメリットがあります。
ここに画像の説明を挿入

入門学習ビデオ

Pythonの実際のケース

光学理論は役に立たないので、従うことを学ぶ必要があり、学んだことを実践に適用できるように、自分でそれを行う必要があります.この時点で、いくつかの実際の戦闘ケースから学ぶことができます.
ここに画像の説明を挿入
ここに画像の説明を挿入
この完全版の Python 学習教材は CSDN にアップロードされています.必要な場合は、私にプライベート メッセージを送信して無料で入手してください[100% 無料保証]

おすすめ

転載: blog.csdn.net/m0_59162248/article/details/129746460