蟒蛇通过硒爬取数据是很多突破封锁的有效途径。但在使用硒中会遇到很多问题,本文就通过一问一答的形式来通熟易懂的普及如何通过硒执行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. 浏览器。关闭()
看,如何在蟒蛇里通过硒来爬取数据就是这么简单。要点掌握好,开始编制自己的爬虫吧。