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可以进行脚本录制及案例转换,我想大家在生活中都可以用得着,参见这里

 

 

 

 

 

posted @ 2017-02-23 01:28  gaorong404  阅读(7220)  评论(0编辑  收藏  举报