开发者

一篇文章带你了解Python之Selenium自动化爬虫

开发者 https://www.devze.com 2022-12-09 12:46 出处:网络 作者: Harris-H
目录python之Selenium自动化爬虫0.介绍1.安装2.下载浏览器驱动3.实例4.开启无头模式5.保存页面截图6.模拟输入和点击a.根据文本值查找节点b.获取当前节点的文本c.打印当前网页的一些信息d.关闭浏览器e.模拟鼠标滚动7.
目录
  • python之Selenium自动化爬虫
    • 0.介绍
    • 1.安装
    • 2.下载浏览器驱动
    • 3.实例
    • 4.开启无头模式
    • 5.保存页面截图
    • 6.模拟输入和点击
      • a.根据文本值查找节点
      • b.获取当前节点的文本
      • c.打印当前网页的一些信息
      • d.关闭浏览器
      • e.模拟鼠标滚动
    • 7.ChromeOptions
      • 8.验证滑块移动
        • 9.打开多窗口和页面切换
          • 10.Cookie操作
            • 11.模拟登录
              • 12.使用代理
                • 14.更换UA
                  • 15.鼠标悬停
                    • 16.优缺点
                    • 总结

                      Python之Selenium自动化爬虫

                      0.介绍

                      Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器(包括Phantomjs这些无界面的浏览器(2018年开发者说暂停开发,chromedriver也可以实现同样的功能)),可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏。

                      1.安装

                      http://www.cppcns.com
                      pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple
                      

                      2.下载浏览器驱动

                      这里用的谷歌浏览器

                      http://npm.taobao.org/mirrors/chromedriver/

                      查看自己的浏览器版本下载对应的驱动。

                      一篇文章带你了解Python之Selenium自动化爬虫

                      把解压后的驱动放在自己的python.exe 目录下。

                      3.实例

                      我之前写过3个实例

                      https://www.jb51.net/article/236004.htm

                      4.开启无头模式

                      是否开启无头模式(即是否需要界面)

                      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.保存页面截图

                      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.模拟输入和点击

                      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.根据文本值查找节点

                      # 找到文本值为百度一下的节点
                      driver.find_element_by_link_text("百度一下") 
                      # 根据链接包含的文本获取元素列表,模糊匹配
                      driver.find_elements_by_partial_link_text("度一下") 
                      

                      b.获取当前节点的文本

                      ele.text # 获取当前节点的文本
                      ele.get_attribute("data-click")  # 获取到属性对应的value
                      

                      c.打印当前网页的一些信息

                      print(driver.page_source)  # 打印网页的源码
                      print(driver.get_cookies())  # 打印出网页的cookie
                      print(driver.current_url)  # 打印出当前网页的url
                      

                      d.关闭浏览器

                      driver.close()  # 关闭当前网页
                      driver.quit()  # 直接关闭浏览器
                      

                      e.模拟鼠标滚动

                      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

                      options = webdriver.ChromeOptions()
                      options.add_argument("--proxy-server=http://110.52.235.176:9999") # DTDronjhw添加代理
                      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.滑动按钮
                      """
                      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中找到

                      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)
                      

                      第二个实例

                      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.switchhttp://www.cppcns.com_to.window(win[1])
                          # 浏览器窗口的关闭
                          driver.close()
                          # 退出浏览器
                          driver.quit()
                      

                      有时候网页会内嵌另一个html。一般称为iframe

                      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.获取所有的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.模拟登录

                      这里模拟登录我们学校教务处。

                      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.使用代理

                      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

                      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.鼠标悬停

                      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由于在获取页面的过程中会发送很多请求,所以效率非常低,所以在很多时候需要酌情使用。

                      总结

                      本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!    

                      0

                      精彩评论

                      暂无评论...
                      验证码 换一张
                      取 消

                      关注公众号