概述:
成都创新互联公司是一家专注于成都网站设计、成都网站制作与策划设计,娄星网站建设哪家好?成都创新互联公司做网站,专注于网站建设10年,网设计领域的专业建站公司;建站业务涵盖:娄星等地区。娄星做网站价格咨询:18982081108
python通过selenium爬取数据是很多突破封锁的有效途径。但在使用selenium中会遇到很多问题,本文就通过一问一答的形式来通熟易懂的普及如何通过selenium执行javascript程序,进而获取动态执行后的网页。如果你喜欢,欢迎转发本文。
python爬虫编程:用selenium执行javascript出错了,该咋改?
问题:
小明开始学习python爬虫编程了,仿佛整个互联网的数据都快被他纳入囊中了。今天,他又试图完成一个高难度动作,他想让selenium中抓取到以下HTML后,并自动执行js脚本,模仿鼠标自动执行一个点击动作。但令他很失望的是,居然,居然,没用!
这是他执行的代码。
- 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)
如果要从头解决这问题,那么以下就是需要了解它的一系列事情:
这就是我做的东西。这很简单,但它有效:
- 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');
- 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
定义完毕后,如何在程序里调用这个类呢?看看以下代码:
- from selenium import webdriver
- from selenium.common.exceptions import StaleElementReferenceException
- from selenium.webdriver.common.by import By
- from selenium.webdriver.support.ui import WebDriverWait
- from selenium.webdriver.support import expected_conditions as EC
- 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
- browser = 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" link
- link = 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");
- """, link)
- # wait for the "div" not to end with "11 others link this."
- wait.until(wait_for_text_not_to_end_with((By.CLASS_NAME, 'vbseo_liked'), "11 others like this."))
- print 'success!!'
- browser.close()
看,如何在python里通过selenium来爬取数据就是这么简单。要点掌握好,开始编制自己的爬虫吧。
分享名称:Python爬虫很强大,在爬虫里如何自动操控浏览器呢?
标题链接:http://www.shufengxianlan.com/qtweb/news20/6870.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联