Selenium模块是一套完整的Web应用程序测试系统,它包含了测试的录制(SeleniumIDE)、编写及运行(Selenium Remote Control)和测试的并行处理(Selenimu Grid);

那么我们在编写网络爬虫时主要用来了Selenium 的Webdriver 模块 ;

在以上的列表中android 和blackberry 是移动端的浏览器,可以先去掉,common support 也可以先去掉,剩下的除去Phantomjs 则都是常见的浏览器,PhantomJS 是一个基于WebKit 的服务端的JS API,它全面支持web 而不需要浏览器支持,其快速、原生支持各种web 标准;没有界面,则意味着开销小,同时速度也快,那么我们在爬取JS才能返回数据的网站时,没有比selenium和phantomjs 更适合的组合 了;

下载PhantomJS :http://phantomjs.org/

我使用的是windows 环境,那么下载完压缩包后,直接解压,将PhantomJS.exe 放到python 的目录中就可以 了

交互式的小例子我就写了,直接上一个实例代码,也可以将实例中的解析网页源码部分在交互式环境中敲一遍,体验一下;

  1. #!/usr/bin/env python
  2. #coding:utf-8
  3. """用selenium&PhantomJS 完成的网络爬虫,最适合使用的情形是爬取有JS的网站,但是用来爬取其他网站同样给力"""
  4.  
  5. from selenium import webdriver
  6. from myLog import MyLog as mylog
  7. import sys
  8. reload(sys)
  9. sys.setdefaultencoding('utf-8')
  10.  
  11. class Item(object): #用于存储代理的属性
  12. ip = None
  13. port = None
  14. anonymouns = None
  15. type = None
  16. support = None
  17. local = None
  18. speed = None
  19.  
  20. class GetProxy(object):
  21.  
  22. def __init__(self):
  23. self.starturl = "http://www.kuaidaili.com/free/inha/" #目标网址
  24. self.log = mylog() #二次封装的日志模块
  25. self.urls = self.getUrls()
  26. self.proxyList = self.getProxyList(self.urls)
  27. self.fileName = 'proxy.txt'
  28. self.saveFile(self.fileName,self.proxyList)
  29.  
  30. def getUrls(self): ##生成目标页面代理的网页页面URL
  31. urls = []
  32. for i in xrange(1,3):
  33. url = self.starturl + str(i)
  34. urls.append(url)
  35. self.log.info('get URL %s to urls' %url)
  36. return urls
  37.  
  38. def getProxyList(self,urls): ##分析网页源代码
  39. browser = webdriver.PhantomJS() ## 使用selenium&PhantomJS
  40. proxyList = []
  41. for url in urls:
  42. browser.get(url) #打开网页
  43. browser.implicitly_wait(5) #智能等待加载JS模块
  44. elements = browser.find_elements_by_xpath('//tbody/tr') #使用xpath来解析网页源码
  45. for element in elements:
  46. item = Item()
  47. item.ip = element.find_element_by_xpath('./td[1]').text
  48. item.port = element.find_element_by_xpath('./td[2]').text
  49. item.anonymouns = element.find_element_by_xpath('./td[3]').text
  50. item.type = element.find_element_by_xpath('./td[4]').text
  51. item.support = element.find_element_by_xpath('./td[5]').text
  52. item.local = element.find_element_by_xpath('./td[6]').text
  53. item.speed = element.find_element_by_xpath('./td[7]').text
  54. proxyList.append(item)
  55. self.log.info('add proxy %s: %s to list'%(item.ip,item.port))
  56. browser.quit() #浏览器的退出
  57. return proxyList
  58.  
  59. def saveFile(self,fileName,proxyList): #生成文件
  60. self.log.info('add all proxy to %s'%self.fileName)
  61. with open(fileName,'w') as fp:
  62. for item in proxyList:
  63. # print item.ip
  64. fp.write(item.ip+'\t')
  65. fp.write(item.port + '\t')
  66. fp.write(item.anonymouns + '\t')
  67. fp.write(item.type + '\t')
  68. fp.write(item.support + '\t')
  69. fp.write(item.local + '\t')
  70. fp.write(item.speed + '\n')
  71. self.log.info('write %s:%s to file successfuly......'%(item.ip,item.port))
  72.  
  73. if __name__ == "__main__":
  74. USE = GetProxy()

由于这几次在使用自己二次封装的myLog模块并未加注释,此次补上,将内置logging模块再次封装,增加了获取用户名,多路径日志输出;

  1. #!/usr/bin/env python
  2. #coding:utf-8
  3. #date 2017_11_30
  4. #author chenjisheng
  5.  
  6. import logging
  7. import getpass
  8.  
  9. class MyLog(object):
  10. '''此类用来封装已有logging类,方便自己使用'''
  11.  
  12. def __init__(self):
  13. self.user = getpass.getuser() #获取使用的用户
  14. self.logger = logging.getLogger(self.user) #初始化一个logger 对象
  15. self.logger.setLevel(logging.DEBUG) #设置logger 的日志级别
  16. self.logfile = "progress_log.log" #设置日志保存的文件
  17. self.formates = logging.Formatter(
  18. "[%(asctime)s] - USERNAME:[%(name)s] - [%(levelname)s] - %(message)s"
  19. ) #设置日志的格式
  20. self.Hand = logging.FileHandler(self.logfile) #设置日志的输出为文件
  21. self.Hand.setFormatter(self.formates) #使用日志的格式
  22. self.Hand.setLevel(logging.ERROR) #设置输出为文件的日志级别
  23.  
  24. self.HandStream = logging.StreamHandler() #设置日志的输出格式为console
  25. self.HandStream.setFormatter(self.formates) #使用日志的格式
  26. self.HandStream.setLevel(logging.DEBUG) #设置输出为窗口的日志级别
  27.  
  28. self.logger.addHandler(self.HandStream) #增加日志的输出对象给logger(负责发送消息)
  29. self.logger.addHandler(self.Hand) #增加日志的输出对象给logger
  30.  
  31. def debug(self,messages):
  32. self.logger.debug(messages)
  33.  
  34. def info(self,messages):
  35. self.logger.info(messages)
  36.  
  37. def warning(self,messages):
  38. self.logger.warning(messages)
  39.  
  40. def error(self,messages):
  41. self.logger.error(messages)
  42.  
  43. def critical(self,messages):
  44. self.logger.critical(messages)
  45.  
  46. if __name__ == "__main__":
  47. mylog = MyLog()
  48. mylog.debug("I'm debug")
  49. mylog.info("I'm info")
  50. mylog.warning("I'm warning")
  51. mylog.error("I'm error ")
  52. mylog.critical("I'm critical")

代码学习都是在不断练习中成长,下一篇将上传一个简易的爬虫架构。

Selenium&PhantomJS 完成爬取网络代理的更多相关文章

  1. selenium+phantomjs+pyquery 爬取淘宝商品信息

    from selenium import webdriver from selenium.common.exceptions import TimeoutException from selenium ...

  2. 使用Python爬虫爬取网络美女图片

    代码地址如下:http://www.demodashi.com/demo/13500.html 准备工作 安装python3.6 略 安装requests库(用于请求静态页面) pip install ...

  3. 数据抓取的艺术(一):Selenium+Phantomjs数据抓取环境配置

     数据抓取的艺术(一):Selenium+Phantomjs数据抓取环境配置 2013-05-15 15:08:14 分类: Python/Ruby     数据抓取是一门艺术,和其他软件不同,世界上 ...

  4. 一起学爬虫——使用selenium和pyquery爬取京东商品列表

    layout: article title: 一起学爬虫--使用selenium和pyquery爬取京东商品列表 mathjax: true --- 今天一起学起使用selenium和pyquery爬 ...

  5. 极简代理IP爬取代码——Python爬取免费代理IP

    这两日又捡起了许久不碰的爬虫知识,原因是亲友在朋友圈拉人投票,点进去一看发现不用登陆或注册,觉得并不复杂,就一时技痒搞一搞,看看自己的知识都忘到啥样了. 分析一看,其实就是个post请求,需要的信息都 ...

  6. 爬虫(四)Selenium + Headless Chrome爬取Bing图片搜索结果

    Bing图片搜索结果是动态加载的,如果我们直接用requests去访问页面爬取数据,那我们只能拿到很少的图片.所以我们使用Selenium + Headless Chrome来爬取搜索结果.在开始前, ...

  7. 爬虫-----selenium模块自动爬取网页资源

    selenium介绍与使用 1 selenium介绍 什么是selenium?selenium是Python的一个第三方库,对外提供的接口可以操作浏览器,然后让浏览器完成自动化的操作.     sel ...

  8. 利用selenium和ffmpeg爬取m3u8 ts视频《进击的巨人》

    需求 想看下动漫<进击的巨人>,发现到处被和谐,找不到资源,但是在一个视频网站找到了在线播放,https://www.55cc.cc/dongman/17890/player-2-1.ht ...

  9. python从爬虫基础到爬取网络小说实例

    一.爬虫基础 1.1 requests类 1.1.1 request的7个方法 requests.request() 实例化一个对象,拥有以下方法 requests.get(url, *args) r ...

随机推荐

  1. 深入理解Akka Actor模型

    Carl Hewitt 在1973年对Actor模型进行了如下定义:"Actor模型是一个把'Actor'作为并发计算的通用原语". Actor是异步驱动,可以并行和分布式部署及运 ...

  2. 【LeetCode】145. Binary Tree Postorder Traversal 解题报告 (C++&Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 迭代 日期 题目地址:https://leetc ...

  3. 【九度OJ】题目1191:矩阵最大值 解题报告

    [九度OJ]题目1191:矩阵最大值 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1191 题目描述: 编写一个程序输入一个mXn的 ...

  4. World is Exploding(hdu5792)

    World is Exploding Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  5. 《Head First设计模式》读书笔记

    前言:本文是记录我在阅读<Head First设计模式>这本书时,做得相关笔记,相关示例代码地址:design-patterns.由于本书不是将设计原则和设计模式分开讲述的,而是在讲一个设 ...

  6. Universal adversarial perturbations

    目录 概 主要内容 算法 实验部分 实验1 实验2 实验3 代码 Moosavidezfooli S, Fawzi A, Fawzi O, et al. Universal Adversarial P ...

  7. 基于Java swing+mysql+eclipse的【图书管理系统】

    本项目为Java swing项目,在工作环境中基本使用不到,但是很多学校把这个当做编程入门的项目来做,故分享出本项目供初学者参考. CSDN赞助下载:https://download.csdn.net ...

  8. Mysql 设计超市经营管理系统,包括员工库存表(stock) 和 仓库表(warehouse)

    互联网技术学院周测机试题(三) 一.需求分析 为进一步完善连锁超市经营管理,提高管理效率,减少管理成本,决定开发一套商品管理系统,用于日常的管理.本系统分为商品管理.员工管理.店铺管理,库存管理等功能 ...

  9. Elasticsearch单机安装Version7.10.1

    1.说明 Elasticsearch单机安装, 基于Elasticsearch的7.10.1版本, 在Linux上安装Elasticsearch单机, 使用安装包elasticsearch-7.10. ...

  10. 初识python: xlsxwriter 将数据写入Excel

    使用 xlsxwriter 模块将数据写入excel . #!/user/bin env python # author:Simple-Sir # time:2020/9/24 12:51 # 使用 ...