動的Webクローラーソリューション

序文

初期のダウンロードビデオの知識ポイントを確認したところ、いくつかの重要なポイントが明確ではなかったことがわかりました。これにより整理

クローラーの実際の経験の要約

動的Webクローラーに習熟していない場合、クローラーはあまり役に立ちません。

クローラーについてのちょっとした話(スキップできます)

そのようなテーブルと椅子があるとしましょう。デフォルトのルールがあります。人間が椅子に座ると、テーブルはルールに従ってサービスを提供します。
通常、椅子に座っている人間がいて、ペンだから、テーブルの表面の下からペンが来ました。しかし、この人間は最初に100本のペンを必要としますが、これは机ではできません。それで、人間は机の引き出しを開けて、ひっくり返して百本のペンの位置を見て、ロボットに話しました。
静的なWebページ:人間は、ロボットの使用人に、以前に指示されたアドレスに従ってペンを1つずつ取り出すように命令します。人間は椅子を離れ、ロボットは椅子に座ってタスクを完了します。

動的Webページ:人間は、与えられたアドレスに従ってペンを取り出すようにロボットに指示し、人間は椅子を離れ、ロボットは椅子に座ります。
現時点では、ロボットの使用人が引き出しからペンを取り出さないようにするために、このテーブルでは、椅子の承認がない限り、人間以外の人が引き出しの内部を見ることができません。
ロボットが自分自身を助けるためにペン、お尻の形を教えて、私だと見せかけてください。ロボットが椅子に座って、引き出しを開けて中を見ることができます。

しかし、ロボットはペンを見つけることができません
**セレン:**ロボットがペンに手を伸ばして取るために引き出しを引く必要がないことがわかりました。人間はペンの位置を取得するために引き出しを引く必要があります。そのため、ロボットは人間を模倣して引き出しを引っ張り、ペンの位置を確認してタスク
インターフェイスを完成させました。ロボットは人間を模倣したくなかったため、引き出しにペンを置くべきロープがあることがわかりました。 、そしてロープに沿って彼は安全なものを見つけました。金庫には無数の小さな精霊がいて、彼らはそれが必要とするペンを持っています。(小さな精霊が無数のデータをひねって引き出しに渡します)金庫にはたくさんのつまみがあり、指定された位置に回すと対応するペンが出てきます。ロボットは、各ペンに対応するノブが1つまたは2つを除いて同じであることに気づきました。

動的Webクローラーソリューション

現在、ほとんどのウェブページは動的なウェブページです。古典的なケースのDouban 250ランキングリストのようなケースは、ランタンでは見つかりません。

解決策は2つだけです

利点 不利益 練習
分析インターフェース データは、分析作業なしで直接要求できます。より少ないコード、高性能 分析インターフェースはより複雑で、特にjsによって難読化されているいくつかのインターフェースです。jsの基本的な知識が必要です。クローラーとして簡単に見つけられます 有道インターフェース、bステーションビデオインターフェース、天気アプリインターフェース
セレン ブラウザの動作を直接シミュレートします。ブラウザが要求できるものは、セレンを使用して要求することもできます。クローラーはより安定しています 大量のコード、低パフォーマンス スクレイプ+セレン

インターフェイスを介したデータの取得
最初の例-有道辞書
2番目の例-ステーションb3番目の例-Baidu
画像(この記事には動的画像のWebページのみが含まれます)
はいDaoとbステーションには重要な違いがあります-POSTリクエストと取得の違いリクエスト

Youdaoの投稿では、ブラウザが最初にヘッダーを送信し、次にデータを送信します。データには暗号化メカニズムがあります。このメカニズムはjsファイルで解読する必要があります。このjsファイルは、Webサイトがリクエストを送信するために使用します。サーバーとデータパケットを送信します。パッケージ化されているのは、美化後に復元する必要があることです。jsファイルを分析すると、暗号化パラメーターを指定する文法のデータソースが見つかります。この暗号化メカニズムをコードにコピーして、jsファイルの暗号化を置き換えることができます。

ステーションb ----のインターフェースはネットワークでplayurlファイルを探します、そしてそれがいくつかのビデオにあることがわかります、そしていくつかはそうではありません。

ここに画像の説明を挿入

インターネット上にあるインターフェースはこんな感じです

'https://api.bilibili.com/x/player/playurl?' + 'bvid=' + bvid +'&cid=' + str(cid) + '&qn=64&type=&otype=json'

ステーションbのビデオの種類によって、ネットワークで取得されるデータも異なります。
ここに画像の説明を挿入
ここに画像の説明を挿入
パケットキャプチャテクノロジーは実際には非常に重要です。データを取得する能力を拡張してください。

辞書の難しさは、そのパラメータが暗号化され
ていることです。postbサイトの難しさは、一度に直接ビデオを取得できないことです。分割してダウンロードする必要があります。URLがない場合は、このようにダウンロードすることしかできません。postメソッドではないため、パラメータは必要ありません。

3番目の例は、Baidu画像の取得を参照してください。
まず、Baidu画像をクロールするWebページにアクセスし、右クリックして確認し、ネットワークをクリックして、画像のURLを含むインターフェイスがあるかどうかを確認します。データパッケージ。
ここに画像の説明を挿入
見つかりませんでした。、、、、これは私です。よくある状況です。他の人の例で、この方法で対応するjsデータパッケージを見つけましたが、自分では見つかりません。

それでも、必要なコンテンツを含むインターフェイスを見つけることは非常に重要です(後で見つけました)

BaiduPicturesのインターフェースは

http://image.baidu.com/search/acjson?

パラメータを追加する

param = 'tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord={}&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=&hd=1&latest=0&copyright=0&word={}&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&force=&cg=star&pn={}&rn=30&gsm=78&1557125391211='.format(

このインターフェースにアクセスすると、画像のURLを取得できます

ここに画像の説明を挿入
js解析Webサイトに配置して
ここに画像の説明を挿入
から、基本的な操作をダウンロードして保存することをお勧めします

また、頻繁に発生しますFileNotFoundError:[Errno 2]そのようなファイルまたはディレクトリはありません: 'D:/base/0.jpg'
は動作点を調整できません

cwd = os.getcwd()
        file_name = os.path.join(cwd, keyword)
        if not os.path.exists(keyword):
            os.mkdir(file_name)
        for index, url in enumerate(image_url, start=1):
            with open(file_name + '\\{}.jpg'.format(index), 'wb') as f:
                f.write(content)
            if index != 0 and index % 30 == 0:
                print('{}第{}页下载完成'.format(keyword, index / 30))

ここに画像の説明を挿入
したがって、インターフェイスを介した写真のダウンロードは非常にスムーズです

セレンを介してデータを取得する

最初の例-------- Tencent Animationのフルステーションコミック
2番目の例--------百度の写真(動的バージョン)
3番目の例-------- Jianshuクリック[記事をもっと見る]

テンセントアニメーション

すべてのステーションコミックをクロールする

Baiduの写真

Webページに移動し、
マウスを観察してスライドすると、画像は次々に表示されますが、ページは更新されないため、動的なWebページです
。xpathの通常の方法を使用しようとしても役に立たない
場合は、セレン
部分を使用してください。次のようにコーディングします

subjects = driver.find_elements_by_xpath("//div[@class='imgbox']/a/img")
for subject in subjects:

        a = subject.get_attribute("data-imgurl")
        print(a)

簡単な本

このWebページにアクセスし、Webページのソースコードを確認し、右クリックして確認し、xpathヘルパーで試してください。

このWebページにはクロール防止メカニズムがあり、クラス名は動的であることがわかりました。コードxpathで相対位置検索を使用しても、必要なコンテンツが得られない場合があります。正しいxpathを決定するのは非常に面倒です。構文。

今すぐクロールするには、トピックの収入に対応するリンクまたはテキスト
ここに画像の説明を挿入

コードで試してみてください。
ここに画像の説明を挿入
確かに、戻り値は空で、指定されたコンテンツを取得できません。

また、元のWebページではユーザーがさらにクリックする必要があるため、これら2つの特定の問題を解決するには、Seleniumを使用します。

コードを見てください

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome(executable_path=r"D:\ProgramApp\chromedriver\chromedriver.exe")

url = "https://www.jianshu.com/p/7e2b63ed0292"
driver.get(url)

WebDriverWait(driver,5).until(
    EC.element_to_be_clickable((By.XPATH,"//section[position()=2]/div/div"))
)

while True:
    try:
        next_btn = driver.find_element_by_xpath("//section[position()=2]/div/div")
        driver.execute_script("arguments[0].click();",next_btn)
    except Exception as e:
        break

subjects = driver.find_elements_by_xpath("//section[position()=2]/div[position()=1]/a")
for subject in subjects:
    print(subject.text)

ここに画像の説明を挿入
結果が達成される。
要約:
ステータス1:クロールするために使用する一般的な方法は、いくつかのことを取得するには、いくつかの事柄をクロールしないように
クロールされている事は、ソースコードであり、そしてもの。クロールすることはできませんがされていない
推測ソースコード1:ソースコードに隠されているものは何もクロールできず、
ソースコードのいくつかの一般的なメソッドをクロールできます。注:ソースコードには、非常に長くて長い複雑な文字列は含まれていません。
ステータス2:要するに本のウェブページにはトピック名のソースコード
はありませんが、パケットをキャプチャすることで取得できます推測2:ソースコードにないものはパケットをキャプチャすることで取得できます
予期しない収穫:すべてのコメント、アバター、IDなどをキャプチャします情報。
現在の状況3:トピック名をクロールするためのxpathの通常の方法を使用する短い本のWebページ、インターフェイスの使用、またはセレンの使用
推測3:ソースコードの非表示はインターフェイスまたはセレンによってのみクロールできます
実用的な結論:簡単に見つけることができますセレンを使用し、動的属性は一般的な方法のクライミング防止です。
セレンは最初に要素を取得することです属性値を再度取得します

おすすめ

転載: blog.csdn.net/qq_51598376/article/details/113811040