python爬虫10:使用selenium模拟浏览器登录账号

需求背景:

很多网页通过复杂的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)\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 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'))

猜你喜欢

转载自www.cnblogs.com/figlab/p/10834362.html