蟒蛇通過硒爬取數據是很多突破封鎖的有效途徑。但在使用硒中會遇到很多問題,本文就通過一問一答的形式來通熟易懂的普及如何通過硒執行JavaScript的程序,進而獲取動態執行后的網頁。
蟒蛇爬蟲編程:用硒執行JavaScript的出錯了,該咋改?
問題:
小王開始學習Python的爬蟲編程了,仿佛整個互聯網的數據都快被他納入囊中了。今天,他又試圖完成一個高難度動作,他想讓硒中抓取到以下HTML后,并自動執行JS腳本,模仿鼠標自動執行一個點擊動作。但令他很失望的是,居然,居然,沒用!
在學習過程中有什么不懂得可以加我的
python學習交流扣扣qun,784758214
群里有不錯的學習視頻教程、開發工具與電子書籍。
與你分享python企業當下人才需求及怎么從零基礎學習好python,和學習什么內容
1.
這是他執行的代碼。
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. 瀏覽器。關閉()
看,如何在蟒蛇里通過硒來爬取數據就是這么簡單。要點掌握好,開始編制自己的爬蟲吧。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
