爬虫之selenium的使用

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模拟登录

 


posted @ 2020-08-28 13:48  My帝王源  阅读(130)  评论(0)    收藏  举报