一、selenium的介绍
1.是一个自动化测试工具,模拟人的行为,做爬虫为了解决使用 requests模块无法执行ajax获取数据
2.使用selenium+半人工登录,获取cookie---》给requests模块使用
二、selenium的使用
1 安装模块 pip3 install selenium
2 驱动浏览器(需要浏览器驱动---》不同去不同浏览器官网下载),下载的驱动要跟浏览器版本对应
http://npm.taobao.org/mirrors/chromedriver/
3 以chrom(谷歌)浏览器为例
三、基本使用
# 模块装完了
# 下一个谷歌浏览器驱动,放到项目根路径下
# 开始使用
from selenium import webdriver
import time
# 拿到一个谷歌浏览器对象
# 打开谷歌浏览器(指定驱动在哪)
bro=webdriver.Chrome(executable_path='chromedriver.exe')
# 在地址栏输入http://www.baidu.com
bro.get('http://www.cnblogs.com')
print(bro.page_source) # 该页面的源代码
time.sleep(5)
# 关闭浏览器
bro.close()
3.2 无界面浏览器
# import time # from selenium.webdriver.chrome.options import Options # chrome_options = Options() # chrome_options.add_argument('window-size=1920x3000') #指定浏览器分辨率 # chrome_options.add_argument('--disable-gpu') #谷歌文档提到需要加上这个属性来规避bug # chrome_options.add_argument('--hide-scrollbars') #隐藏滚动条, 应对一些特殊页面 # chrome_options.add_argument('blink-settings=imagesEnabled=false') #不加载图片, 提升速度 # # # 隐藏浏览器界面 # chrome_options.add_argument('--headless') #浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败 # # bro=webdriver.Chrome(executable_path='chromedriver.exe',options=chrome_options) # bro.get('http://www.cnblogs.com') # # print(bro.page_source) # time.sleep(5) # # 关闭浏览器 # bro.close()
3.3 模拟登录百度
from selenium import webdriver import time bro=webdriver.Chrome(executable_path='chromedriver.exe') bro.get('http://www.baidu.com') bro.implicitly_wait(100) # 如果控件没有加载出来,会等一会 # 根据a标签链接的文字来查找 login_a=bro.find_element_by_link_text('登录') # 点击一下 login_a.click() # 用户名登录的p标签,使用id找 username_login_p=bro.find_element_by_id('TANGRAM__PSP_11__footerULoginBtn') username_login_p.click() # username_input=bro.find_element_by_id('TANGRAM__PSP_11__userName') username_input=bro.find_element_by_name('userName') # 写入用户名 username_input.send_keys('306334678@qq.com') password_input=bro.find_element_by_id('TANGRAM__PSP_11__password') password_input.send_keys('sss') login_button=bro.find_element_by_id('TANGRAM__PSP_11__submit') time.sleep(5) login_button.click() time.sleep(10) print(bro.get_cookies()) bro.close()
3.4 selenium的其他使用
import time from selenium import webdriver bro=webdriver.Chrome(executable_path='chromedriver.exe') # bro.get('http://www.baidu.com') # print(bro.page_source) # 选择器 # 1、find_element_by_id 通过id获取控件 # 2、find_element_by_link_text 通过a标签的文本获取标签 # 3、find_element_by_partial_link_text 通过a标签的文本模糊匹配获取标签 # 4、find_element_by_tag_name 通过标签名找 # 5、find_element_by_class_name 通过类名找 # 6、find_element_by_name 通过name属性找 # 7、find_element_by_css_selector css选择器 # 8、find_element_by_xpath xpath选择器 # input_1=bro.find_element_by_css_selector('#kw') # # 往输入框中写文字 # input_1.send_keys('美女') # # search_btn=bro.find_element_by_css_selector('#su') # search_btn.click() # 获取某个标签的属性,位置,id,名字.. # input_1=bro.find_element_by_css_selector('#kw') # print(input_1.id) # print(input_1.tag_name) # print(input_1.get_attribute('maxlength')) # print(input_1.location) # print(input_1.size) ## 等待元素被加载(显示等待,隐士等待) # bro.implicitly_wait(10) # 隐士等待,等待所有,再下方再去找一个控件,如果控件没有加载出来,最多等待10s # 显示等待(基本不用),指定等待某个控件几秒 # from selenium.webdriver.support.wait import WebDriverWait # from selenium.webdriver.support import expected_conditions as EC # from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR # wait=WebDriverWait(bro,10) # wait.until(EC.presence_of_element_located((By.ID,'kw'))) ## 控件其它操作 # 点击操作 # search_btn=bro.find_element_by_css_selector('#su') # search_btn.click() # 点击操作 # input_1=bro.find_element_by_css_selector('#kw') # # 往输入框中写文字 # # 清空操作 # input_1.send_keys('美女') # time.sleep(1) # input_1.clear() # input_1.send_keys('帅哥') ### 执行js # bro.get('https://www.pearvideo.com/video_1715923') # bro.execute_script('alert(urlMap.registerUrl)') # bro.execute_script('scroll(0,30000)') # 滑倒屏幕底部,有的页面滑倒底部自动加载数据 # 模拟浏览器前进后退 # # bro.get('http://www.baidu.com') # bro.get('http://www.taobao.com') # bro.get('http://www.cnblogs.com') # # bro.back() # # time.sleep(1) # bro.forward() # time.sleep(1) # bro.get('http://www.cnblogs.com') # # time.sleep(30) ### cookie的处理 # print(type(bro.get_cookies())) # 把所有cookie取出来 # cookies=bro.get_cookies() # import json # with open('cookie.json','w') as f: # json.dump(cookies,f) # # # 取到cookie之后,存到文件中 # # 再打开一个页面,还是这个网站,把cookie之间写入 # # time.sleep(1) # # 关闭浏览器 # bro.close() ### 选项卡管理 # browser=webdriver.Chrome() # browser.get('https://www.baidu.com') # browser.execute_script('window.open()') # # print(browser.window_handles) #获取所有的选项卡 # browser.switch_to_window(browser.window_handles[1]) # browser.get('https://www.taobao.com') # time.sleep(2) # browser.switch_to_window(browser.window_handles[0]) # browser.get('https://www.sina.com.cn') # browser.close() ## 异常捕获 try: browser=webdriver.Chrome() browser.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable') browser.switch_to.frame('iframssseResult') except Exception as e: print(e) finally: browser.close() # 关闭浏览器
# 动作链
# 使用selenium爬取京东商品信息
from selenium import webdriver import json import time bro=webdriver.Chrome(executable_path='chromedriver.exe') bro.get('http://www.cnblogs.com') with open('cookie.json','r') as f: cookie=json.load(f) for i in cookie: bro.add_cookie(i) time.sleep(1) bro.refresh() time.sleep(1) bro.refresh() time.sleep(4) bro.close()