Python爬虫利器Selenium使用详解

发表于:2017-2-27 11:08

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:gaorong`s blog    来源:51Testing软件测试网采编

  简介:
  用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库进行操作。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号