自动浏览器_python爬虫很强大,在爬虫里如何自动操控浏览器呢?点进获取答案...

概述:

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

5a89607e67a0515214fb418b048e0888.png

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

问题:

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

Nyaralego,Sikonge,Ab-Titchazand11 otherslike this.

这是他执行的代码。

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

它没用,没有反应。究竟做错了什么?

Python大大的答案:

要点回答:

使用selenium查找元素并将其传递execute_script()给单击:

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

如果要从头解决这问题,那么以下就是需要了解它的一系列事情:

  • 如何使用JavaScript模拟点击?

这就是我做的东西。这很简单,但它有效:

function eventFire(el, etype){ if (el.fireEvent) { el.fireEvent('on' + etype); } else { var evObj = document.createEvent('Events'); evObj.initEvent(etype, true, false); el.dispatchEvent(evObj); }}

用法:

eventFire(document.getElementById('mytest1'), 'click');
725967cd4baace94c9671796408b0d1b.png
  • 如何在Python里进行模拟点击呢?首先制定一个自定义的预期条件,等待元素被“执行”:
class wait_for_text_not_to_end_with(object): def __init__(self, locator, text): self.locator = locator self.text = text def __call__(self, driver): try : element_text = EC._find_element(driver, self.locator).text.strip() return not element_text.endswith(self.text) except StaleElementReferenceException: return False

定义完毕后,如何在程序里调用这个类呢?看看以下代码:

30a5245ba5dd336a246cfaf969993814.png
from selenium import webdriverfrom selenium.common.exceptions import StaleElementReferenceExceptionfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECclass wait_for_text_not_to_end_with(object): def __init__(self, locator, text): self.locator = locator self.text = text def __call__(self, driver): try : element_text = EC._find_element(driver, self.locator).text.strip() return not element_text.endswith(self.text) except StaleElementReferenceException: return Falsebrowser = webdriver.PhantomJS()browser.maximize_window()browser.get("http://www.jamiiforums.com/kenyan-news/225589-kenyan-and-tanzanian-surburbs.html")username = browser.find_element_by_id("navbar_username")password = browser.find_element_by_name("vb_login_password_hint")username.send_keys("MarioP")password.send_keys("codeswitching")browser.find_element_by_class_name("loginbutton").click()wait = WebDriverWait(browser, 30)wait.until(EC.visibility_of_element_located((By.XPATH, '//h2[contains(., "Redirecting")]')))wait.until(EC.title_contains('Kenyan & Tanzanian'))wait.until(EC.visibility_of_element_located((By.ID, 'postlist')))# click "11 others" linklink = browser.find_element_by_xpath('//div[@class="vbseo_liked"]/a[contains(@onclick, "return vbseoui.others_click(this)")]')link.click()browser.execute_script("""function eventFire(el, etype){ if (el.fireEvent) { el.fireEvent('on' + etype); } else { var evObj = document.createEvent('Events'); evObj.initEvent(etype, true, false); el.dispatchEvent(evObj); }}eventFire(arguments[0], "click");
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值