Selenium ライブラリと PhantomJ は一緒に使用すると多用途なツールになるという人もいます。では、それらは本当に強力なのでしょうか? Selenium ライブラリの使用法を見てみましょう。この記事では、PhantomJs、Chrome、その他のブラウザと組み合わせた Selenium ライブラリの動作を見てみましょう。
Selenium とは
Selenium は、Chrome、Firefox、Safari、PhantomJs などの一部のブラウザをサポートする自動テスト ツールです。クローラーで使用する場合は、主に JavaScript レンダリングの問題を解決するために使用します。
リクエスト ライブラリを使用して 163music などの Web ページをリクエストする場合、取得する応答データはブラウザに表示される情報のすべてではありません。彼は js を通じてレンダリングされる可能性があります。 Selenium ライブラリを使用すれば、この問題をどう解決するかは気にしなくなります。
私たちのブラウザ (PhantomJs など) はインターフェースのないブラウザなので、JS のレンダリングと解析に使用され、Selenium ライブラリはいくつかのコマンドをブラウザに送信し、ドロップダウンやドロップダウンなどのコマンドをシミュレートする役割を果たします。ドラッグ、ページめくり、フォーム入力などのアクション。このように、これら 2 つを組み合わせることで、JS レンダリングの問題を完全に解決できます。
注意
Selenium ライブラリと PhantomJs は非常に便利ですが、結局のところ、ブラウザを駆動してデータを取得します。したがって、これを使用すると、使用する一部の解析ライブラリほど高速ではないことがわかります。実はこれが欠点なので、本当に解決策が見つからない限りは使用しないことをお勧めします。
インストールの準備
pip は Selenium ライブラリを直接インストールします:
pip install selenium
ブラウザ ドライバのインストール:
Chrome ブラウザ ドライバ
PhantomJs ブラウザ ドライバ
インストールされたブラウザ ドライバを環境変数に設定する必要があります。 Windows ユーザーにとって、環境変数の設定はさらに面倒です。ダウンロードしたドライバーの場所を見つけて、そのファイルの場所をコピーして環境変数に貼り付ける必要があります。
設定が完了しました。コマンドラインを入力します:
phantomjs -v
成功したかどうかを確認します。
使用例
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait browser = webdriver.Chrome() try: browser.get('http://www.yukunweb.com') input = browser.find_element_by_id('s') input.send_keys('Python') input.send_keys(Keys.ENTER) wait = WebDriverWait(browser, 10) wait.until(EC.presence_of_element_located((By.ID, 'main'))) print(browser.current_url) print(browser.page_source) finally: browser.close()
上記のコードを実行すると、Chrome ブラウザがローカルで開いていることがわかり、ブログの URL を入力すると、彼は検索バーに自動的に「Python」と入力し、Enter をクリックして検索します。そして結果ページのURLとソースコードを出力します。
PhantomJs にはインターフェースがなく、効果を確認するのが不便であるため、私たちの例はすべて Chrome ブラウザを使用して操作されています。間違って実行した場合、通常はブラウザが開いていないため、Chrome ブラウザがインストールされていないか、環境変数でドライバが設定されていない可能性があります。
では、これらのコード行は何を意味し、どのような指示を与えるのでしょうか?
ブラウザ オブジェクトを宣言します
from selenium import webdriver browser = webdriver.Chrome() # 声明其他浏览器 browser = webdriver.PhantomJs() browser = webdriver.Firefox()
これは、Selenium ライブラリの Webdriver メソッドを呼び出し、転送のために Chrome ブラウザをインスタンス化するのと同じです。 。
ページにアクセス
from selenium import webdriver browser = webdriver.Chrome() browser.get('http://www.yukunweb.com')
アクセスしたい URL を get メソッドに渡します。ブラウザを呼び出して URL にアクセスします。
要素の検索
input = browser.find_element_by_id('s')
このコードは、find_element_by_id メソッドを呼び出します。名前が示すように、ID が ' のタグを検索します。 s' の場合、それが操作の場合、class が 's' の場合、find_element_by_class('s') になります。
もちろん、CSS セレクターと xpath セレクターを使用して要素を検索することもできます。
input = browser.find_element_by_css_selector("#s") print(input) input = browser.find_element_by_xpath('//*[@id="s"]') print(input)
結果を出力すると、どのセレクターが使用されても、検索結果は次のとおりであることがわかります。同じ。以下にいくつかの検索 API を示します。
find_element_by_namefind_element_by_xpathfind_element_by_link_textfind_element_by_partial_link_textfind_element_by_tag_namefind_element_by_class_namefind_element_by_css_selector
複数の要素の検索
探している要素が Web ページ内の li タグの場合、要素は多数あります。この場合、検索方法は単一要素の場合と同じですが、検索 API では要素の後に複数形を追加する必要がある点が異なります。つまり:
find_elements_by_namefind_elements_by_xpathfind_elements_by_link_textfind_elements_by_partial_link_textfind_elements_by_tag_namefind_elements_by_class_namefind_elements_by_css_selector
要素対話型操作
は、命令を発行し、取得した要素に対して対話型メソッドを呼び出すことです。
browser.get('http://www.yukunweb.com') input = browser.find_element_by_id('s') input.send_keys('Python') input.send_keys(Keys.ENTER)
このコードでは、まず ID が 's' の要素を見つけ、次にそれに 'Python' 値を渡し、対話型メソッドを呼び出して return car と入力します。
もちろん、ほとんどの場合、Enter キーを押した後にフォームが送信されたかどうかがわからないため、Enter キーを押す方法を直接使用することはできません。ファインダーを使用して送信ボタン要素を見つけ、クリックをシミュレートする必要があります。
button = browser.find_element_by_class_name('xxxx') button.click() # 清除表单信息 button.clear()
これにより、ログインをシミュレートするときに、アカウント番号とパスワードを直接入力できることがわかります。検証コードがある場合は、入力方法を直接提供します。検証コードを手動で入力し、フォームに渡します。ログインのシミュレーションは非常に簡単ですか? #########交流######
元素交互动作与上面的操作是不同的。上面的操作需要获得一个特定的元素。然后对这个特定的元素调用一些指令,才可以完成交互。而这个交互是将这些动作附加到动作链中串行执行。
我们以拖拽元素为例(我们需要导入ACtionChains方法):
from selenium import webdriver from selenium.webdriver import ActionChains browser = webdriver.Chrome() browser.get(url) source = browser.find_element_by_name("source") target = browser.find_element_by_name("target") actions = ActionChains(browser) actions.drag_and_drop(source, target).perform()
这里的sourcs是我们要拖拽的元素,我们使用查找器找到他,target就是我们要拖拽到的位置元素。然后调用ActionChains方法,实现拖拽操作。
执行JavaScript
有些动作呢,Selenium库并没有为我们提供特定的api,比如说将浏览器进度条下拉,这个实现起来是很难的。那么我们就可以通过让Selenium执行JS来实现进度条的下拉,这个得需要一些js的知识,不过还是很简单的。
from selenium import webdriver browser = webdriver.Chrome() browser.get('http://www.yukunweb.com') browser.execute_script('window.scrollTo(0, document.body.scrollHeight)') browser.execute_script('alert("到达底部")')
这就相当于我们将一些JS命令传给Selenium的execute_script这个api,我们运行就可以看到浏览器下拉到底部,然后弹出会话框。
获取元素文本值
如果我们查找得到一个元素,我们要怎样获得元素的一些属性和文本信息呢?
from selenium import webdriver browser = webdriver.Chrome() browser.get('http://www.yukunweb.com') name = browser.find_element_by_css_selector('#kratos-logo > a') print(name.text) print(name.get_attribute('href'))
运行结果可以看到,他打印出了‘意外’和他的url。
Frame框架
有些网页在我们直接使用Selenium驱动浏览器打印源码的时候,并没有如期获得想要的数据,那在我们查看网页源码的时候,可以看到网页的iframe标签包裹的一个一个的框架。那么这就需要我们请求对应框架,拿到源码了。
我们以网易云音乐的歌手栏为例。
from selenium import webdriver browser = webdriver.Chrome() browser.get('https://music.163.com/#/discover/artist/signed/') print(browser.page_source)
可以查看结果,并没有我们想要的信息。
from selenium import webdriver browser = webdriver.Chrome() browser.get('https://music.163.com/#/discover/artist/signed/') browser.switch_to.frame('contentFrame') print(browser.page_source)
这次打印,我们就可以看到我们需要的信息了,是不是很简单。
显示等待
在文章开始的时候,我们运行的那段代码中有一段代码是不是还没有说。那就是我们命令浏览器等待的操作。
等待有两种方式,一种是隐士等待,一种是显示等待。当使用了隐士等待执行时,如果浏览器没有找到指定元素,将继续等待,如果超出设定时间就会抛出找不到元素的异常。而大多数情况我们建议使用显示等待。
显示等待是你指定一个等待的条件,还指定一个最长等待时间。那么程序会在最长等待时间内,判断条件是否成立,如果成立,立即返回。如果不成立,他会一直等待,直到最长等待时间结束,如果条件仍然不满足,就返回异常。
wait = WebDriverWait(browser, 10) wait.until(EC.presence_of_element_located((By.ID, 'main')))
这里的By.ID方法实际上就是一个查找的万能方法,而我们直接查找或者使用CSS、xpath查找足够满足,我也不过多介绍,想要了解可以查看官方文档。
这里是知道查找到id为‘main’就返回。
显示等待的一些条件还有:
title_is 标题是某内容
title_contains 标题包含某内容
presence_of_element_located 元素加载出,传入定位元组,如(By.ID, ‘p’)
visibility_of_element_located 元素可见,传入定位元组
visibility_of_element_located 元素可见,传入定位元组
visibility_of_element_located 元素可见,传入定位元组
visibility_of 可见,传入元素对象
presence_of_all_elements_located 所有元素加载出
text_to_be_present_in_element 某个元素文本包含某文字
text_to_be_present_in_element_value 某个元素值包含某文字
frame_to_be_available_and_switch_to_it frame加载并切换
invisibility_of_element_located 元素不可见
element_to_be_clickable 元素可点击
staleness_of 判断一个元素是否仍在DOM,可判断页面是否已经刷新
element_to_be_selected 元素可选择,传元素对象
element_located_to_be_selected 元素可选择,传入定位元组
element_selection_state_to_be 传入元素对象以及状态,相等返回True,否则返回False
element_located_selection_state_to_be 传入定位元组以及状态,相等返回True,否则返回False
alert_is_present 是否出现Alert
窗口选择
如果我们在表单输入关键词,提交表单后浏览器新打开了一个窗口,那么我们要怎么去操作新的窗口呢?索性Selenium为我们提供了对应的api.
import time from selenium import webdriver from selenium.webdriver.common.keys import Keys browser = webdriver.Chrome() browser.get('http://www.23us.cc/') input = browser.find_element_by_id('bdcs-search-form-input') input.send_keys('斗破苍穹') input.send_keys(Keys.ENTER) browser.switch_to_window(browser.window_handles[1]) print(browser.current_url) time.sleep(1) browser.switch_to_window(browser.window_handles[0]) print(browser.current_url)
通过打印结果,不难看出先打印了搜索结果窗口url,然后打印了索引页url。要注意窗口的索引是从 0 开始的哦,这个大家都明白。
异常处理
异常处理和普通的异常处理一样,没有什么要说的,大家自己查看官方异常 api.地址
最后
さて、この記事を通じて、Selenium ライブラリとブラウザ ドライバーを組み合わせて使用する方法のいくつかを基本的に理解していただければ幸いです。この例では Chrome を使用していますが、実際のコードでは PhantomJs を使用するのが最適です。これはインターフェイスがなく、比較的高速に動作するためです。
記事の冒頭で、Selenium は非常に遅いため、一般に使用することはお勧めできないと述べました。でも、ゆっくりでもすごくカッコいいですよね。
以上がSelenium+PhantomJs は、Js の基本的な操作を解析してレンダリングします。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。