zoukankan      html  css  js  c++  java
  • python爬虫利器Selenium使用详解

    简介:

    用pyhon爬取动态页面时普通的urllib2无法实现,例如下面的京东首页,随着滚动条的下拉会加载新的内容,而urllib2就无法抓取这些内容,此时就需要今天的主角selenium。

    Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE、Mozilla Firefox、Mozilla Suite等。使用它爬取页面也十分方便,只需要按照访问步骤模拟人在操作就可以了,完全不用操心Cookie,Session的处理,它甚至可以帮助你输入账户,密码,然后点击登陆按钮,对于上面的滚动条,你只需要让浏览器滚到到最低端,然后保存页面就可以了。以上的这些功能在应对一些反爬虫机制时十分有用。接下来就开始我们的讲解正文,带领大家实现一个需要登录的动态网页的爬取。

     案例实现:

    使用selnium需要选择一个调用的浏览器并下载好对应的驱动,在桌面版可以选择Chrome,FireFox等,服务器端可以使用PhantomJS,桌面版可以直接调出来浏览器观察到变化,所以一般我们可以在桌面版用Chrome等调试好之后,将浏览器改为PhantomJS然后上传到服务器使其运行,这里我们直接以PhantomJS做演示.

    首先时导入模块:

    1 from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
    2 from selenium import webdriver

    接下来时初始化一个浏览器,参数中可以指定加载网页的一些属性:

    1 cap = webdriver.DesiredCapabilities.PHANTOMJS
    2 cap["phantomjs.page.settings.resourceTimeout"] = 180
    3 cap["phantomjs.page.settings.loadImages"] = False
    4 
    5 driver = webdriver.PhantomJS(executable_path="/home/gaorong/phantomjs-2.1.1-linux-x86_64/bin/phantomjs", desired_capabilities=cap)

    上面初始了PhantomJS并设置了浏览器的路径,加载属性选择了资源加载超时时间和不加载图片(我们只关心网页文本)。在 这里 还可以选择其他设置。

     设置一些属性,并下载一个网页

    1 driver.set_page_load_timeout(180)     
    2 driver.get('https://otx.alienvault.com/accounts/login/')
    3 time.sleep(5)
    4 driver.save_screenshot('./login.png')   #为便于调试,保存网页的截图

     由于在服务器端运行难免出错,可以用save_screenshot保存当前网页的页面便于调试。

    接下来就是输入账户和密码登陆,以获取网站的Cookies,便于后面请求。

     1 #输入username和password 
     2 driver.find_element_by_xpath("/html/body/div[1]/div[1]/login/div[2]/div/form/input[1]").send_keys('*****')   
     3 time.sleep(1)
     4 print 'input user success!!!'
     5 
     6 driver.find_element_by_xpath("/html/body/div[1]/div[1]/login/div[2]/div/form/input[2]").send_keys('****')
     7 time.sleep(1)
     8 print 'input password success!!!'
     9 
    10 driver.find_element_by_xpath("/html/body/div[1]/div[1]/login/div[2]/div/form/button").click()
    11 time.sleep(5)

     上面代码使用find_element_by_xpath获取输入框的位置后输入账户和密码并点击登陆键,可以看到一些都很方便。它会自动跳转到下一个页面,我们只需要sleep几秒等待它。

    我们需要爬取的网页信息在某个特定的element里,所以我们需要判断一下这个element是否出现:

     1  try:
     2      element = WebDriverWait(driver, 10).until(
     3          EC.presence_of_element_located((By.CLASS_NAME, 'pulses'))
     4      )
     5      print 'find element!!!'        
     6  except:
     7      print 'not find element!!!'
     8      print traceback.format_exc()
     9      driver.quit()

    上面判断 class为 'pulse' 这个element是否出现,如果等待10s后还未出现,则selenum会爆出TimeoutError错误。

    上面就进行了基本的初始化,然后就需要处理动态的内容了,这个网页像京东一样会随着下拉自动出现内容,所以我们需要实现下拉滚动条:

    1 print 'begin scroll to get info page...'
    2 t1 = time.time()
    3 n = 60   #这里可以控制网页滚动距离
    4 for i in range(1,n+1):
    5     s = "window.scrollTo(0,document.body.scrollHeight/{0}*{1});".format(n,i)
    6     #输出滚动位置,网页大小,和时间
    7     print s, len(driver.page_source),time.time()-t1
    8     driver.execute_script(s)
    9     time.sleep(2)

    其中driver.page_source就是获取网页文本。当滚动完毕后我们就可以调用它然后写到一个文件里。这样就完成了这个的程序逻辑。

    高级:

    用selenim可以应对常见的反爬虫策略,因为相当于一个人在浏览网页,但是对于验证码这些还需要做额外的处理,还有一点就是访问速度不能过快,毕竟他需要调用一个浏览器,如果嫌他速度慢的话我们可以在必要的时候使用他,非必要时候可以使用requests库进行操作。

    这里有两篇博客大家可以参考查阅:Python爬虫利器五之Selenium用法 和 常用函数 

    同时还有一个Selenum IDE可以进行脚本录制及案例转换,我想大家在生活中都可以用得着,参见这里

     

  • 相关阅读:
    树莓派_GPIO
    Python_PyQt_基本使用
    python_静态,组合,继承
    Linux_操作
    Pyqt5+eric6安装教程
    树莓派操作
    python_爬虫_requests
    HTML的基本操作
    python_pandas_numpy_json
    python_模块_sys_time_random_os
  • 原文地址:https://www.cnblogs.com/gaorong/p/6431710.html
Copyright © 2011-2022 走看看