加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

Python爬虫很强大,在爬虫里如何自动操控浏览器呢?

发布时间:2019-08-01 06:37:23 所属栏目:建站 来源:python大大
导读:概述: python通过selenium爬取数据是许多打破封闭的有用途径。但在行使selenium中会碰着许多题目,本文就通过一问一答的情势来通熟易懂的遍及怎样通过selenium执行javascript措施,进而获取动态执行后的网页。假如你喜好,接待转发本文。 python爬虫编程

 概述:

python通过selenium爬取数据是许多打破封闭的有用途径。但在行使selenium中会碰着许多题目,本文就通过一问一答的情势来通熟易懂的遍及怎样通过selenium执行javascript措施,进而获取动态执行后的网页。假如你喜好,接待转发本文。

Python爬虫很强盛,在爬虫里怎样自动操控赏识器呢?

python爬虫编程:用selenium执行javascript堕落了,该咋改?

题目:

小明开始进修python爬虫编程了,似乎整个互联网的数据都快被他纳入囊中了。本日,他又试图完成一个高难度举措,他想让selenium中抓取到以下HTML后,并自动执行js剧本,仿照鼠标自动执行一个点击举措。但令他很扫兴的是,居然,居然,没用!

  1. <div class="vbseo_liked"> 
  2. <a href="http://www.jamiiforums.com/member.php?u=8355" rel="nofollow">Nyaralego</a> 
  3. <a href="http://www.jamiiforums.com/member.php?u=8870" rel="nofollow">Sikonge</a> 
  4. <a href="http://www.jamiiforums.com/member.php?u=8979" rel="nofollow">Ab-Titchaz</a> 
  5. and 
  6. <a onclick="return vbseoui.others_click(this)" href="http://www.jamiiforums.com/kenyan-news/225589-kenyan-and-tanzanian-surburbs.html#">11 others</a> 
  7. like this. 
  8. </div> 

这是他执行的代码。

  1. browser.execute_script("document.getElement(By.xpath("//div[@class='vbseo_liked']/a[contains(@onclick, 'return vbseoui.others_click(this)')]").click()") 

它没用,没有回响。毕竟做错了什么?

Python大大的谜底:

要点答复:

行使selenium查找元素并将其转达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.  } 

用法:

  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 = text 
  5.  def __call__(self, driver): 
  6.  try : 
  7.  element_text = EC._find_element(driver, self.locator).text.strip() 
  8.  return not element_text.endswith(self.text) 
  9.  except StaleElementReferenceException: 
  10.  return False 

界说完毕后,如安在措施里挪用这个类呢?看看以下代码:

  1. from selenium import webdriver 
  2. from selenium.common.exceptions import StaleElementReferenceException 
  3. from selenium.webdriver.common.by import By 
  4. from selenium.webdriver.support.ui import WebDriverWait 
  5. from selenium.webdriver.support import expected_conditions as EC 
  6. class wait_for_text_not_to_end_with(object): 
  7.  def __init__(self, locator, text): 
  8.  self.locator = locator 
  9.  self.text = text 
  10.  def __call__(self, driver): 
  11.  try : 
  12.  element_text = EC._find_element(driver, self.locator).text.strip() 
  13.  return not element_text.endswith(self.text) 
  14.  except StaleElementReferenceException: 
  15.  return 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. password.send_keys("codeswitching") 
  23. browser.find_element_by_class_name("loginbutton").click() 
  24. wait = WebDriverWait(browser, 30) 
  25. wait.until(EC.visibility_of_element_located((By.XPATH, '//h2[contains(., "Redirecting")]'))) 
  26. wait.until(EC.title_contains('Kenyan & Tanzanian')) 
  27. wait.until(EC.visibility_of_element_located((By.ID, 'postlist'))) 
  28. # click "11 others" link 
  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. eventFire(arguments[0], "click"); 
  41. """, link) 
  42. # wait for the "div" not to end with "11 others link this." 
  43. wait.until(wait_for_text_not_to_end_with((By.CLASS_NAME, 'vbseo_liked'), "11 others like this.")) 
  44. print 'success!!' 
  45. browser.close() 

看,如安在python里通过selenium来爬取数据就是这么简朴。要点把握好,开始体例本身的爬虫吧。

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读