[Python クローラー] 10. ブラウザーが自動的に動作するようにコマンドを実行します (Selenium)

序文

前のレベルでは、Cookie とセッションについて学びました。
それぞれの使い方と違いを学びました。
ここに画像の説明を挿入します
ここに画像の説明を挿入します
また、小さな Cookie でログインし、ブログにコメントを残すというプロジェクトも作成しました。

前のレベルで説明したログインの問題に加えて、クロール プロセス中にさまざまな困難な問題に遭遇する可能性があります。

有名な 12306 など、一部の Web サイトへのログインは非常に複雑で、確認コードを解読するのが困難です。

ここに画像の説明を挿入します
一部の Web サイト ページには複雑なインタラクションがあり、Tencent ドキュメントなどのクロールが困難なテクノロジーが使用されています。

ここに画像の説明を挿入します
一部の Web サイトでは URL に非常に複雑な暗号化ロジックがあり、たとえば、レベル 4 でクロールされた QQ Music の楽曲レビューでは、URL のパラメータ変数を見つけるのが非常に困難です。

上記の場合、これらの Web サイトのクローラ対策技術を突破することは困難になります。

しかし、心配する必要はありません、このレベルでは、上記の問題をすべて解決できる究極の武器、セレンを教えます。

セレンとは何ですか

セレンとは何ですか? 強力な Python ライブラリです。

何ができるのでしょうか?数行のコードを使用してブラウザを制御し、実際のユーザーが操作しているかのように、自動で開く、入力、クリックなどの操作を実行できます。

短い画面録画を見てみましょう。ビデオの前ではテキストが薄く表示されます。

ここに画像の説明を挿入します
これは、ブラウザが自動的に Web ページを開き、テキストを入力して送信ボタンをクリックできるようにするために、Selenium を使用して作成したスクリプトです。ここで使用するコードについては後ほど説明します。

以前教えたユーザーのことを褒めたいのですが、会社のイントラネットへのログインや操作が非常に面倒で、ログイン後の操作も機械的な繰り返しだったので、Seleniumを学んだ後、Pythonのプログラムを書きました。

彼が毎日仕事に行くときに最初に行うことは、コンピュータの電源を入れて自分が書いたスクリプトを実行することです。これにより、ブラウザが自動的に会社のイントラネットを開いてログインを完了し、繰り返しのタスクが同時に完了します。時間。彼はというと、そこに座ってのんびりお茶を飲んでいた。

Selenium はブラウザを制御できますが、これは先ほど提起した問題の解決にどのように役立ちますか?

まず、複雑な確認コードを含む Web サイトに遭遇した場合、Selenium を使用すると、ユーザーは手動で確認コードを入力し、残りの操作はマシンに任せることができます。

複雑な対話と複雑な暗号化を伴う Web サイトの場合、Selenium は問題を単純化し、静的な Web ページをクロールするのと同じくらい簡単に動的 Web ページをクロールします。

動的 Web ページとは何ですか、静的 Web ページとは何ですか? 実際、あなたはすでに両方の Web ページにアクセスしています。

レベル 2 では、静的な Web ページである HTML で Web ページを作成する方法を学びます。このタイプの Web ページのクロールには BeautifulSoup を使用します。Web ページのソース コードには Web ページのすべての情報が含まれているため、Web ページのアドレス バーの URL が Web ページのソース コードの URL になります。

ここに画像の説明を挿入します

その後、QQ Music などのより複雑な Web ページにアクセスし始めます。クロールされるデータは HTML ソース コードではなく、JSON 形式です。アドレス バーの URL を直接使用することはできませんが、クロールする必要があります。 json データの実際の URL を見つけます。これは動的な Web ページです。

ここに画像の説明を挿入します
データがどこに保存されているかに関係なく、ブラウザは常にサーバーに対してさまざまなリクエストを行っており、これらのリクエストが完了すると、開発者ツールの要素に表示される、レンダリングされた Web ページのソース コードが形成されます。

ここに画像の説明を挿入します
Selenium は、複雑なページ操作や複雑な URL 暗号化ロジックが発生したときに役立ちます。実際にブラウザを開いて、すべてのデータが Elements に読み込まれるのを待ってから、Web ページを静的 Web ページとしてクロールできます。

多くの利点があるとはいえ、もちろん、セレンの使用には欠点もあります。

実際にローカル ブラウザを実行し、ブラウザを開いてネットワーク レンダリングが完了するまで待つのには時間がかかるため、Selenium の作業では必然的に速度とリソースが犠牲になりますが、少なくとも人間より遅いということはありません。

メリットとデメリットを理解した上で、Selenium の使い方を学び始めましょう。

使い方

まず、他の Python ライブラリと同様に、Selenium をインストールする必要がありますが、方法も非常に簡単で、pip を使用してインストールします。

pip install selenium # Windows电脑安装selenium
pip3 install selenium # Mac电脑安装selenium

Selenium スクリプトは一般的なブラウザの動作を制御できますが、使用する前にブラウザ ドライバをインストールする必要があります。

私が推奨するのは Chrome ブラウザです。以下のリンクを開くと、Windows と Mac で利用できる Chrome インストール パッケージをダウンロードできます。

https://localprod.pandaTeacher.com/python-manuscript/crawler-html/chromedriver/ChromeDriver.html

このレベルは非常に特殊であり、ローカル環境でコードを実行しながら学習する必要があるため、今すぐダウンロードしてブラウザ ドライバーをコンピューターにインストールすることを強くお勧めします。

これは、いくつかのアニメーションを使用してその仕組みを説明することしかできないためです。

この影響により、このレベルのコンテンツを学習する際、ブラウザの操作プロセスをより直観的に確認したい場合は、ローカル コンピュータでスクリプトを実行する必要があります。

正式に知識の説明を始める前に、まずローカル端末上で Selenium スクリプト プログラムを実行した場合の効果を体験していただきたいと思います。なぜなら、Seleniumの学習の初めに、ブラウザが自動的にポップアップした後の操作効果を自分で確認できると、その後の学習に大きく役立つからです。

以下のコードは、このレッスンの冒頭のアニメーションのコードです。ここで具体的な意味を理解する必要はありません。各行の使い方は後ほど学習します。

このコードをローカル コード エディターにコピーして実行するだけで、ブラウザーが自動的に動作する効果を体験できます。もちろん、Selenium ライブラリと Chrome ブラウザ ドライバーがインストールされていることが前提です。

# 本地Chrome浏览器设置方法
from selenium import  webdriver 
import time

driver = webdriver.Chrome() 
driver.get('https://localprod.pandateacher.com/python-manuscript/hello-spiderman/') 
time.sleep(4)

teacher = driver.find_element_by_id('teacher')
teacher.send_keys('必须是吴枫呀')
assistant = driver.find_element_by_name('assistant')
assistant.send_keys('都喜欢')
time.sleep(1)
button = driver.find_element_by_class_name('sub')
time.sleep(1)
button.click()
time.sleep(1)
driver.close()

プログラムの実行を観察するだけでなく、この Web サイトを手動で開き、プログラム内と同じ操作を行うことをお勧めします。URL は次のとおりです。

https://localprod.pandaTeacher.com/python-manuscript/hello-spiderman/

まず目を引くのは【ハロー、スパイダーマン!】重要な単語をいくつか入力すると、1 秒後に自動的に新しいページにジャンプし、お気に入りの教師とティーチングアシスタントを入力するように求められます。送信をクリックすると、Zen of Python の中国語と英語の比較ページにジャンプします。

よく見ると、このプロセス中、Web ページの URL は変更されていないことがわかります。】ダイナミックなWebページです。

Seleniumを体験した後、正式にコードの解説を始めます。

ブラウザエンジンの設定

前と同様、新しい Python ライブラリを使用するには、まずそれを呼び出す必要があります。Selenium は少し異なり、呼び出しに加えてブラウザ エンジンのセットアップも必要です。

# 本地Chrome浏览器设置方法
from selenium import webdriver #从selenium库中调用webdriver模块
driver = webdriver.Chrome() # 设置引擎为Chrome,真实地打开一个Chrome浏览器

上記はブラウザの設定方法です。Chrome ブラウザをエンジンとして設定し、それを変数ドライバーに割り当てます。ドライバーはインスタンス化されたブラウザーです。後で必ずその影が表示されます。このインスタンス化されたブラウザーを制御して何かを実行させたいので、これは当然のことです。

ブラウザを設定したら、ブラウザを動作させ始めることができます。

次に、セレンの具体的な使い方を学んでいきますが、この部分の知識解説は、これまで何度か見てきた【ハロー、スパイダーマン!】本サイトは一例です。

https://localprod.pandaTeacher.com/python-manuscript/hello-spiderman/

クローラーの 4 つのステップに従って Selenium の使用法を説明し、Selenium がどのようにデータを取得、解析、抽出するかを見てみましょう。このレベルで抽出されたデータはそれほど複雑ではないため、端末上で直接印刷するだけでよく、データを保存する手順は必要ありません。

ここに画像の説明を挿入します

データを取得する

まずはデータを取得するコードの書き方を見てみましょう。

import time

# 本地Chrome浏览器设置方法
from selenium import webdriver #从selenium库中调用webdriver模块
driver = webdriver.Chrome() # 设置引擎为Chrome,真实地打开一个Chrome浏览器

driver.get('https://localprod.pandateacher.com/python-manuscript/hello-spiderman/') # 打开网页
time.sleep(1)
driver.close() # 关闭浏览器

コードの最初の 3 行は、モジュールの呼び出しとブラウザのセットアップについて学習した内容であり、新しいコードは最後の 2 行のみです。

get(URL) は Webdriver のメソッドであり、その使命は、指定された URL の Web ページを開くことです。

先ほど述べたように、ここでのドライバーはインスタンス化されたブラウザーであるため、Web ページはこのブラウザーを通じて開かれます。

ウェブページが開かれると、ウェブページ内のデータがブラウザに読み込まれます。つまり、データは当社によって取得されます。

driver.close() はブラウザ ドライバを閉じるためのもので、webdriver を呼び出すたびに、それを使用して閉じた後に driver.close() の行を追加する必要があります。

冷蔵庫のドアを開けて何かを入れるたびに、忘れずにドアを閉める必要があるのと同じように、Selenium を使用してブラウザを呼び出した後は忘れずにブラウザを閉じる必要があります。

上記のコードをコピーして貼り付け、ローカル コンピュータで実行します。ブラウザが自動的に起動し、Web ページが開きます。1 秒後にブラウザが閉じます。

ここに画像の説明を挿入します
次に、ブラウザーでデータを解析して抽出し、返された結果を確認できるように出力します。

データを解析して抽出する

前の 2 つのレベルでは、BeautifulSoup を使用して Web ページのソース コードを解析し、データを抽出する方法を学習しました。

Selenium ライブラリには、データを解析して抽出する機能もあります。これは BeautifulSoup の基本原則と一致していますが、一部の詳細と構文が異なります。

最初の明らかな違いは、Selenium が解析および抽出するのは Elements 内のすべてのデータであるのに対し、BeautifulSoup が解析するのはネットワーク内の 0 番目のリクエストに対する応答のみであることです。

このレベルの最初に述べたように、Selenium を使用して Web ページを開くと、すべての情報が Elements に読み込まれ、その後、静的 Web ページの方法を使用して動的 Web ページをクロールできるようになります。

Selenium はどのようにデータを解析して抽出するのでしょうか? 抽出してみます 【ハロー・スパイダーマン!】Webページ内の<label>要素の内容。

ここに画像の説明を挿入します
コードを書いたので、実行して見てください。ヒント: 参照コードの実行時にエラーが発生した場合は、それをコピーして自分で変更してください。

from selenium import webdriver  # 从selenium库中调用webdriver模块
from bs4 import BeautifulSoup # 调用BeautifulSoup库
import time

chrome_options = webdriver.ChromeOptions() # 实例化Option对象
chrome_options.add_argument('--headless') # 对浏览器的设置
driver = webdriver.Chrome(options=chrome_options) # 声明浏览器对象

driver.get('https://localprod.pandateacher.com/python-manuscript/hello-spiderman/') # 访问页面
time.sleep(2) # 等待2秒
label = driver.find_element_by_tag_name('label') # 解析网页并提取第一个<label>标签
print(label.text) # 打印label的文本
driver.close() # 关闭浏览器

出力結果:

(提示:吴枫)

実行結果からわかるように、<label>(ヒント: Wu Feng)</label>内のテキスト (ヒント: Wu Feng) が抽出されました。

上記のコードの最後の数行のみが新しいです。 11 行目: 2 秒待ちます。 12 行目: Web ページを解析し、Web ページの最初のラベルを抽出します。 13 行目: ラベルのテキスト コンテンツを出力します<label>。 。

ブラウザが Web ページをバッファリングしてロードするのに時間がかかるため、time.sleep(3) を使用して 3 秒待機します。この Web ページでは、ホームページから入力ページにジャンプする前に 1 秒を設定しているので、待機します。解析と抽出は比較的安定しています。

このように見ると、データの解析と抽出に実際に使用されるコードは 1 行だけです。

label = driver.find_element_by_tag_name('label') # 解析网页并提取第一个<label>标签中的文字

どの部分が解析を行っており、どの部分が抽出を行っているかわかりますか?

BeautifulSoup を使用してデータを解析および抽出する場合は、まず Response オブジェクトを BeautifulSoup オブジェクトに解析し、次にそこからデータを抽出する必要があることを思い出してください。

Selenium では、取得した Web ページがドライバーに保存され、その後、ドライバーのインスタンス化されたブラウザーによって解析と抽出が同時に行われます。

したがって、前の質問に対する答えは次のとおりです。データの解析はドライバーによって自動的に完了し、データの抽出はドライバーのメソッドです。

解析と抽出の本質を理解したところで、データを解析する方法について詳しく説明します。

もちろん、Selenium はタグを通じてデータを抽出できるだけでなく、要素を検索して抽出するための多くのメソッドを備えており、そのすべてが非常に簡単です。

ここに画像の説明を挿入します
ご覧のとおり、データを抽出するメソッドはすべて英語の直訳です。使用例を示します。次のコードのコメントをよく読んでください。

# 以下方法都可以从网页中提取出'你好,蜘蛛侠!'这段文字

find_element_by_tag_name:通过元素的名称选择
# 如<h1>你好,蜘蛛侠!</h1> 
# 可以使用find_element_by_tag_name('h1')

find_element_by_class_name:通过元素的class属性选择
# 如<h1 class="title">你好,蜘蛛侠!</h1>
# 可以使用find_element_by_class_name('title')

find_element_by_id:通过元素的id选择
# 如<h1 id="title">你好,蜘蛛侠!</h1> 
# 可以使用find_element_by_id('title')

find_element_by_name:通过元素的name属性选择
# 如<h1 name="hello">你好,蜘蛛侠!</h1> 
# 可以使用find_element_by_name('hello')

#以下两个方法可以提取出超链接

find_element_by_link_text:通过链接文本获取超链接
# 如<a href="spidermen.html">你好,蜘蛛侠!</a>
# 可以使用find_element_by_link_text('你好,蜘蛛侠!')

find_element_by_partial_link_text:通过链接的部分文本获取超链接
# 如<a href="https://localprod.pandateacher.com/python-manuscript/hello-spiderman/">你好,蜘蛛侠!</a>
# 可以使用find_element_by_partial_link_text('你好')

以上が単一要素の抽出方法です。

では、どのような要素を抽出するのでしょうか?このオブジェクトにはどのようなプロパティとメソッドがありますか? では、見てみましょう。以下のコードを読んで、「実行」をクリックしてください。

from selenium import webdriver  # 从selenium库中调用webdriver模块
from bs4 import BeautifulSoup # 调用BeautifulSoup库
import time

options = webdriver.ChromeOptions()
options.add_argument('--headless')  # 开启无头模式

chrome_options = webdriver.ChromeOptions() # 实例化Option对象
chrome_options.add_argument('--headless') # 对浏览器的设置
driver = webdriver.Chrome(options=chrome_options) # 声明浏览器对象

driver.get('https://localprod.pandateacher.com/python-manuscript/hello-spiderman/') # 访问页面
time.sleep(2) # 等待2秒
label = driver.find_element_by_tag_name('label') # 解析网页并提取第一个<label>标签中的文字
print(type(label)) # 打印label的数据类型
print(label.text) # 打印label的文本
print(label) # 打印label
driver.close() # 关闭浏览器

操作結果:

<class 'selenium.webdriver.remote.webelement.WebElement'>
(提示:吴枫)
<selenium.webdriver.remote.webelement.WebElement (session="6d400c6ad6f0aa4f5a241b4332ea0c4c", element="0.9387651316030954-1")>

実行結果には 3 行あります
。抽出されたデータが WebElement クラスのオブジェクトに属していることがわかります。これを直接印刷すると、その説明の文字列が返されます。

これは BeautifulSoup の Tag オブジェクトに似ており、抽出された要素を文字列形式で表示できる .text 属性もあります。

また、WebElement クラス オブジェクトは Tag オブジェクトに似ていることも付け加えておきます。WebElement クラス オブジェクトには、属性名を通じて属性の値を抽出できるメソッドもあります。このメソッドは .get_attribute() です。

ここに画像の説明を挿入します

例を挙げてみましょう:

ここに画像の説明を挿入します
class="Teacher" を使用して、上の図で強調表示されている要素を見つけて、type 属性の値テキストを抽出してみましょう。

from selenium import webdriver  # 从selenium库中调用webdriver模块
from bs4 import BeautifulSoup # 调用BeautifulSoup库
import time

options = webdriver.ChromeOptions()
options.add_argument('--headless')  # 开启无头模式

chrome_options = webdriver.ChromeOptions() # 实例化Option对象
chrome_options.add_argument('--headless') # 对浏览器的设置
driver = webdriver.Chrome(options=chrome_options) # 声明浏览器对象

driver.get('https://localprod.pandateacher.com/python-manuscript/hello-spiderman/') # 访问页面
time.sleep(2) # 等待2秒
label = driver.find_element_by_class_name('teacher') # 根据类名找到元素
print(type(label)) # 打印label的数据类型
print(label.get_attribute('type')) # 获取type这个属性的值
driver.close() # 关闭浏览器

操作結果:

<class 'selenium.webdriver.remote.webelement.WebElement'>
text

したがって、Selenium によるデータの解析および抽出のプロセス中に、オブジェクト変換が行われると結論付けることができます。

ここに画像の説明を挿入します
ここまではWebページ内の要件を満たす最初のデータを抽出しましたが、次に複数の要素を抽出する方法を見てみましょう。

find_element_by_ は BeautifulSoup の find に似ており、要件を満たす Web ページ内の最初の要素を抽出できます。BeautifulSoup にはすべての要素を抽出するメソッド find_all があるため、selenium にもメソッドがあります。

方法も非常に簡単で、先ほどの要素を複数の要素に置き換えるだけです。

ここに画像の説明を挿入します
抽出してみます 【ハロー、スパイダーマン!] すべてのラベルタグのテキスト。

from selenium import webdriver  # 从selenium库中调用webdriver模块
from bs4 import BeautifulSoup # 调用BeautifulSoup库
import time

options = webdriver.ChromeOptions()
options.add_argument('--headless')  # 开启无头模式

chrome_options = webdriver.ChromeOptions() # 实例化Option对象
chrome_options.add_argument('--headless') # 对浏览器的设置
driver = webdriver.Chrome(options=chrome_options) # 声明浏览器对象

driver.get('https://localprod.pandateacher.com/python-manuscript/hello-spiderman/') # 访问页面
time.sleep(2) # 等待2秒

labels = driver.find_elements_by_tag_name('label') # 根据标签名提取所有元素
print(type(labels)) # 打印labels的数据类型
print(labels) # 打印labels
driver.close() # 关闭浏览器

操作結果:

<class 'list'>
[<selenium.webdriver.remote.webelement.WebElement (session="87d373c4e7a09aef4dd31f5940f8cf84", element="0.794826797904179-1")>, <selenium.webdriver.remote.webelement.WebElement (session="87d373c4e7a09aef4dd31f5940f8cf84", element="0.794826797904179-2")>]

実行結果からわかるように、抽出されるのはリスト <class 'list'> です。リストのコンテンツは WebElements オブジェクトです。これらのシンボルはオブジェクトの説明です。先ほど学習したように、そのテキスト コンテンツを返すには .text を使用する必要があります。

リストを取得したので、for ループを使用して、find_all によって返された結果と同様にリストを走査し、リスト内の各値を抽出できます。

したがって、次のコードを書いてください。

参照コード:

labels=driver.find_elements_by_tag_name('label')
for i in labels:
    print(i.text)

以上がSeleniumでデータを解析して抽出する方法です。

Selenium を使用してデータを解析および抽出する以外にも、別の解決策があります。つまり、Selenium を使用して Web ページを取得し、BeautifulSoup にそれを解析および抽出させるというものです。

次に、selenium と BeautifulSoup がどのようにうまく連携できるかを見てみましょう。

BeautifulSoup がどのように機能するかを確認してみましょう。

ここに画像の説明を挿入します
BeautifulSoup は、Web ページのソース コードを文字列形式で BeautifulSoup オブジェクトに解析し、そこからデータを抽出する必要があります。

Selenium は、完全にレンダリングされた Web ページのソース コードを取得するだけです。

入手方法は?ドライバー: page_source を使用する方法もあります。

HTML源代码字符串 = driver.page_source 

今すぐ実行して [ハロー、スパイダーマン!] を手に入れましょう。】Webページのソースコード:

from selenium import webdriver  # 从selenium库中调用webdriver模块
from bs4 import BeautifulSoup # 调用BeautifulSoup库
import time

options = webdriver.ChromeOptions()
options.add_argument('--headless')  # 开启无头模式

chrome_options = webdriver.ChromeOptions() # 实例化Option对象
chrome_options.add_argument('--headless') # 对浏览器的设置
driver = webdriver.Chrome(options=chrome_options) # 声明浏览器对象

driver.get('https://localprod.pandateacher.com/python-manuscript/hello-spiderman/') # 访问页面
time.sleep(2) # 等待2秒

pageSource = driver.page_source # 获取完整渲染的网页源代码
print(type(pageSource)) # 打印pageSource的类型
print(pageSource) # 打印pageSource
driver.close() # 关闭浏览器

Web ページのソース コード O(∩_∩)O~~ を取得して印刷することに成功しました。そのデータ型は です<class 'str'>

Response オブジェクトを BeautifulSoup に渡して分析する前に、.text メソッドを使用して Response オブジェクトの内容を文字列形式で返す必要があります。

Seleniumを使用して取得したWebページのソースコードは、すでに文字列そのものです。

ここに画像の説明を挿入します
Web ページのソース コードを文字列形式で取得した後、BeautifulSoup を使用してデータを解析して抽出できます。これは、放課後の宿題です。

ここまでで、データの解析と抽出の方法について説明しました。

セレンの使用に関して、他に何も語られていないことはありますか? 右!これは、このレベルの最初に示した関数であり、ブラウザが自動的にテキストを入力して送信をクリックするように制御します。

ここに画像の説明を挿入します
Web URL が再度提供されます。

https://localprod.pandaTeacher.com/python-manuscript/hello-spiderman/

今からこの謎を解いてみます。

ブラウザを自動化する

実際、上のアニメーションに示されている効果を実現するには、次の 2 つの新しい方法を学ぶだけで済みます。

.send_keys() # 模拟按键输入,自动填写表单
.click() # 点击元素

これら 2 行のコードを、先ほど説明したデータの解析および抽出方法と組み合わせて使用​​すると、ブラウザーを操作する効果を完成させることができます。

これを学習した後は、すべてのコードを書き留めることができます。これはまさに最初に示したもので、ローカルで実行されたコードをコピーできます。

# 本地Chrome浏览器设置方法
from selenium import webdriver # 从selenium库中调用webdriver模块
import time # 调用time模块
driver = webdriver.Chrome() # 设置引擎为Chrome,真实地打开一个Chrome浏览器

driver.get('https://localprod.pandateacher.com/python-manuscript/hello-spiderman/') # 访问页面
time.sleep(3) # 暂停三秒,等待浏览器缓冲

teacher = driver.find_element_by_id('teacher') # 找到【请输入你喜欢的老师】下面的输入框位置
teacher.send_keys('必须是吴枫呀') # 输入文字
assistant = driver.find_element_by_name('assistant') # 找到【请输入你喜欢的助教】下面的输入框位置
assistant.send_keys('都喜欢') # 输入文字
button = driver.find_element_by_class_name('sub') # 找到【提交】按钮
button.click() # 点击【提交】按钮
time.sleep(1)
driver.close() # 关闭浏览器

このコードのコマンドはブラウザを制御して何らかの操作を実行するためのものであるため、ターミナルは結果を返しません。

コピーしているときに、コードの最後の 6 行が互いに対応していることに気づきましたか? 入力してクリックする前に、まず対応する位置を見つける必要があります。検索と配置の方法は、以前に学んだ解析とメソッドです。データの抽出について。

たとえば、お気に入りの先生を入力する前に、まず Web ページのソース コードで入力ボックスの場所を見つける必要があります。方法は前に学習した方法と同じです。左上隅にある小さな矢印をクリックします。開発者ツールの をクリックし、Web ページのスペースにマウスを置きます。

ここに画像の説明を挿入します
Web ページのソース コードからわかるように、id="Teacher" または class="Teacher" に基づいてここを検索して見つけることができます。

抽出した位置情報を教師に割り当て、Teacher.send_keys() メソッドを使用して、空白に埋めたいテキストを入力します。

これで完全な操作が完了します。次の 2 つの操作の方法は同様です。ここから、コード全体が記述されます。

少し知識を付け加えておきますと、よく組み合わせて使われるinputとclickの2つのメソッドに加えて、要素の内容をクリアするために使用されるメソッド.clear()があります。

ここに画像の説明を挿入します
先ほどスペースに [Spider-Man] が入力されている場合、それを [Wu Feng] に変更したい場合は、まず .clear() を使用して [Spider-Man] という単語を消去してから、入力する必要があります。新しいテキスト。

これで、このレベルの知識説明部分はすべて完了しましたので、一緒にプロジェクトに取り組みましょう~

新しい知識を学ぶたびに、学習した知識を定着させるために、時間内に実践的な演習を行って、知識のより深い理解と記憶を形成する必要があります。

実用化

ターゲットの確認

今回はSeleniumを使ってQQ Musicの曲コメントをクロールしてみました、選んだ曲は「Sweet」です。

https://y.qq.com/n/yqq/song/000xdZuV2LcQ19.html

まだ印象に残っているかどうかはわかりませんが、レベル 5 で json を学習していたとき、QQ Music の曲の最新のコメントをクロールしました。今回は素晴らしいコメントをクロールしました。2 つのコメントのクロール メソッドは、本質的には同じ。

ここに画像の説明を挿入します

ここで、私が以前に行ったプロジェクトを実行するために Selenium を使用することにします。もちろん、怠けて頭を撫でるのは私の決定ではありませんが、慎重に検討した結果、同じプロジェクトを 2 回実行することも、場合によっては実行することもできます。何度も。

同じ目標を達成するために異なるパスを使用するこの学習およびトレーニング方法は、より完全な知識を得るのに役立ちます。

目標を確認したら、行動を開始しましょう!いつものように、コードを書く前に、まずアイデアを分析します。

分析プロセス

クローラーの 4 つのステップに従って引き続き分析します。

1 つ目はデータを取得することです。

レベル 5 の学習を通じて、必要なコメントは Web ページのソース コードにはなく、Json に保存されていることがわかりました。各ページの Json データの実際の URL を見つけるには、XHR を表示する必要があります。データを取得するためのコメントの数。

今回は Selenium を使用しているため、Selenium を介してブラウザを開いてデータが要素に読み込まれるため、URL の検索や解読にエネルギーを費やす必要はありません。

コメントを取得する方法は非常に簡単になり、Seleniumでブラウザを制御して[クリックして詳細を読み込む]ボタンをクリックするだけで、自然にコメントデータが要素に読み込まれます。

ここに画像の説明を挿入します
次はデータの解析と抽出です。

最初の解決策は、Selenium を使用してデータを抽出することです。

ここに画像の説明を挿入します
2 番目の解決策は、まず完全な Web ページのソース コードを取得し、BeautifulSoup を使用してそれをクロールすることです。どちらの方法でも、解析と抽出の作業を完了できます。

データを保存する最後のステップをスキップし、端末で直接印刷します。

全体のプロセスを整理したら、執筆を開始できます。世代!コード!ラ!

コード

まず、必要なモジュールをすべて呼び出し、Chrome ブラウザ エンジンをセットアップし、Web ページにアクセスしてデータを取得します。

from selenium import webdriver  # 从selenium库中调用webdriver模块
from bs4 import BeautifulSoup # 调用BeautifulSoup库

options = webdriver.ChromeOptions()
options.add_argument('--headless')  # 开启无头模式

chrome_options = webdriver.ChromeOptions() # 实例化Option对象
chrome_options.add_argument('--headless') # 对浏览器的设置
driver = webdriver.Chrome(options=chrome_options) # 声明浏览器对象

driver.get('https://y.qq.com/n/yqq/song/000xdZuV2LcQ19.html') # 访问页面

次に、Selenium の解析および抽出メソッドを使用して曲のコメントを取得し、出力します。

Web ページのロードには数十分の 1 秒かかるため、Web ページを取得した後、解析して抽出する前に time.sleep(2) を追加する必要があることに注意してください。 2秒間。

データを抽出するときは、まずデータが Web ページ上のどこに保存されているかを知る必要がありますが、これはまだ古い方法であり、[右クリックして検査] し、曲の素晴らしいコメントの上にマウスを置き、Elements 内の対応する位置を見つけます。 :

ここに画像の説明を挿入します
ここで注意していただきたいのは、このWebページのソースコードでは、コメントが配置されている要素に複数のクラス属性が存在しており、Seleniumを使用する場合、そのうちの1つの属性しかデータを抽出できません。

Web ページの構造を分析することにより、データを抽出するために class_name と tag_name を使用することを選択します。この曲の最初のページにある素晴らしいコメントを取得するコードは次のように記述できます。

from selenium import webdriver  # 从selenium库中调用webdriver模块
from bs4 import BeautifulSoup # 调用BeautifulSoup库
import time

options = webdriver.ChromeOptions()
options.add_argument('--headless')  # 开启无头模式

chrome_options = webdriver.ChromeOptions() # 实例化Option对象
chrome_options.add_argument('--headless') # 对浏览器的设置
driver = webdriver.Chrome(options=chrome_options) # 声明浏览器对象

driver.get('https://y.qq.com/n/yqq/song/000xdZuV2LcQ19.html') # 访问页面
time.sleep(2)

comments = driver.find_element_by_class_name('js_hot_list').find_elements_by_class_name('js_cmt_li') # 使用class_name找到评论
print(len(comments)) # 打印获取到的评论个数
for comment in comments: # 循环
    sweet = comment.find_element_by_tag_name('p') # 找到评论
    print ('评论:%s\n ---\n'%sweet.text) # 打印评论
driver.close() # 关闭浏览器

操作結果:

15
评论:想起那晚我在你耳边轻轻的的说爱你,你一脸害羞的看着我并且点点头,你此时此刻的笑像夹心饼干,双手捂着嘴,而你的脸庞笑的却如此可爱,这或许就是恋爱最甜甜的趣事吧 Jay在录制这一首歌的时候,就考虑到这歌曲风格甜美是否适合自己以往的演唱,但想到这首歌能表达出Jay对学生时代那种单纯感觉的怀念,于是造就了现在的经典 那一晚过后,我们的每次相约,你的眼中只有我,望着我的样子眼神中充满满满宠溺,我用拥抱给了你一切的回应 我喜欢的样子你都有
 ---

评论:我想留着西瓜最中间的一勺,掺杂着巧克力屑的奶油蛋糕,草莓曲奇的第一口,双皮奶的最上层,偷喝妹妹奶粉的最后一口,所有我见过最甜蜜的。却没有甜过有我所有喜欢的样子的你,你眼中的只有最喜欢你的我。
 ---

评论:这首一定是婚礼必备。这首歌里最喜欢的歌词是“啾!”,告诉我不止我一个人
 ---

评论:我也超喜欢杰伦这首《甜甜的》!从高中听到结婚生子!依旧没有改变那种甜甜的旋律!
 ---

评论:第一次实在广告里面听的,然后就开始找啊找,找的好辛苦啊。。。。一听钟情!
 ---

评论:这首甜甜的 满满的都是中学时代的回忆。 那时候还很懵懂,那时候还不懂什么是爱情,就是喜欢某个女生 喜欢和她一起的那个时光, 午后的操场 六楼的钢琴室 学校周边的街道 … 如今再也回不去了,但是这首歌里满满的都是回忆。
 ---

评论:听到这首歌想起了初中的时候,每个人心中都住着那么一个人,不是爱,也不是喜欢,但是每次见到哪怕是提到他的名字就会怦然心动的感觉,要怪就怪当时没有提起勇气告诉他,也许有些人就是用来怀念的
 ---

评论:这首歌!!真的炒鸡炒鸡甜!炒鸡甜!甜到掉牙!好了,我要去看书了
 ---

评论:刘霞,你在哪里。我为你跑了很远很远。我知道你喜欢周董,希望你能看到。我相信缘分,,,,
 ---

评论:歌如其名,如果你有心上人,大概会不自主的想到ta吧?嘴角一定也是上扬露出笑容,因为,我喜欢的样子你都有~
 ---

评论:听到这首歌想起了初中的时候,每个人心中都住着那么一个人,不是爱,是喜欢,但是每次见到哪怕是提到她的名字就会怦然心动的感觉,要怪就怪当时没有提起勇气告诉她,也许有些人就是用来怀念的
 ---

评论:早晨领份狗粮去上课那句「啾」真的萌爆了以前竟然都没注意过,这也是首适合告白的歌
 ---

评论:又啥都没干听了两小时周杰伦了…
 ---

评论:明明很煽情却一点都没有腻的感觉,这就是周董的实力吧!听到广告就觉得很海森!大爱!
 ---

评论:如果用周杰伦的歌代表我对感情的认知,应该是从情窦初开的<简单爱>到热恋期的<甜甜的>,俩个人的世界满满的好<星晴>,然而异地恋开始了,我们中间隔了一片<珊瑚海>。最后我选择了<退后>,失去了关于你的<轨迹>,但我承认这一切都是我的错,是我<搁浅>了我们之间的感情。再后来我们失去了联系,而<一路向北>也成了我的单曲循环。
 ---

今回は 15 件のコメントが抽出されましたが、次はさらに多くのコメントを取得したいと考えています。Webページ上の[クリックしてさらに読み込む]をクリックすると、新規コメント15件のデータが読み込まれます。

ここに画像の説明を挿入します
現時点では、コードの記述方法は非常に明確であり、まず、Web ページのソース コード内で [クリックして詳細をロード] の場所を見つけてクリックし、ソース コードがロードされるのを待つと、次のことができます。 30 件のコメントをすべて抽出します。

ここに画像の説明を挿入します
次のことを完了してみてください。

参照コード:

from selenium import webdriver  # 从selenium库中调用webdriver模块
from bs4 import BeautifulSoup # 调用BeautifulSoup库
import time

options = webdriver.ChromeOptions()
options.add_argument('--headless')  # 开启无头模式

chrome_options = webdriver.ChromeOptions() # 实例化Option对象
chrome_options.add_argument('--headless') # 对浏览器的设置
driver = webdriver.Chrome(options=chrome_options) # 声明浏览器对象

driver.get('https://y.qq.com/n/yqq/song/000xdZuV2LcQ19.html') # 访问页面
time.sleep(2)

loadmore=driver.find_element_by_class_name('comment__show_all').find_element_by_tag_name('a')
loadmore.click()
time.sleep(2)
comments = driver.find_element_by_class_name('js_hot_list').find_elements_by_class_name('js_cmt_li')


for i in comments:
    txt=i.find_element_by_tag_name('p')
    print(txt.text)

無事に2ページ分のコメントを取得できました、拍手を~

さらに多くのコメントを取得したい場合は、ループと条件判定を追加します。クリックしてページをめくるオプションを見つけることができれば、それを達成できます。ここではコードを書きません。授業後に自分で練習することができます。練習の目的はメソッドを学ぶことであり、実際に何千ものコメントをすべて取得する必要はありません。

先ほどは最初の解析と抽出の方法を使用しましたが、もちろん 2 番目の方法である Selenium と BeautifulSoup の組み合わせも使用できます。

まず、Selenium を使用して完全な Web ページのソース コードを取得し、次に、使い慣れた BeautifulSoup を使用してデータを解析して抽出します。

コードを書きました。以前との違いは、コードの最後の数行です。

from selenium import webdriver  # 从selenium库中调用webdriver模块
from bs4 import BeautifulSoup # 调用BeautifulSoup库
import time

options = webdriver.ChromeOptions()
options.add_argument('--headless')  # 开启无头模式

chrome_options = webdriver.ChromeOptions() # 实例化Option对象
chrome_options.add_argument('--headless') # 对浏览器的设置
driver = webdriver.Chrome(options=chrome_options) # 声明浏览器对象

driver.get('https://y.qq.com/n/yqq/song/000xdZuV2LcQ19.html') # 访问页面
time.sleep(2)

button = driver.find_element_by_class_name('js_get_more_hot') # 根据类名找到【点击加载更多】
button.click() # 点击
time.sleep(2) # 等待两秒

pageSource = driver.page_source # 获取Elements中渲染完成的网页源代码
soup = BeautifulSoup(pageSource,'html.parser')  # 使用bs解析网页
comments = soup.find('ul',class_='js_hot_list').find_all('li',class_='js_cmt_li') # 使用bs提取元素
print(len(comments)) # 打印comments的数量

for comment in comments: # 循环
    sweet = comment.find('p') # 提取评论
    print ('评论:%s\n ---\n'%sweet.text) # 打印评论
driver.close() # 关闭浏览器 # 关闭浏览器

この時点で、すべてのコードが記述されました。

同じプロジェクトをレベル 5 とは異なる方法で完了しました。さらに、データを解析して抽出するときも、2 つの方法を使用してそれを実現します。

多くの方法を学んだ後、将来同じような問題に遭遇した場合、実際の状況に基づいてどの方法を使用すればそれを達成できるかを評価し、プロジェクトを実行する方法の 1 つを選択できます。

このレベルの概要

お疲れ様でした。すべての知識を学習してプロジェクトを完了すると、レベルは終了です。

このレベルでは、Selenium ドライバーと Chrome ドライバーをインストールする方法を説明し、次にブラウザーをセットアップする方法を紹介します。

# 本地Chrome浏览器的可视模式设置:
from selenium import webdriver #从selenium库中调用webdriver模块
driver = webdriver.Chrome() # 设置引擎为Chrome,真实地打开一个Chrome浏览器

この設定方法を使用すると、ブラウザの動作を確認できます。ここで付け加えておきたいのは、ローカルのオペレーティング環境では、コンピュータの Chrome ブラウザをサイレント モードに設定することもできます。つまり、ブラウザをバックグラウンドで実行するだけで、コンピュータ上では開かないようにすることもできます。 。

クローラーを実行する場合、通常はブラウザーを開く必要はありません。クローラーの目的はデータをクロールすることであり、ブラウザーの操作プロセスを監視することではありません。この場合、ブラウザーのサイレント モードを使用できます。

その設定方法は次のようになります。

# 本地Chrome浏览器的静默模式设置:
from selenium import  webdriver #从selenium库中调用webdriver模块
from selenium.webdriver.chrome.options import Options # 从options模块中调用Options类

chrome_options = Options() # 实例化Option对象
chrome_options.add_argument('--headless') # 把Chrome浏览器设置为静默模式
driver = webdriver.Chrome(options = chrome_options) # 设置引擎为Chrome,在后台默默运行

上記のブラウザーのビジュアル設定と比較すると、行 3、5、および 6 が新しく、最初に新しいクラスである Option が呼び出され、次にそのメソッドとプロパティを通じてパラメーターがブラウザーに入力されます (ヘッドレス)。コードの 7 行目では、たった今行ったブラウザ設定が Chrome ブラウザに渡されます。

ブラウザのビジュアル モードとサイレント モードの設定は、上記の 4 行のコードの違いです。これ以降のコードはすべて同じです。

伝えたい知識はすべて伝えたので、各レベルの最後にあるルーチンのまとめに進みましょう~

Selenium を使用してデータを取得する方法、.get('URL') を学びました。
データの解析および抽出の方法:
ここに画像の説明を挿入します
このプロセスにおけるオブジェクト変換プロセス:

ここに画像の説明を挿入します
上記の方法に加えて、最初に文字列形式の Web ページのソース コードを取得する場合、Selenium を BeautifulSoup で使用してデータを解析および抽出することもできます。

HTML源代码字符串 = driver.page_source 

ブラウザの操作を自動化する方法もいくつかあります。

ここに画像の説明を挿入します

また、ブラウザを使用した後は、リソースの無駄を避けるために必ずブラウザを閉じてください。コードの最後に driver.close() の行を追加してください。

Selenium が強力なネットワーク データ収集ツールであることは、もうおわかりいただけたと思いますが、その利点はシンプルで直観的であることですが、もちろん欠点もあります。

人間のブラウザ操作をそのまま再現しているため、Webページのバッファリングを待つ必要があり、大量のデータをクロールする場合は速度が比較的遅くなります。

通常、クローラー プロジェクトでは、問題が解決できない場合、または他の方法では解決するのが難しい場合に Selenium が使用されます。

もちろん、クローラ以外にも、Selenium には多くの使用シナリオがあります。たとえば、Web ページ内の画像ファイルの表示を制御したり、CSS や JavaScript の読み込みと実行を制御したりできます。

私たちのコースは入門に向けたもので、簡単で一般的に使用される操作について説明します。さらに詳しく知りたい場合は、Selenium の公式ドキュメント リンクにアクセスしてください。現在は英語でのみ利用可能です。

https://seleniumhq.github.io/selenium/docs/api/py/api.html

次の中国語のドキュメントも参照できます。

https://selenium-python-zh.readthedocs.io/en/latest/

次のレベルでは、実践的な方法やタイミング、通知についてもお話していきますので、お会いできるのを楽しみにしています。

おすすめ

転載: blog.csdn.net/qq_41308872/article/details/132619499