蟒蛇通過硒爬取數據是很多突破封鎖的有效途徑。但在使用硒中會遇到很多問題,本文就通過一問一答的形式來通熟易懂的普及如何通過硒執行JavaScript的程序,進而獲取動態執行后的網頁。

Python爬蟲真的很強大,在爬蟲里自動操控瀏覽器_第1張圖片

蟒蛇爬蟲編程:用硒執行JavaScript的出錯了,該咋改?

問題:

小王開始學習Python的爬蟲編程了,仿佛整個互聯網的數據都快被他納入囊中了。今天,他又試圖完成一個高難度動作,他想讓硒中抓取到以下HTML后,并自動執行JS腳本,模仿鼠標自動執行一個點擊動作。但令他很失望的是,居然,居然,沒用!

            
              在學習過程中有什么不懂得可以加我的
python學習交流扣扣qun,784758214
群里有不錯的學習視頻教程、開發工具與電子書籍。
與你分享python企業當下人才需求及怎么從零基礎學習好python,和學習什么內容
1.  
              
2. Nyaralego 3. , 4. Sikonge 5. , 6. Ab-Titchaz 7. 和 8. 其他11人 9. 像 這樣。 10.

這是他執行的代碼。

            
              1.  browser.execute_script(“document.getElement(By.xpath(\”// div [@ class ='vbseo_liked'] / a [contains(@onclick,'return vbseoui.others_click(this)')] \“)。點擊()“ ) 

            
          

它沒用,沒有反應。究竟做錯了什么?

Python的大大的答案:

要點回答:

使用硒查找元素并將其傳遞execute_script()給單擊:

            
              
1.  link = browser.find_element_by_xpath('// div [@ class =“vbseo_liked”] / a [contains(@onclick,“return vbseoui.others_click(this)”)]' ) 
2.  browser.execute_script('arguments [0] .click();' ,link) 

            
          

如果要從頭解決這問題,那么以下就是需要了解它的一系列事情:

  • 如何使用JavaScript的模擬點擊?

這就是我做的東西這很簡單,但它有效:

            
              
1.  function  eventFire(el,etype){ 
2.  if(el.fireEvent){ 
3.  el.fireEvent('on'  + etype); 
4.  } else  { 
5.  var evObj = document.createEvent('Events' ); 
6.  evObj.initEvent(etype, true , false ); 
7.  el.dispatchEvent(evObj); 
8.  } 
9.  } 

            
          

用法:

            
              
1.  eventFire(document.getElementById('mytest1' ), 'click' ); 

            
          
  • 如何在Python中里進行模擬點擊呢首先制定一個自定義的預期條件,等待元素被“執行”?
            
              
1.  class wait_for_text_not_to_end_with(object): 
2.  def __init __(self,locator,text): 
3.  self.locator = locator 
4.  self.text =文字 
5.  def __call __(self,driver): 
6.  嘗試: 
7.  element_text = EC._find_element(driver,self.locator).text.strip() 
8.  return not  element_text.endswith(self.text)  
9.  除了 StaleElementReferenceException: 
10.  返回False  

            
          

如果你依然在編程的世界里迷茫,可以加入我們的Python學習扣qun:784758214,看看前輩們是如何學習的。交流經驗。從基礎的python腳本到web開發、爬蟲、django、數據挖掘等,零基礎到項目實戰的資料都有整理。送給每一位python的小伙伴!分享一些學習的方法和需要注意的小細節,點擊加入我們的 python學習者聚集地

?定義完畢后,如何在程序里調用這個類呢看看以下代碼:

            
              
1.  來自 selenium import webdriver 
2.  從 selenium.common.exceptions導入StaleElementReferenceException 
3.  來自 selenium.webdriver.common。通過導入 通過 
4.  來自 selenium.webdriver.support.ui導入WebDriverWait 
5.  從selenium.webdriver.support導入expected_conditions 作為 EC 
6.  class wait_for_text_not_to_end_with(object): 
7.  def __init __(self,locator,text): 
8.  self.locator = locator 
9.  self.text =文字 
10.  def __call __(self,driver): 
11.  嘗試: 
12.  element_text = EC._find_element(driver,self.locator).text.strip() 
13.  return not  element_text.endswith(self.text)  
14.  除了 StaleElementReferenceException: 
15.  返回False  
16.  browser = webdriver.PhantomJS() 
17.  browser.maximize_window() 
18.  browser.get(“http://www.jamiiforums.com/kenyan-news/225589-kenyan-and-tanzanian-surburbs.html” ) 
19.  username = browser.find_element_by_id(“navbar_username” ) 
20.  password  = browser.find_element_by_name(“vb_login_password_hint” ) 
21.  username.send_keys(“MarioP” ) 
22.  密碼.send_keys(“ codeswitching ” ) 
23.  browser.find_element_by_class_name(“loginbutton” )。click () 
24.  wait = WebDriverWait(瀏覽器,30) 
25.  wait.until(EC.visibility_of_element_located((. XPATH, '// h2 [contains(。,“Redirecting”)]' ))) 
26.  wait.until(EC.title_contains('Kenyan&Tanzanian' )) 
27.  wait.until(EC.visibility_of_element_located((通過.ID, 'postlist' ))) 
28.  #點擊 “其他11”  鏈接 
29.  link = browser.find_element_by_xpath('// div [@ class =“vbseo_liked”] / a [contains(@onclick,“return vbseoui.others_click(this)”)]' ) 
30.  link.click() 
31.  browser.execute_script(“” “ 
32.  function  eventFire(el,etype){ 
33.  if(el.fireEvent){ 
34.  el.fireEvent('on'  + etype); 
35.  } else  { 
36.  var evObj = document.createEvent('Events' ); 
37.  evObj.initEvent(etype, true , false ); 
38.  el.dispatchEvent(evObj); 
39.  } 
40.  } 
41.  eventFire(arguments [0], “click” ); 
42.  “”,“鏈接” 
43.  #等待 對的 “格” 不以結束與“11人鏈接這一點。”      
44.  wait.until(wait_for_text_not_to_end_with((. CLASS_NAME, 'vbseo_liked' ), “其他11個人這樣。” )) 
45.  打印 '成功!!' 
46.  瀏覽器。關閉() 

            
          

看,如何在蟒蛇里通過硒來爬取數據就是這么簡單。要點掌握好,開始編制自己的爬蟲吧。