Python爬虫真的很强大,在爬虫里自动操控浏览器

蟒蛇通过硒爬取数据是很多突破封锁的有效途径。但在使用硒中会遇到很多问题,本文就通过一问一答的形式来通熟易懂的普及如何通过硒执行JavaScript的程序,进而获取动态执行后的网页。

Python爬虫真的很强大,在爬虫里自动操控浏览器

蟒蛇爬虫编程:用硒执行JavaScript的出错了,该咋改?

问题:

小王开始学习Python的爬虫编程了,仿佛整个互联网的数据都快被他纳入囊中了。今天,他又试图完成一个高难度动作,他想让硒中抓取到以下HTML后,并自动执行JS脚本,模仿鼠标自动执行一个点击动作。但令他很失望的是,居然,居然,没用!

在学习过程中有什么不懂得可以加我的
python学习交流扣扣qun,784758214
群里有不错的学习视频教程、开发工具与电子书籍。
与你分享python企业当下人才需求及怎么从零基础学习好python,和学习什么内容
1.  <div class = “vbseo_liked” > 
2.  <a href= "http://www.jamiiforums.com/member.php?u=8355" rel= "nofollow"> Nyaralego </a> 
3.  , 
4.  <a href= "http://www.jamiiforums.com/member.php?u=8870" rel= "nofollow"> Sikonge </a> 
5.  , 
6.  <a href= "http://www.jamiiforums.com/member.php?u=8979" rel= "nofollow"> Ab-Titchaz </a> 
7.  和 
8.  <a onclick= "return vbseoui.others_click(this)" href= "http://www.jamiiforums.com/kenyan-news/225589-kenyan-and-tanzanian-surburbs.html#"> 其他11人</a> 
9.  像 这样。 
10.  </ DIV> 

这是他执行的代码。

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.  浏览器。关闭() 

看,如何在蟒蛇里通过硒来爬取数据就是这么简单。要点掌握好,开始编制自己的爬虫吧。

猜你喜欢

转载自blog.51cto.com/14510224/2435937