selenium模块的基本使用
问题:selenium模块和爬虫之间具有怎样的关联?
便捷的获取网站中动态加载的数据
便捷实现模拟登录
什么是selenium模块?
基于浏览器自动化的一个模块。
selenium使用流程:
环境安装:
pip install selenium
下载一个浏览器的驱动程序(谷歌浏览器)
下载路径:http://chromedriver.storage.googleapis.com/index.html
驱动程序和浏览器的映射关系:http://blog.csdn.net/huilan_same/article/details/51896672
导包:
from selenium import webdriver
实例化一个浏览器对象:
bro = webdriver.Chrome(executable_path="./chromedriver.exe")
编写基于浏览器自动化的操作代码
发起请求:get(url)
标签定位:find系列的方法
标签交互:send_keys( 'xx')
执行js程序:excute_script('jsCode')
前进,后退:back(),forward()
关闭浏览器:quit()
实例1、爬取药监局化妆品企业(ajax动态生成的)
![]()
1 from selenium import webdriver
2 from lxml import etree
3 import time
4 # 生成一个浏览器对象
5 bro = webdriver.Chrome(executable_path="./chromedriver.exe")
6 # 让浏览器向url发起一个get请求
7 bro.get("http://scxk.nmpa.gov.cn:81/xk/")
8 # 获取网页源码的数据(包括由ajax动态加载的数据)
9 page_text = bro.page_source
10
11 tree = etree.HTML(page_text)
12 li_list = tree.xpath('//*[@id="gzlist"]/li')
13 for li in li_list:
14 name = li.xpath("./dl/@title")[0]
15 print(name)
16 time.sleep(2)
17 bro.quit()
18
19 if __name__ == '__main__':
20 bro = webdriver.Chrome(executable_path='./chromedriver' )
21 bro.get( ' https://www.taobao.com/')
22 #标签定位
23 search_input = bro.find_element_by_id('q')
24 #标签交互
25 search_input.send_keys( 'Iphone ')
26 # 执行-组is程序
27 bro.execute_script('window.scrollTo(0,document.body.scrollHeight)' )
28 time.sleep(2)
29 # 点击搜索按钮
30 btn = bro.find_element_by_css_selector( '.btn-search')
31 btn.click()
32 bro.get('https://www.baidu.com')
33 time.sleep(2)
34 # 回退
35 bro.back()
36 time.sleep(2)
37 # 前进
38 bro.forward()
39 time.sleep(5)
40 bro.quit()
药监局化妆品企业动态加载数据的爬取
实例2、爬取淘宝首页,模拟输入要搜索的商品,和往下滑动滚轮
![]()
1 if __name__ == '__main__':
2 bro = webdriver.Chrome(executable_path='./chromedriver' )
3 bro.get( ' https://www.taobao.com/')
4 #标签定位
5 search_input = bro.find_element_by_id('q')
6 #标签交互
7 search_input.send_keys( 'Iphone ')
8 # 执行-组is程序
9 bro.execute_script('window.scrollTo(0,document.body.scrollHeight)' )
10 time.sleep(2)
11 # 点击搜索按钮
12 btn = bro.find_element_by_css_selector( '.btn-search')
13 btn.click()
14 bro.get('https://www.baidu.com')
15 time.sleep(2)
16 # 回退
17 bro.back()
18 time.sleep(2)
19 # 前进
20 bro.forward()
21 time.sleep(5)
22 bro.quit()
爬取淘宝首页,模拟输入要搜索的商品,和往下滑动滚轮
selenium处理iframe
如果定位的标签存在于iframe标签之中,则必须使用switch_to.frame(id)
动作链(拖动):from selenium.webdriver import ActionChains
实例化一个动作链对象:action = ActionChains(bro)
click_and_hold (div):长按且点击操作
move_by_offset(x,y)
perform()让动作链立即执行
action.release()释放动作链对象
实例:拖动iframe中的元素的位置
综合实例:
模拟QQ空间登陆
![]()
1 # 导入动作链对应的类
2 from selenium.webdriver import ActionChains
3 if __name__ == '__main__':
4 bro = webdriver.Chrome(executable_path='./chromedriver.exe')
5 bro.get( 'https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
6 #如果定位的标签是存在无iframe标签之虫的则必须通过如顶操作在进行标签定应
7 bro.switch_to.frame('iframeResult')#切换浏览器标签定位的作用g
8 div = bro.find_element_by_id('draggable')
9 #动作链
10 action = ActionChains(bro)
11 # 点击长按指定的标签
12 action.click_and_hold(div)
13 for i in range(5):
14 # perform文即执行动作链操作
15 #movs_by_offset(x,y) x水平方向 Y竖直方向
16 action.move_by_offset(17,0).perform()
17 # time.sleep()
18 #释放动作链
19 action.release()
20 bro.quit()
模拟QQ空间登陆
无可视化界面(无头浏览器):from selenium.webdriver.chrome.options import Options
#实现无可视化界面的操作
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
使用方法:
bro = webdriver.Chrome(executable_path='./chromedriver.exe',chrome_options=chrome_options)
规避风险:from selenium.webdriver import ChromeOptions
#实现规避检测
option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
使用方法:
bro = webdriver.Chrome(executable_path='./chromedriver.exe',options=option)
实例:无可视化界面+规避风险
![]()
1 from selenium import webdriver
2 #实现无可视化界面
3 from selenium.webdriver.chrome.options import Options
4 #实现规避检测
5 from selenium.webdriver import ChromeOptions
6 if __name__ == '__main__':
7
8 #实现无可视化界面的操作
9 chrome_options = Options()
10 chrome_options.add_argument('--headless')
11 chrome_options.add_argument('--disable-gpu')
12
13 #实现规避检测
14 option = ChromeOptions()
15 option.add_experimental_option('excludeSwitches', ['enable-automation'])
16
17 #如何实现selenium规避被检测到的风险
18 bro = webdriver.Chrome(executable_path='./chromedriver.exe',chrome_options=chrome_options,options=option)
19
20 #无视化界面(无法浏览器).phantomls
21 bro.get( 'https://www.baidu.com')
22
23 print(bro.page_source)
24
25 time.sleep(2)
26 bro.quit()
无可视化界面+规避风险
综合实例:12306模拟登录
超级鹰:http://www.chaojiying.com/about.html
注册:普通用户
登录:普通用户
题分查询:充值
创建一个软件(id)
下载示例代码
12306模拟登录编码流程:
使用selenium打开登录页面
对当前selenium打开的这张页面进行截图
对当前图片局部区域(验证码图片)进行裁剪
# 踩坑:要把电脑的分辨率调成100%,才可以准确的截取到验证码的图
好处:将验证码图片和模拟登录进行一一对应。
使用超级鹰识别验证码图片(坐标)
![]()
1 from PIL import Image
2 from selenium import webdriver
3 # 12306网站的登录
4 #使用selenium打开登录页面
5 from selenium import webdriver
6 from CodeClass import Chaojiying_Client
7 import time
8 from selenium.webdriver import ActionChains
9 '''
10 踩坑:要把电脑的分辨率调成100%,才可以准确的截取到验证码的图
11 '''
12 def get_code(filename,type):
13 chaojiying = Chaojiying_Client("2206767909", "ygcqqmmff123", '121212') # 用户中心>>软件ID 生成一个替换 96001
14 im = open(filename, 'rb').read() # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
15 return chaojiying.PostPic(im, type)["pic_str"]
16
17 if __name__ == '__main__':
18 # 生成一个浏览器对象
19 bro = webdriver.Chrome(executable_path= './chromedriver.exe')
20 # 浏览器最大化
21 bro.maximize_window()
22 # 浏览器发起请求
23 bro.get('https://kyfw.12306.cn/otn/resources/login.html')
24 # 停一秒
25 time.sleep(1)
26 # 转到输入用户名密码的界面
27 a_tag = bro.find_element_by_xpath("/html/body/div[2]/div[2]/ul/li[2]/a")
28 a_tag.click()
29 #save_ssreenshot就是将当前页面进行截图并保存
30 bro.save_screenshot('aa.png')
31 # 定位到验证码图片的位置,
32 code_img_ele = bro.find_element_by_id("J-loginImg")
33 #确定验证码胤片对应的左上角和右下角的坐标(裁剪的区域就确定)。注意,一定要把电脑的分辨率调成100%,不然会确定不准确
34 location = code_img_ele.location#验证码图片左上角的坐标x,y
35 print('location:',location)
36 size = code_img_ele.size #验证码标签对应的长和宽
37 print('size:',size)
38 # 左上角和右下角坐标,也就是整个验证码的区域
39 rangle=(
40 location['x'], location['y'], location['x']+size['width'], location["y"]+size["height"]
41 )
42 # 利用PIL中的Image模块,把截得整个网页的图片生成一个对象
43 i = Image.open('./aa.png ')
44 # 验证码保存路径
45 code_img_name = './code.png'
46 #crop根据指定区域进行度片裁剪
47 frame = i.crop(rangle)
48 # 保存验证码
49 frame.save(code_img_name)
50 # 用超级鹰来识别验证码
51 xy = get_code("./code.png",9004)
52 print("验证码:",xy)
53 # 把所有的坐标封装到列表中
54 all_xy = []
55 if "|" in xy:
56 xy_list = xy.split("|")
57 for p in xy_list:
58 p_list = list(p.split(","))
59 all_xy.append(p_list)
60 else:
61 p_list = list(xy.split(","))
62 all_xy.append(p_list)
63 # 打印一下所有的封装到列表中的坐标
64 print(all_xy)
65 for i in all_xy:
66 x = int(i[0])
67 y = int(i[1])
68 # 把参照物从整个网页的边界改成验证码的边界,并移动要指定的x,y坐标中
69 chains = ActionChains(bro).move_to_element_with_offset(code_img_ele,x,y)
70 # 执行点击操作
71 chains.click().perform()
72 time.sleep(0.5)
73 # 输入用户名
74 username = bro.find_element_by_id('J-userName').send_keys("username")
75 time.sleep(1)
76 # 输入密码
77 password = bro.find_element_by_id('J-password').send_keys("password")
78 time.sleep(1)
79 # 点击登录
80 btn = bro.find_element_by_id('J-login').click()
81 # 关闭浏览器
82 # time.sleep(2)
83 # bro.quit()
12306模拟登录