セレンの使用
記事のプレビュー:
序文:
Selenium は自動化されたテスト ツールであり、実際の運用をシミュレートしていると簡単に理解できます。多くの Web サイト データがインターフェイスから取得され、インターフェイスが暗号化され、一部のページが JavaScript によって動的にレンダリングされ、セレン自動化がこの問題の解決に非常に効果的であるため、クローラーで非常に重要な役割を果たします。これらのアンチクローラーを克服しただけでなく、ブラウザーの現在のページのソース コードを直接取得することもできます。
セレンの原理を理解したい読者は セレンの実現原理を参考に、記事で徹底解説!
セレンのドキュメント: https://selenium-python-zh.readthedocs.io/en/latest/
1.準備
この記事では、Selenium の使用法を説明するために、例として Chrome を使用しています。開始する前に、環境とドライバーを構成する必要があります。次に、インストール方法を説明します
Chrome ブラウザが正しくインストールされ、構成されていることを確認してくださいChromeDriver
。さらに、PythonSelenium
ライブラリ(ターミナルで pip install selenium と入力してダウンロードします)。
1.1 環境のインストール
Google ダウンロード: http://chorm.sdswrj.cn/browser.html
python でセレン ライブラリをインストール: ターミナルで pip install selenium と入力します。
1.2 ドライバーのインストール (最初に注意事項を参照)
公式サイト:http
://chromedriver.storage.googleapis.com/index.html 1.3 ドライバの配置
ダウンロード後、ファイルを解凍し、開いた後に表示されます
exeファイルをコピーし、pythonディレクトリに貼り付けます:
これは作者のものですディレクトリは、読者が自分のカタログに従って入れてください
知らせ:
- ドライバはブラウザのバージョンに対応している必要があります。対応していない場合、起動に失敗します
- 多少の違いは問題ありませんが、ドライバのバージョンはブラウザのバージョンにできるだけ近いものにしてください
- ブラウザーの更新を禁止し、
cmd
Inputservices.msc
を開いてバックグラウンド サービスを開き、ブラウザーの自動更新を無効にします。これは、selenium ドライバーが機能操作のためにブラウザーを開くためです - 閉じることができない場合は、Google Update で対応するバージョンのドライバーを時間内にダウンロードする必要がありますが、実際には、インターネット上には更新を禁止するバージョンがあります。
2. ブラウザ オブジェクトを宣言する
Selenium は、Android や BlackBerry などの携帯電話のブラウザーだけでなく、Chrome、Firefox、Edge などのさまざまなブラウザーをサポートしています。さらに、インターフェイスレス ブラウザの PhantomJS もサポートされています。
2.1 次のように初期化できます。
from selenium import webdriver
browser = webdriver.Chrome() #如果使用的是Chrome浏览器,输入这一行
browser = webdriver.Firefox() #如果使用的是Firefox浏览器,输入这一行
browser = webdriver.Edge() #如果使用的是edge浏览器,输入这一行
browser = webdriver.PhantomJS() #如果使用的是phantomjs浏览器,输入这一行
browser = webdriver.Safari()
これにより、ブラウザ オブジェクトの初期化が完了し、それがブラウザ オブジェクトに割り当てられます。次に、ブラウザ オブジェクトを呼び出して、ブラウザの操作をシミュレートするさまざまなアクションを実行させるだけです。
3. 基本的な使い方
3.1. 指定したページを読み込んで閉じる
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
# 打开指定(chrome)浏览器
browser = webdriver.Chrome()
# 指定加载页面
browser.get("http://www.baidu.com/")
# 方法弃用
# browser.find_element_by_id('kw').send_keys('python')
# 通过name属性选择文本框元素,并设置内容
browser.find_element(By.NAME,'wd').send_keys("selenium")
# 通过通过ID属性获取“百度一下”按钮,并执行点击操作
browser.find_element(By.ID,"su").click()
# 提取页面
print(browser.page_source.encode('utf-8'))
# 提取cookie
print(browser.get_cookies())
# 获取当前页面截屏
print(browser.get_screenshot_as_file('123.png'))
# 提取当前请求地址
print(browser.current_url)
# 设置五秒后执行下一步
time.sleep(5)
# 关闭浏览器
browser.quit()
コードを実行すると、Chrome ブラウザーが自動的にポップアップすることがわかります。ブラウザはまずバイドゥにジャンプし、次に検索ボックスに Python と入力して、検索結果ページにジャンプします。
**Selenium4 の新機能:**https://www.dilatoit.com/zh/2020/02/02/selenium-4-xintexingqianzhan.html
4. 初期設定
from selenium import webdriver
options = webdriver.ChromeOptions()
# 禁止图片
prefs = {
"profile.managed_default_content_settings.images": 2}
options.add_experimental_option("prefs", prefs)
# 无头模式 在后台运行
# options.add_argument("-headless")
# 通过设置user-agent
user_ag='MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22;CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1'
options.add_argument('user-agent=%s'% user_ag)
#隐藏"Chrome正在受到自动软件的控制"
options.add_experimental_option('useAutomationExtension', False) # 去掉开发者警告
options.add_experimental_option('excludeSwitches', ['enable-automation'])
#设置代理
# options.add_argument("--proxy-server=http://58.20.184.187:9091")
# 初始化配置
browser = webdriver.Chrome(chrome_options=options)
#将浏览器最大化显示
browser.maximize_window()
# 设置宽高
browser.set_window_size(480, 800)
# 通过js新打开一个窗口
browser.execute_script('window.open("http://httpbin.org/ip");')
5.ノードを見つける
Selenium は、フォームへの入力、クリックのシミュレーションなど、さまざまな操作を完了するようにブラウザーを駆動できます。たとえば、入力ボックスにテキストを入力したり、データを取得したりする操作を完了したい場合、Selenium はノードを見つけるための一連のメソッドを提供します. これらのメソッドを使用して、目的のノードを取得し、いくつかのアクションを実行したり、OK を実行したりできます。 .
Selenium は 2 つのメソッドを提供します
find_element()
シリーズ: 個々のページ要素を見つけるために使用されます。find_elements()
シリーズ: ページ要素のグループを見つけるために使用され、取得されるのはリストのグループです。
5.1 単一ノード
コードで実装しましょう:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys # 模拟键盘操作
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Chrome()
browser.get("http://www.baidu.com")
# 通过name属性选择文本框元素,并设置内容
s = browser.find_element(By.NAME,'wd')
s.send_keys('衣服')
s.send_keys(Keys.ENTER) # 回车 确定的意思
各種ノード抽出デモ
browser.get("http://www.baidu.com")
# ID选折起定位
input_text = browser.find_element(By.ID, "kw")
input_text.send_keys("selenium")
# CSS 选择器定位
s =browser.find_element(By.CSS_SELECTOR,'input.s_ipt')
s.send_keys('衣服')
# xpath 选择器定位
s = browser.find_element(By.XPATH,'//input[@id="kw"]')
s.send_keys('衣服')
5.2 複数のノード
条件を満たすすべてのノードを見つけたい場合は、find_elements() のようなメソッドを使用する必要があります。このメソッドの名前には、要素に余分な s があることに注意してください。区別に注意してください。
これは次のように実現できます。
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.icswb.com/channel-list-channel-161.html')
lis = browser.find_elements(By.CSS_SELECTOR,'#NewsListContainer li')
print(lis)
取得したコンテンツがリスト型になり、リスト内の各ノードが WebElement 型になっていることがわかります。
6.ノードの相互作用
Selenium は、ブラウザーにいくつかの操作を実行させることができます。つまり、ブラウザーにいくつかのアクションをシミュレートして実行させることができます。より一般的な使用法は次のとおりです。テキストを入力するときに send_keys メソッドを使用し、テキストをクリアするときに clear メソッドを使用し、ボタンをクリックするときに click メソッドを使用します。例は次のとおりです。
from selenium import webdriver
import time
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
input = browser.find_element(By.ID,'kw')
input.send_keys('iPhone')
time.sleep(1)
input.clear()
input.send_keys('iPad')
button = browser.find_element(By.ID,'su')
button.click()
上記の方法で、いくつかの共通ノードのアクション操作を完了しました. より多くの操作については、公式ドキュメントのインタラクティブアクションの紹介を参照してください
: http://selenium-python.readthedocs.io/api.html#module -selenium.webdriver .remote.webelement .
7. IFrame を切り替える (通常、これはノードを選択できない問題です)
iframe という Web ページには、ページのサブページに相当するサブフレームであるノードがあり、その構造は外部の Web ページとまったく同じであることがわかっています。Selenium がページを開いた後、既定では親 Frame で動作し、この時点でページに子 Frame がある場合、子 Frame のノードを取得できません。このとき、switch_to.frame() メソッドを使用してフレームを切り替える必要があります。例は次のとおりです。
browser.get('https://www.douban.com/')
login_iframe=browser.find_element(By.XPATH,'//div[@class="login"]/iframe')
browser.switch_to.frame(login_iframe)
browser.find_element(By.CLASS_NAME,'account-tab-account').click()
browser.find_element(By.ID,'username').send_keys('123123123')
**注:** iframe Web ページの場合、検索できるように切り替える必要があります。
8.アクションチェーン
上記の例では、特定のノードに対していくつかのインタラクティブなアクションが実行されます。たとえば、入力ボックスの場合は入力テキスト メソッドとクリア テキスト メソッドを呼び出し、ボタンの場合はクリック メソッドを呼び出します。実際には、マウスのドラッグ、キーボードのキーなど、特定の実行オブジェクトを持たない他の操作があります。これらのアクションは別の方法、つまりアクション チェーンで実行されます。
たとえば、ノードのドラッグ操作を今すぐ実装するには、ノードをある場所から別の場所にドラッグするには、次のように実装できます。
from selenium import webdriver
from selenium.webdriver import ActionChains
browser = webdriver.Chrome()
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
log = browser.find_element(By.XPATH, '//div[@id="iframewrapper"]/iframe')
browser.switch_to.frame(log)
source = browser.find_element(By.CSS_SELECTOR,'#draggable')
target = browser.find_element(By.CSS_SELECTOR,'#droppable')
actions = ActionChains(browser)
actions.drag_and_drop(source, target)
actions.perform()
drag_and_drop()
このメソッドにはパラメーターの受け渡しが含まれ、1 つはドラッグされる要素の始点であり、もう 1 つはドラッグされる要素の終点です。
まず、Webページでドラッグインスタンスを開き、ドラッグするノードとドラッグするターゲットノードを順番に選択し、ActionChainsオブジェクトを宣言してactions変数に割り当て、次にオブジェクトのdrag_and_drop()メソッドを呼び出しますactions 変数を呼び出してから perform を呼び出します () メソッドがアクションを実行し、この時点でドラッグ操作が完了します
9.ページスクロール
住所:https://36kr.com/
# 浏览器滚动到底部 10000位置
document.documentElement.scrollTop=10000
# 滚动到顶部
document.documentElement.scrollTop=0
# 移动到页面最底部
browser.execute_script("window.scrollTo(0, document.body.scrollHeight)")
# 移动到指定的坐标(相对当前的坐标移动)
driver.execute_script("window.scrollBy(0, 700)")
# 结合上面的scrollBy语句,相当于移动到700+800=1600像素位置
driver.execute_script("window.scrollBy(0, 800)")
# 移动到窗口绝对位置坐标,如下移动到纵坐标1600像素位置
driver.execute_script("window.scrollTo(0, 1600)")
# 结合上面的scrollTo语句,仍然移动到纵坐标1200像素位置
driver.execute_script("window.scrollTo(0, 1200)")
要約:
Selenium 自動化ツールについては、ブロガーは個人的に非常に興味深いツールだと感じています.たとえば、スーパースター学習パスが直接 2 倍の速度を開くことができない場合、または進行状況バーを調整できない場合は、Selenium 自動化を使用することを選択できます.ツール. よく考えて、夜寝てください Dajue、セレンも実際の人をシミュレートしてクラスを磨くのに非常にクールなものですが、読者は使用法にもっと注意を払う必要があります.ただそれを学び、悪いことをしないでください!