调用浏览器的爬虫——selenium

原文地址

分类目录——爬虫

在进行网页爬取时,有些网页比较难分析,应用的很多动态特性;还有可能会在header中封装了很多奇奇怪怪的不知道怎么获取的数据;这时候可能会想如果能用程序吊起浏览器来,自动执行点击,拖动等动作就好了

selenium就是这样一个工具包

  • 先看一个例子

    selenium效果示例

    上面所有的操作都是selenium程序控制执行的,当然,执行遇到了问题,卡在了图片验证上,这个之后再说,先看一下上述操作是怎么完成的

    from selenium import webdriver
    import time
    
    options = webdriver.ChromeOptions()
    
    driver = webdriver.Chrome(
        executable_path=r'D:\Anaconda3\envs\others\Lib\site-packages\selenium\webdriver\chrome\chromedriver.exe',
        options=options
    )
    # driver = webdriver.Firefox()
    
    driver.get("http://www.jd.com")
    driver.find_element_by_link_text("你好,请登录").click()  # 就是你在页面上看到的可点击元素
    time.sleep(2)   # 限于网络环境需要适当延迟等网页刷新页面
    driver.find_element_by_link_text("账户登录").click()
    driver.find_element_by_name("loginname").send_keys('123456')   # 通过查看源码获得的html元素中的name属性
    driver.find_element_by_name("nloginpwd").send_keys('mimamima')
    driver.find_element_by_id("loginsubmit").click()    # # 通过查看源码获得的html元素中的name属性
    time.sleep(5)
    
  • selenium安装

    现在很多包的安装已经很容易了,直接

    pip install selenium
    

    即可

  • 初始化一个selenium.webdirver对象

    后面所有的操作浏览器动作将通过这个对象来完成,主要语法如下

    driver = webdriver.Chrome(
        executable_path=r'D:\Anaconda3\envs\others\Lib\site-packages\selenium\webdriver\chrome\chromedriver.exe',
        options=options
    )
    

    其中executable_path需要传入一个本地的浏览器驱动路径,webdirver对象将通过它来操作浏览器,关于谷歌的这个驱动,可以参见https://blog.csdn.net/weixin_43746433/article/details/95237254 这篇博客进行下载,我测试时并没有跟我环境对应的64位驱动,我下载了32位的也可用

    options是用来设置这个对象的操作属性的,它应该这么定义

    options = webdriver.ChromeOptions()
    # 可以给options添加一些选项
    options.add_experimental_option('excludeSwitches', ['enable-automation'])
    # 上面这个设置意为以开发者模式启动浏览器
    # 一些网站能够识别selenium并进行针对性拒绝访问,这里设置options为开发者模式,防止被网站识别出来使用了Selenium
    # 我实际用了几次(比如在淘宝和CSDN的登录上)已经没有效果了,应该是反爬机制又升级了
    options.add_argument('--headless')  
    # 不启动浏览器操作(默认会启动浏览器窗口)
    

    注意options的声明要在webdriver之前

    当然,也可以声明 其他浏览器的webdriver对象,such as

    # driver = webdriver.Firefox()
    
  • 这个dirver怎么用

    • 跳转到一个网页

      driver.get("http://www.jd.com")
      
    • 定位到一个html元素

      driver.find_element_by~~~
      # or
      dirver.find_elements_by~~~
      
      find
    • 定位到元素后如何操作

      such as

      driver.find_element_by_link_text("账户登录").click()	# 找到之后点击
      driver.find_element_by_name("loginname").send_keys('123456')   # 这是向输入框里输入数据
      driver.find_element_by_name("nloginpwd").send_keys('mimamima')
      driver.find_element_by_id("loginsubmit").click()    # 点击登录按钮
      
    • 如果从网页中获取多媒体资源

      使用bs4.BeautifulSoup可以方便的对网页进行解析,这里以获取页面内京东的logo为例进行程序说明

      background = driver.find_element_by_id('logo').find_element_by_tag_name('img')
      url = background.get_property('src')  # url被卸载了style属性中
      print(url)
      r = requests.get(url)
      # 这里通过requests来获取这张图片,当然driver也是可以的,但是driver之后当前的dirver处理页面就变成了这张图片
      # 再找元素就找不到了,转回来也会比较麻烦
      with open('./data/logo.png', 'wb') as f:   # 注意文件处理模式为‘wb’(以二进制写入)
          f.write(r.content)  # r.content获取r的二进制形式
      

      这样图片就被保存了下来

      logo

      顺便也获取一下上面的图片验证的那张图,这张图费了些周折,京东的这个页面弄得七转八绕的,可以在F12分析源码的时候通过Ctrl+F搜索.png来快速定位到这张图片,而且这样图不是直接给了他url,是以base64的形式直接出现在html源码中的

      src = img.get_attribute('src')
      b64 = src.split(',')[-1]    # 从src内容中拆解出图片的base64码
      imgdata = base64.b64decode(b64)
      file = open('data/verify.png', 'wb')
      file.write(imgdata)
      file.close()
      
      verify

      这个图片验证怎么通过呢,我之后应该会再写一些东西,有兴趣的可以关注一下

  • 参考文献

    Selenium-Python中文文档

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章