Python之Selenium自动化爬虫
0.介绍
Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器(2018年开发者说暂停开发,chromedriver也可以实现同样的功能)),可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏。
1.安装
1 | pip install selenium - i https: / / pypi.tuna.tsinghua.edu.cn / simple |
2.下载浏览器驱动
这里用的谷歌浏览器
CNPM Binaries Mirror
查看自己的浏览器版本下载对应的驱动。
把解压后的驱动放在自己的python.exe 目录下。
3.实例
我之前写过3个实例
Python之Selenium自动化浏览器测试详解_python_脚本之家
现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】
4.开启无头模式
是否开启无头模式(即是否需要界面)
1 2 3 4 5 6 7 8 9 | from selenium.webdriver import Chrome from selenium.webdriver.chrome.options import Options option = Options() # 实例化option对象 option.add_argument( "--headless" ) # 给option对象添加无头参数 option.headless = True #这种方式也可以 if __name__ = = '__main__' : web = Chrome(executable_path = 'D:\PyProject\spider\venv\Scripts\chromedriver.exe' ,options = option) # 指定驱动位置,否则从python解释器目录下查找. web.get( "https://baidu.com" ) print (web.title) |
5.保存页面截图
1 2 3 4 5 6 7 8 9 10 11 | from selenium.webdriver import Chrome from selenium.webdriver.chrome.options import Options option = Options() # 实例化option对象 option.add_argument( "--headless" ) # 给option对象添加无头参数 if __name__ = = '__main__' : web = Chrome() web.maximize_window() # 浏览器窗口最大化 web.get( "https://baidu.com" ) print (web.title) web.save_screenshot( 'baidu.png' ) # 保存当前网页的截图 保存到当前文件夹下 web.close() # 关闭当前网页 |
6.模拟输入和点击
1 2 3 4 5 6 7 8 9 10 11 12 13 | from selenium.webdriver import Chrome from selenium.webdriver.chrome.options import Options option = Options() # 实例化option对象 option.add_argument( "--headless" ) # 给option对象添加无头参数 if __name__ = = '__main__' : web = Chrome() web.maximize_window() # 浏览器窗口最大化 web.get( "https://baidu.com" ) el = web.find_element_by_id( 'kw' ) el.send_keys( 'Harris-H' ) btn = web.find_element_by_id( 'su' ) btn.click() # web.close() # 关闭当前网页 |
貌似现在百度可以识别出selenium,还需要图片验证。
a.根据文本值查找节点
1 2 3 4 | # 找到文本值为百度一下的节点 driver.find_element_by_link_text("百度一下") # 根据链接包含的文本获取元素列表,模糊匹配 driver.find_elements_by_partial_link_text("度一下") |
b.获取当前节点的文本
1 2 | ele.text # 获取当前节点的文本 ele.get_attribute("data-click") # 获取到属性对应的value |
c.打印当前网页的一些信息
1 2 3 | print(driver.page_source) # 打印网页的源码 print(driver.get_cookies()) # 打印出网页的cookie print(driver.current_url) # 打印出当前网页的url |
d.关闭浏览器
1 2 | driver.close() # 关闭当前网页 driver.quit() # 直接关闭浏览器 |
e.模拟鼠标滚动
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | from selenium.webdriver import Chrome import time if __name__ = = '__main__' : driver = Chrome() driver.get( "https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=78000241_12_hao_pg&wd=selenium%20js%E6%BB%91%E5%8A%A8&fenlei=256&rsv_pq=8215ec3a00127601&rsv_t=a763fm%2F7SHtPeSVYKeWnxKwKBisdp%2FBe8pVsIapxTsrlUnas7%2F7Hoo6FnDp6WsslfyiRc3iKxP2s&rqlang=cn&rsv_enter=1&rsv_dl=tb&rsv_sug3=31&rsv_sug1=17&rsv_sug7=100&rsv_sug2=0&rsv_btype=i&inputT=9266&rsv_sug4=9770" ) # 1.滚动到网页底部 js = "document.documentElement.scrollTop=1000" # 执行js driver.execute_script(js) time.sleep( 2 ) # 滚动到顶部 js = "document.documentElement.scrollTop=0" driver.execute_script(js) # 执行js time.sleep( 2 ) driver.close() |
7.ChromeOptions
1 2 3 4 5 6 7 8 | options = webdriver.ChromeOptions() options.add_argument( "--proxy-server=http://110.52.235.176:9999" ) # 添加代理 options.add_argument( "--headless" ) # 无头模式 options.add_argument( "--lang=en-US" ) # 网页显示英语 prefs = { "profile.managed_default_content_settings.images" : 2 , 'permissions.default.stylesheet' : 2 } # 禁止渲染 options.add_experimental_option( "prefs" , prefs) driver = webdriver.Chrome(executable_path = "D:\ProgramApp\chromedriver\chromedriver73.exe" ,chrome_options = options) driver.get( "http://httpbin.org/ip" ) |
8.验证滑块移动
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | """ 目标:滑动验证码 1.定位按钮 2.按住滑块 3.滑动按钮 """ import time from selenium import webdriver if __name__ = = '__main__' : chrome_obj = webdriver.Chrome() chrome_obj.get( 'https://www.helloweba.net/demo/2017/unlock/' ) # 1.定位滑动按钮 click_obj = chrome_obj.find_element_by_xpath( '//div[@class="bar1 bar"]/div[@class="slide-to-unlock-handle"]' ) # 2.按住 # 创建一个动作链对象,参数就是浏览器对象 action_obj = webdriver.ActionChains(chrome_obj) # 点击并且按住,参数就是定位的按钮 action_obj.click_and_hold(click_obj) # 得到它的宽高 size_ = click_obj.size width_ = 298 - size_[ 'width' ] # 滑框的宽度 减去 滑块的 宽度 就是 向x轴移动的距离(向右) print (width_) # 3.定位滑动坐标 action_obj.move_by_offset( 298 - width_, 0 ).perform() # 4.松开滑动 action_obj.release() time.sleep( 6 ) chrome_obj.quit() |
9.打开多窗口和页面切换
有时候窗口中有很多子tab页面。这时候肯定是需要进行切换的。selenium提供了一个叫做switch_to_window来进行切换,具体切换到哪个页面,可以从driver.window_handles中找到
1 2 3 4 5 6 7 8 | from selenium import webdriver if __name__ = = '__main__' : driver = webdriver.Chrome() driver.get( "https://www.baidu.com/" ) driver.implicitly_wait( 2 ) driver.execute_script( "window.open('https://www.douban.com/')" ) driver.switch_to.window(driver.window_handles[ 1 ]) print (driver.page_source) |
第二个实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | if __name__ = = '__main__' : from selenium import webdriver import time driver = webdriver.Chrome() start_url = 'https://www.baidu.com' start_url_1 = 'https://www.csdn.net' driver.get(start_url) time.sleep( 5 ) """通过执行js代码,打开浏览器窗口,访问地址""" js = 'window.open("{}")' . format (start_url_1) driver.execute_script(js) time.sleep( 5 ) """获取浏览器所有窗口:注意点:窗口的切换是通过下标控制的""" win = driver.window_handles # 执行切换 driver.switch_to.window(win[ 0 ]) time.sleep( 2 ) driver.switch_to.window(win[ 1 ]) time.sleep( 2 ) driver.switch_to.window(win[ 0 ]) time.sleep( 2 ) driver.switch_to.window(win[ 1 ]) # 浏览器窗口的关闭 driver.close() # 退出浏览器 driver.quit() |
有时候网页会内嵌另一个html。一般称为iframe
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | from selenium import webdriver driver = webdriver.Chrome() start_url = 'https://mail.163.com/' driver.get(start_url) """定位不成功,在有的情况是因为有页面的嵌套导致的 在一个html源码中有多个html页面,示例:一个html嵌套一个html 以上:又称之为iframe的嵌套 """ # 定位嵌套位置iframe el_iframe = driver.find_elements_by_tag_name( 'iframe' ) # 执行iframe的切换 driver.switch_to.frame(el_iframe[ 0 ]) # 标签定位 driver.find_element_by_name( 'email' ).send_keys( '邮箱账号' ) driver.find_element_by_name( 'password' ).send_keys( '你的邮箱密码' ) driver.find_element_by_id( 'dologin' ).click() |
10.Cookie操作
1 2 3 4 5 6 7 8 9 10 11 | # 1.获取所有的cookie: for cookie in driver.get_cookies(): print (cookie) # 2.根据cookie的key获取value: value = driver.get_cookie(key) # 3.删除所有的cookie: driver.delete_all_cookies() # 4.删除某个cookie: driver.delete_cookie(key) # 添加cookie: driver.add_cookie({ "name" : "password" , "value" : "111111" }) |
11.模拟登录
这里模拟登录我们学校教务处。
1 2 3 4 5 6 7 8 9 10 11 | from selenium.webdriver import Chrome if __name__ = = '__main__' : web = Chrome() web.get( 'http://bkjx.wust.edu.cn/' ) username = web.find_element_by_id( 'userAccount' ) username.send_keys( 'xxxxxxx' ) # 这里填自己的学号 password = web.find_element_by_id( 'userPassword' ) password.send_keys( 'xxxxxxx' ) # 这里填自己的密码 btn = web.find_element_by_xpath( '//*[@id="ul1"]/li[4]/button' ) btn.click() # do something |
因为没有滑块啥的验证,所以就很简单qwq。然后后面进行自己的操作即可。
12.使用代理
1 2 3 4 5 6 7 8 9 10 11 12 | from selenium import webdriver import time options = webdriver.ChromeOptions() options.add_argument( '--proxy-server=http://ip地址' ) # 代理IP:端口号 # ${chromedriver_path}: chromedriver驱动存放路径 driver = webdriver.Chrome(options = options) driver.get( "https://dev.kdlapi.com/testproxy" ) # 获取页面内容 print (driver.page_source) # 延迟3秒后关闭当前窗口,如果是最后一个窗口则退出 time.sleep( 3 ) driver.close() |
14.更换UA
1 2 3 4 5 6 7 8 9 10 11 12 | from selenium import webdriver import time agent = 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1' options = webdriver.ChromeOptions() options.add_argument( '--user-agent=' + agent) # ${chromedriver_path}: chromedriver驱动存放路径 driver = webdriver.Chrome(options = options) driver.get( "https://www.baidu.com" ) # 获取页面内容 print (driver.page_source) # 延迟3秒后关闭当前窗口,如果是最后一个窗口则退出 time.sleep( 3 ) |
15.鼠标悬停
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | if __name__ = = '__main__' : from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains driver = webdriver.Chrome() import time start_url = 'https://lceda.cn/' driver.get(start_url) # 定位到需要悬停的标签 move = driver.find_element_by_xpath( '//*[@id="headerNav"]/li[1]/a/span' ) # //*[@id="headerNav"]/li[1]/a/span # 悬停之后需要点击的标签 a = driver.find_element_by_xpath( '/html/body/div[1]/div[2]/div[1]/div[1]/div[3]/div[1]/a[2]' ) # //*[@id="headerNav"]/li[1]/div/a[2] # /html/body/div[1]/div[2]/div[1]/div[1]/div[1]/div/div/div[1]/ul/li[1]/div/a[2] # 悬停点击执行 # 创建事件对象 actions = ActionChains(driver) time.sleep( 1 ) # 记录操作 actions.move_to_element(move) time.sleep( 1.5 ) # 悬停的点击 actions.click(a) time.sleep( 1 ) # 开始执行事件 actions.perform() |
16.优缺点
selenium
能够执行页面上的js,对于js渲染的数据和模拟登陆处理起来非常容易。
selenium
由于在获取页面的过程中会发送很多请求,所以效率非常低,所以在很多时候需要酌情使用。
最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】