1,前言:为什么selenium+phantomjs可以获取大多数网站数据?
原因:正常requests模块得到的响应内容全部是js代码,因为很多网站得到的响应内容全部是js代码,没有页面数据,无法通过xpath等一下提取数据的方法获取数据。
而selenium+phantomjs可以做到,获取页面数据之后,运行响应中的js代码,来完整的获取到想要数据。
2,认识selenium及phantom
selenium:它是一个web自动化测试工具,本身是不带浏览器功能。
phantomjs:无界面”(headless)浏览器
什么是浏览器?
(1)加载页面;(2)显示html;(3)查看xml.
3,安装及使用selenium及phantom:
下载安装chromedriver:百度搜索chromedriver镜像,下载和自己chrom浏览器对应的版本。
下载安装phantomjs:百度搜索phantomjs镜像。
安装很简单:找到两个exe文件,将他们复制到:C:\Anaconda3\Scripts
检查是否成功:打开cmd,分别输入:如果不报错,就表示设置成功。
4,selenium使用:
#1,定义一个浏览器驱动
driver = webdriver.Chrome()
#2,请求url
url = 'https://book.douban.com/subject_search?search_text=python&cat=1001'
driver.get(url)
#3,等待时间
time.sleep(3)
#4,获取页面内容
print(driver.page_source)
5,定位ui元素的方法主要有:
find_element_by_id
find_elements_by_xpath--
find_elements_by_css_selector
driver.find_element_by_id('inp-query')这种定位元素的方法返回值都是WebElement对象.
文档:selenuim常用方法总结.note
链接:http://note.youdao.com/noteshare?id=0142a95cf23fadbaea95809ccb5674b2&sub=02896A50836E4995997A821419D9A063
6、等待
定义:什么是等待?为什么要使用等待?
在爬虫中selenium这里,等待就是指等待网页中所有请求的数据元素出现以便运行接下来的程序从而获得想要的数据.现在大部分网页都是用AJAX技术,但一个网页被浏览器加载后,其中的元素可能会在不同的时间间隔被加载。这样使得定位元素变得困难,因为元素不是一次性全部加载出来的。这样的话,如果元素没有在当前的DOM中出现,定位元素的时候就会返回ElementNotVisibleException。这种情况下,使用等待可以解决这个问题。
分类:
(1)强制等待:
time.sleep(3)
程序会在这里强制等待3秒,不管页面有没有完成,都会在等待3秒后才执行下面的程序。
(2)隐式等待
driver.implicitly_wait(30)
这里的30是一个最大等待时长。
隐式等待的意思就是,在30秒内,只要页面全部加载完成,就比如浏览器请求一个页面的时候不在转圈圈,就会执行下面的代码。
如果在这个时间内还没有加载完成,也会执行“等待”下面的代码。
隐式等待的弊端:
有时候页面想要的元素早就在加载完成了,但是因为个别js之类的东西特别慢,我仍得等到页面全部完成才能执行下一步。
(3)显式等待
WebDriverWait.until(a)--等待,直到a满足
WebDriverWait.until(EC.presence_of_element_located(locator))
EC---expected_conditions :selenium内置的条件判断类
EC.presence_of_element_located((By.CSS_SELECTOR,'.ui-page > wrap'))
EC.presence_of_all_elements_located((By.CSS_SELECTOR,'.ui-page'))
这两个条件验证元素是否出现,传入的参数都是元组类型的locator,如(By.ID, 'kw')
一个只要一个符合条件的元素加载出来就通过;
另一个必须所有符合条件的元素都加载出来才行
EC.element_to_be_clickable
这个条件判断元素是否可点击,传入locator
显式等待需要导入的模块或包的代码:
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
用显式等待的时候步骤:
(1)wait = WebDriverWait(
driver,#驱动
20,最大等待时长
0.5,查找间隔,默认就是0.5
)
(2)wait.until(EC.presence_of_element_located(locator))---》webelement对象---》对应locator所指定的元素
locator = (
By.ID: #通过什么方式获取,选择器的种类,可以通过三种方式(by.id,by.css.selector,by.xpath)
'kw' : #选择器的语法
)
隐性等待和显性等待可以同时用,但要注意:等待的最长时间取两者之中的大者