需求背景:
很多网页通过复杂的JS函数组合,来实现对信息的加密、异步信息处理等,导致很难分析出网页接口。
那么最快速度的实现爬虫功能,是模拟浏览器的行为,加载运行JS,才能破解页面。
模拟浏览器行为,在python中的最佳实践方案是使用selenium包。被模拟的浏览器可以使用chromedriver(有界面浏览器)或者phantomjs(无界面浏览器)。
所有复杂的登录、JS加密、AJAX异步,如果无法分析出网页接口,都可以使用selenium+browserdriver方案,来模拟浏览器上网。
知识点
一、什么是selenium?
selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium Remote Control)和测试的并行处理(Selenium Grid)。
selenium的核心Selenium Core基于JsUnit,完全由JavaScript编写,因此可以用于任何支持JavaScript的浏览器上。
selenium可以模拟真实浏览器,自动化测试工具,支持多种浏览器,爬虫中主要用来解决JavaScript渲染问题。
二、如果配置被模拟的浏览器?
那chromedriver举例
先在百度搜chromedriver,并且下载到本地。(朱毅chromedriver.exe对应的版本要和实际安装的chrome.exe版本一致。)
三、举例一段模拟登陆某个网页,并且获取cookies的过程
下面是一段登陆网盘的模块。如果cookies是空,那么就使用selenium打开网页登陆一次保存cookies。如果不空,那么就直接使用缓存中的cookies。
1 from etc importjboxenv2 from selenium importwebdriver3 from selenium.webdriver.common.by importBy4 from selenium.webdriver.support importexpected_conditions as EC5 from selenium.webdriver.support.wait importWebDriverWait6
7 logger =jboxenv.JBOX_LOGGER8 __jbox_cookies ={}
12 __header ={13 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36'}14
15
16 defget_user_cookies(username, password):17 '''
18 获取JBOX的登录cookies19 模块第一次使用时通过账号密码获取cookie20 登录成功以后再申请cookie,读取模块中的缓存21 :param username: 用户名22 :param password: 密码23 :return: 返回一个dict,保存了cookies字典24 '''
25 #打开首页获取cookies
26 global __jbox_cookies
27 if __jbox_cookies.keys():28 return __jbox_cookies
29 else:30 driver = webdriver.Chrome(r'C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe')31 try:32 driver.get("http://pan.jd.com/")33 name = driver.find_element_by_id('account')34 name.send_keys(username)35 psd = driver.find_element_by_id('password')36 psd.send_keys(password)37 btn = driver.find_element_by_class_name('btnsubmint')38 btn.click()39 #等待新页面出现的某个元素出现
40 wait = WebDriverWait(driver, 10)41 wait.until(EC.presence_of_element_located((By.ID, 'showMine')))42 if len(driver.get_cookies())>0:43 for c indriver.get_cookies():44 __jbox_cookies[c.get('name')] = c.get('value')45 finally:46 driver.close()47 #如果没有登录成功,就提醒需要重新登录
48 if not __jbox_cookies.keys():49 logger.error('通过登录JBOX申请cookies,登录结果:失败')50 print(__jbox_cookies)51 return __jbox_cookies
52
53
54 if __name__ == '__main__':55 print(get_user_cookies('shwujiang', 'Fig@2016092404'))