Selenium&PhantomJS 完成爬取网络代理
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 的目录中就可以 了
交互式的小例子我就写了,直接上一个实例代码,也可以将实例中的解析网页源码部分在交互式环境中敲一遍,体验一下;
#!/usr/bin/env python
#coding:utf-8
"""用selenium&PhantomJS 完成的网络爬虫,最适合使用的情形是爬取有JS的网站,但是用来爬取其他网站同样给力""" from selenium import webdriver
from myLog import MyLog as mylog
import sys
reload(sys)
sys.setdefaultencoding('utf-8') class Item(object): #用于存储代理的属性
ip = None
port = None
anonymouns = None
type = None
support = None
local = None
speed = None class GetProxy(object): def __init__(self):
self.starturl = "http://www.kuaidaili.com/free/inha/" #目标网址
self.log = mylog() #二次封装的日志模块
self.urls = self.getUrls()
self.proxyList = self.getProxyList(self.urls)
self.fileName = 'proxy.txt'
self.saveFile(self.fileName,self.proxyList) def getUrls(self): ##生成目标页面代理的网页页面URL
urls = []
for i in xrange(1,3):
url = self.starturl + str(i)
urls.append(url)
self.log.info('get URL %s to urls' %url)
return urls def getProxyList(self,urls): ##分析网页源代码
browser = webdriver.PhantomJS() ## 使用selenium&PhantomJS
proxyList = []
for url in urls:
browser.get(url) #打开网页
browser.implicitly_wait(5) #智能等待加载JS模块
elements = browser.find_elements_by_xpath('//tbody/tr') #使用xpath来解析网页源码
for element in elements:
item = Item()
item.ip = element.find_element_by_xpath('./td[1]').text
item.port = element.find_element_by_xpath('./td[2]').text
item.anonymouns = element.find_element_by_xpath('./td[3]').text
item.type = element.find_element_by_xpath('./td[4]').text
item.support = element.find_element_by_xpath('./td[5]').text
item.local = element.find_element_by_xpath('./td[6]').text
item.speed = element.find_element_by_xpath('./td[7]').text
proxyList.append(item)
self.log.info('add proxy %s: %s to list'%(item.ip,item.port))
browser.quit() #浏览器的退出
return proxyList def saveFile(self,fileName,proxyList): #生成文件
self.log.info('add all proxy to %s'%self.fileName)
with open(fileName,'w') as fp:
for item in proxyList:
# print item.ip
fp.write(item.ip+'\t')
fp.write(item.port + '\t')
fp.write(item.anonymouns + '\t')
fp.write(item.type + '\t')
fp.write(item.support + '\t')
fp.write(item.local + '\t')
fp.write(item.speed + '\n')
self.log.info('write %s:%s to file successfuly......'%(item.ip,item.port)) if __name__ == "__main__":
USE = GetProxy()
由于这几次在使用自己二次封装的myLog模块并未加注释,此次补上,将内置logging模块再次封装,增加了获取用户名,多路径日志输出;
#!/usr/bin/env python
#coding:utf-8
#date 2017_11_30
#author chenjisheng import logging
import getpass class MyLog(object):
'''此类用来封装已有logging类,方便自己使用''' def __init__(self):
self.user = getpass.getuser() #获取使用的用户
self.logger = logging.getLogger(self.user) #初始化一个logger 对象
self.logger.setLevel(logging.DEBUG) #设置logger 的日志级别
self.logfile = "progress_log.log" #设置日志保存的文件
self.formates = logging.Formatter(
"[%(asctime)s] - USERNAME:[%(name)s] - [%(levelname)s] - %(message)s"
) #设置日志的格式
self.Hand = logging.FileHandler(self.logfile) #设置日志的输出为文件
self.Hand.setFormatter(self.formates) #使用日志的格式
self.Hand.setLevel(logging.ERROR) #设置输出为文件的日志级别 self.HandStream = logging.StreamHandler() #设置日志的输出格式为console
self.HandStream.setFormatter(self.formates) #使用日志的格式
self.HandStream.setLevel(logging.DEBUG) #设置输出为窗口的日志级别 self.logger.addHandler(self.HandStream) #增加日志的输出对象给logger(负责发送消息)
self.logger.addHandler(self.Hand) #增加日志的输出对象给logger def debug(self,messages):
self.logger.debug(messages) def info(self,messages):
self.logger.info(messages) def warning(self,messages):
self.logger.warning(messages) def error(self,messages):
self.logger.error(messages) def critical(self,messages):
self.logger.critical(messages) if __name__ == "__main__":
mylog = MyLog()
mylog.debug("I'm debug")
mylog.info("I'm info")
mylog.warning("I'm warning")
mylog.error("I'm error ")
mylog.critical("I'm critical")
代码学习都是在不断练习中成长,下一篇将上传一个简易的爬虫架构。
Selenium&PhantomJS 完成爬取网络代理的更多相关文章
- selenium+phantomjs+pyquery 爬取淘宝商品信息
from selenium import webdriver from selenium.common.exceptions import TimeoutException from selenium ...
- 使用Python爬虫爬取网络美女图片
代码地址如下:http://www.demodashi.com/demo/13500.html 准备工作 安装python3.6 略 安装requests库(用于请求静态页面) pip install ...
- 数据抓取的艺术(一):Selenium+Phantomjs数据抓取环境配置
数据抓取的艺术(一):Selenium+Phantomjs数据抓取环境配置 2013-05-15 15:08:14 分类: Python/Ruby 数据抓取是一门艺术,和其他软件不同,世界上 ...
- 一起学爬虫——使用selenium和pyquery爬取京东商品列表
layout: article title: 一起学爬虫--使用selenium和pyquery爬取京东商品列表 mathjax: true --- 今天一起学起使用selenium和pyquery爬 ...
- 极简代理IP爬取代码——Python爬取免费代理IP
这两日又捡起了许久不碰的爬虫知识,原因是亲友在朋友圈拉人投票,点进去一看发现不用登陆或注册,觉得并不复杂,就一时技痒搞一搞,看看自己的知识都忘到啥样了. 分析一看,其实就是个post请求,需要的信息都 ...
- 爬虫(四)Selenium + Headless Chrome爬取Bing图片搜索结果
Bing图片搜索结果是动态加载的,如果我们直接用requests去访问页面爬取数据,那我们只能拿到很少的图片.所以我们使用Selenium + Headless Chrome来爬取搜索结果.在开始前, ...
- 爬虫-----selenium模块自动爬取网页资源
selenium介绍与使用 1 selenium介绍 什么是selenium?selenium是Python的一个第三方库,对外提供的接口可以操作浏览器,然后让浏览器完成自动化的操作. sel ...
- 利用selenium和ffmpeg爬取m3u8 ts视频《进击的巨人》
需求 想看下动漫<进击的巨人>,发现到处被和谐,找不到资源,但是在一个视频网站找到了在线播放,https://www.55cc.cc/dongman/17890/player-2-1.ht ...
- python从爬虫基础到爬取网络小说实例
一.爬虫基础 1.1 requests类 1.1.1 request的7个方法 requests.request() 实例化一个对象,拥有以下方法 requests.get(url, *args) r ...
随机推荐
- ajaxFileUpload上传文件成功后却无法解析服务器返回的json数据
可能是应该返回内容带了标签,过滤下 var index=data.indexOf("<"); if (index!=-1){ data=data.substring(0,in ...
- fedora之自动寻找命令并提示安装PackageKit-command-not-found
fedora 1.比如,我要用clang 命令编译代码,但是没有该指令.比如: clang main.cxx -o main 2.那么,输入未知命令,希望fedora会自动寻找相对应的包,再并提示安装 ...
- win10使用照片查看器查看图片
1.关于 演示环境: win10 1909 2.习惯win7的照片查看器 如果你习惯使用win7的照片查看器在win10查看照片,可以通过下面的注册表代码实现.方法:1.创建 后缀名为 .reg的文件 ...
- 刷完 900 多题后的首次总结:LeetCode 应该怎么刷?
「负雪明烛」公众号是负雪明烛维护的一个算法题解公众号,致力于帮助大家刷题.找工作.欢迎关注. 大家好,我是负雪明烛.今天跟大家聊一聊「LeetCode应该怎么刷?」这个话题. 我是大二的时候开始接触 ...
- 【LeetCode】519. Random Flip Matrix 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址:https://leetcode.com/problems/random-fl ...
- 1092 - Lighted Panels
1092 - Lighted Panels PDF (English) Statistics Forum Time Limit: 3 second(s) Memory Limit: 32 MB ...
- 4 种主流的 API 架构风格对比
1RPC:调用另一个系统的函数 RPC 的工作机制 客户端调用一个远程的过程,将参数和附加信息序列化为消息,然后将消息发送到服务端.服务端在接受到消息后,将信息的内容反序列化,执行所请求的操作,然后将 ...
- Ubuntu 16.04远程配置Jupyter Notebook
安装和配置Jupyter Notebook 安装jupyter notebook conda conda install -c conda-forge notebook pip pip install ...
- HTML网页设计基础笔记 • 【第7章 盒子模型】
全部章节 >>>> 本章目录 7.1 盒子模型原理 7.1.1 盒子模型概述 7.1.2 盒子的大小 7.1.3 盒子之间的关系 7.2 标准文档流 7.2.1 标准文档流 ...
- linux 设置开机自动启动应用
作为一个开发,项目现在一般都是部署在虚拟机上的linux,数据库也是按照在l虚拟机上的linux,一旦关机了,在开机程序都没打开,又要一个个去开,很麻烦,所以现在我现在使用supervisor去做一个 ...