您好,登錄后才能下訂單哦!
Python爬蟲怎么用Selenium模擬用戶操作?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
Selenium是一個Web的自動化測試工具,最初是為網站自動化測試而開發的,類型像我們玩游戲用的按鍵精靈,可以按指定的命令自動操作,不同是Selenium 可以直接運行在瀏覽器上,它支持所有主流的瀏覽器(包括PhantomJS這些無界面的瀏覽器)。
Selenium 可以根據我們的指令,讓瀏覽器自動加載頁面,獲取需要的數據,甚至頁面截屏,或者判斷網站上某些動作是否發生。
Selenium 自己不帶瀏覽器,不支持瀏覽器的功能,它需要與第三方瀏覽器結合在一起才能使用。
先下載selenium webdriver ‘geckodriver.exe’,下載好后放到python目錄里面;
firefox的目錄也要添加到環境變量中;
Selenium 庫里有個叫 WebDriver 的 API。WebDriver 有點兒像可以加載網站的瀏覽器,但是它也可以像 BeautifulSoup 或者其他 Selector 對象一樣用來查找頁面元素,與頁面上的元素進行交互 (發送文本、點擊等),以及執行其他動作來運行網絡爬蟲。
selenium快速入門
#!/usr/bin/env python # -*- coding:utf-8 -*- from selenium import webdriver # 要想調用鍵盤按鍵操作需要引入keys包 from selenium.webdriver.common.keys import Keys #創建瀏覽器對象 driver = webdriver.Firefox() driver.get("http://www.baidu.com") #打印頁面標題“百度一下你就知道” print driver.title #生成當前頁面快照 driver.save_screenshot("baidu.png") # id="kw"是百度搜索框,輸入字符串“微博”,跳轉到搜索中國頁面 driver.find_element_by_id("kw").send_keys(u"微博") # id="su"是百度搜索按鈕,click() 是模擬點擊 driver.find_element_by_id("su").click() # 獲取新的頁面快照 driver.save_screenshot(u"微博.png") # 打印網頁渲染后的源代碼 print driver.page_source # 獲取當前頁面Cookie print driver.get_cookies() # ctrl+a 全選輸入框內容 driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a') # ctrl+x 剪切輸入框內容 driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x') # 輸入框重新輸入內容 driver.find_element_by_id("kw").send_keys("test") # 模擬Enter回車鍵 driver.find_element_by_id("su").send_keys(Keys.RETURN) # 清除輸入框內容 driver.find_element_by_id("kw").clear() # 生成新的頁面快照 driver.save_screenshot("test.png") # 獲取當前url print driver.current_url # 關閉當前頁面,如果只有一個頁面,會關閉瀏覽器 # driver.close() # 關閉瀏覽器 driver.quit()
1.頁面操作
假如有下面的輸入框
<input type="text" name="user-name" id="passwd-id" />
尋找方法
# 獲取id標簽值 element = driver.find_element_by_id("passwd-id") # 獲取name標簽值 element = driver.find_element_by_name("user-name") # 獲取標簽名值 element = driver.find_elements_by_tag_name("input") # 也可以通過XPath來匹配 element = driver.find_element_by_xpath("//input[@id='passwd-id']")
2.定位元素的方法
find_element_by_id find_elements_by_name find_elements_by_xpath find_elements_by_link_text find_elements_by_partial_link_text find_elements_by_tag_name find_elements_by_class_name find_elements_by_css_selector
3.鼠標動作
#!/usr/bin/env python # -*- coding:utf-8 -*- from selenium import webdriver # 要想調用鍵盤按鍵操作需要引入keys包 from selenium.webdriver.common.keys import Keys from selenium.webdriver import ActionChains #創建瀏覽器對象 driver = webdriver.Firefox() driver.get("http://www.baidu.com") #鼠標移動到某處 action1 = driver.find_element_by_id("su") ActionChains(driver).move_to_element(action1).perform() #鼠標移動到某處單擊 action2 = driver.find_element_by_id("su") ActionChains(driver).move_to_element(action2).click(action2).perform() #鼠標移動到某處雙擊 action3 = driver.find_element_by_id("su") ActionChains(driver).move_to_element(action3).double_click(action3).perform() # 鼠標移動到某處右擊 action4 = driver.find_element_by_id("su") ActionChains(driver).move_to_element(action4).context_click(action4).perform()
4.Select表單
遇到下來框需要選擇操作時,Selenium專門提供了Select類來處理下拉框。
# 導入 Select 類 from selenium.webdriver.support.ui import Select # 找到 name 的選項卡 select = Select(driver.find_element_by_name('status')) # select.select_by_index(1) select.select_by_value("0") select.select_by_visible_text(u"xxx")
以上是三種選擇下拉框的方式,它可以根據索引來選擇,可以根據值來選擇,可以根據文字來選擇。注意:
1.index 索引從 0 開始。
2.value是option標簽的一個屬性值,并不是顯示在下拉框中的值。
3.visible_text是在option標簽文本的值,是顯示在下拉框的值。
全部取消方法
select.deselect_all()
5.彈窗處理
當頁面出現了彈窗提示
alert = driver.switch_to_alert()
6.頁面切換
一個瀏覽器肯定會有很多窗口,所以我們肯定要有方法來實現窗口的切換。切換窗口的方法如下:
driver.switch_to.window("this is window name")
7.頁面前進和后退
操作頁面的前進和后退功能:
driver.forward() #前進 driver.back() # 后退
實例
模擬登陸douban網站
#!/usr/bin/env python # -*- coding:utf-8 -*- from selenium import webdriver from selenium.webdriver.common.keys import Keys import time driver = webdriver.Firefox() driver.get("http://www.douban.com") # 輸入賬號密碼 driver.find_element_by_name("form_email").send_keys("158xxxxxxxx") driver.find_element_by_name("form_password").send_keys("zhxxxxxxxx") # 模擬點擊登錄 driver.find_element_by_xpath("//input[@class='bn-submit']").click() # 等待3秒 time.sleep(3) # 生成登陸后快照 driver.save_screenshot(u"douban.png") driver.quit()
動態頁面模擬點擊--->>>爬取斗魚所有房間名,觀眾人數
(1)首先分析‘’下一頁‘’的class變化,如果不是最后一頁的時候,‘下一頁’的class如下:
(2)如果到了最后一頁,‘下一頁’變為隱藏,點擊不了,class變為如下:
(3)找到個房間的名字和觀眾人數的class
(4)代碼
#!/usr/bin/env python # -*- coding:utf-8 -*- import unittest from selenium import webdriver from bs4 import BeautifulSoup as bs class douyu(unittest.TestCase): # 初始化方法,必須是setUp() def setUp(self): self.driver = webdriver.Firefox() self.num = 0 self.count = 0 # 測試方法必須有test字樣開頭 def testDouyu(self): self.driver.get("https://www.douyu.com/directory/all") while True: soup = bs(self.driver.page_source, "lxml") # 房間名, 返回列表 names = soup.find_all("h4", {"class" : "ellipsis"}) # 觀眾人數, 返回列表 numbers = soup.find_all("span", {"class" :"dy-num fr"}) # zip(names, numbers) 將name和number這兩個列表合并為一個元組 : [(1, 2), (3, 4)...] for name, number in zip(names, numbers): print u"觀眾人數: -" + number.get_text().strip() + u"-\t房間名: " + name.get_text().strip() self.num += 1 #self.count += int(number.get_text().strip()) # 如果在頁面源碼里找到"下一頁"為隱藏的標簽,就退出循環 if self.driver.page_source.find("shark-pager-disable-next") != -1: break # 一直點擊下一頁 self.driver.find_element_by_class_name("shark-pager-next").click() # 測試結束執行的方法 def tearDown(self): # 退出Firefox()瀏覽器 print "當前網站直播人數" + str(self.num) print "當前網站觀眾人數" + str(self.count) self.driver.quit() if __name__ == "__main__": # 啟動測試模塊 unittest.main()
爬取的結果:
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。