需求背景:
很多网页通过复杂的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 import jboxenv 2 from selenium import webdriver 3 from selenium.webdriver.common.by import By 4 from selenium.webdriver.support import expected_conditions as EC 5 from selenium.webdriver.support.wait import WebDriverWait 6 7 logger = jboxenv.JBOX_LOGGER 8 __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 def get_user_cookies(username, password): 17 ''' 18 获取JBOX的登录cookies 19 模块第一次使用时通过账号密码获取cookie 20 登录成功以后再申请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)GoogleChromeApplicationchromedriver.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 in driver.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'))