selenium配合phantomjs实现爬虫功能,并把抓取的数据写入excel
# -*- coding: UTF-8 -*-
'''
Created on 2016年5月13日 @author: csxie
'''
import datetime
from Base import BasePage
import ExcelOperation as excel
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.expected_conditions import text_to_be_present_in_element
import unittest
class JobLog(BasePage):
url=""#目标url
def setUp(self):
BasePage.setUP(self)
def tearDown(self):
BasePage.tearDown(self) def test_querysql(self):
"""
查询到符合条件的信息并写入excel
"""
driver=self.driver
driver.get(self.url)
'''
设置参数
start:起始日期
end:截止日期
user:查询人员
'''
end=datetime.date.today()
start=end+datetime.timedelta(days=-6)
user=None
#起始日期
txtStart=driver.find_element_by_id("ctl01_txtSelectDateFrom")
txtStart.clear()
txtStart.send_keys(start)
#截止日期
txtEnd=driver.find_element_by_id("ctl01_txtSelectDateTo")
txtEnd.clear()
txtEnd.send_keys(end)
#查询人员
if(user!=None):
txtuser=driver.find_element_by_id("ctl01_txtUser")
txtuser.clear()
txtuser.send_keys(user)
#查询按钮
btnQueryInfo=driver.find_element_by_id("ctl01_btnQueryInfo")
btnQueryInfo.click()
#总页数
totalPages=int(driver.find_element_by_id("ctl01_uc_CommonPager_lb_TotalPages").text)
i=1
while(i<=totalPages):
#table的xpath
listTable=self.getTableData(".//*[@id='ctl01__wrLogList_gvlist']",colNO=9,loop=i)
#当前页数
currentPage=int(driver.find_element_by_id("ctl01_uc_CommonPager_lb_PageNum").text)
if(currentPage==1):
excel.save_to_excel_newsheet(listTable,excelPath='joblog.xls')
else:
excel.save_to_excel_oldsheet(listTable,excelPath='joblog.xls')
if(i!=totalPages):
#下一页按钮
driver.find_element_by_id("ctl01_uc_CommonPager_NextPage").click()
WebDriverWait(driver,8).until(text_to_be_present_in_element(('id','ctl01_uc_CommonPager_lb_PageNum'),str(i+1)))
i=i+1 def getTableData(self,value,colTag='td',colNO=None,loop=None):
'''
获取表格数据
colNO:存在合并行时,强制指定表格列数
'''
driver=self.driver
table=driver.find_element(by="xpath",value=value)
rows=table.find_elements(by="tag name",value="tr")#行集合
maxrowCount=len(rows)#表格行数 #如果colNO=None不为空,则用传进来的值作为列数
if(colNO==None):
cols = table.find_elements(by="tag name",value="td");
if(cols!='td'):
cols = table.find_elements(by="tag name",value="th")
maxcolCount=len(cols)/len(rows)#表格列数
else:
maxcolCount=colNO lists = [[] for i in range(maxrowCount)]
#print "列数"+str(maxcolCount)
#print "行数"+str(maxrowCount)
i=1
while i<=maxrowCount:
j=1;#初始化列
while j<=maxcolCount:
try:
if(i==1):
try:
innerText=driver.find_element(by="xpath",value=value+"/tbody/tr["+str(i)+"]/"+colTag+"["+str(j)+"]").text
except:
colTag="th"
innerText=driver.find_element(by="xpath",value=value+"/tbody/tr["+str(i)+"]/"+colTag+"["+str(j)+"]").text
else:
colTag="td"
if(j==3 or j==5):
innerText=driver.find_element(by="xpath",value=value+"/tbody/tr["+str(i)+"]/"+colTag+"["+str(j)+"]/a").get_attribute("title")
elif(j==8):
innerText=driver.find_element(by="xpath",value=value+"/tbody/tr["+str(i)+"]/"+colTag+"["+str(j)+"]").text
innerText=float(innerText.replace("h", ""))
else:
innerText=driver.find_element(by="xpath",value=value+"/tbody/tr["+str(i)+"]/"+colTag+"["+str(j)+"]").text
except:
innerText=""
#print "第"+str(i)+"行,第"+str(j)+"列"+str(innerText)
lists[i-1].append(innerText)
j+=1
i+=1
if(loop!=1):#不是第一次循环,列头不要
return lists[1:]
return lists if __name__ == "__main__":
unittest.main()
# -*- coding: UTF-8 -*-
'''
Created on 2016年5月18日 @author: csxie
'''
import xlwt
from xlrd import open_workbook
from xlutils.copy import copy
import os def save_to_excel_newsheet(listTable,excelPath=r'C:\demo.xls',sheetName='sheet1'):
if(isinstance(listTable,list)):
rowNO=len(listTable);
if(rowNO==0):
raise ValueError,u'传入的是list是空的'
colNO=len(listTable[0]); wkb = xlwt.Workbook()
sheet = wkb.add_sheet(sheetName)
for i in range(rowNO):
for j in range(colNO):
#print listTable[i][j]
#print str(i)+'行'+str(j)+'列'
sheet.write(i,j,listTable[i][j])
if(os.path.exists(excelPath)):
os.remove(excelPath)
wkb.save(excelPath)
return True
else:
raise TypeError,u'传入的类型不是list' def save_to_excel_oldsheet(listTable,excelPath=r'C:\demo.xls',sheetName='sheet1'):
if(isinstance(listTable,list)):
rowNO=len(listTable);
if(rowNO==0):
raise ValueError,u'传入的是list是空的'
colNO=len(listTable[0]);
rb = open_workbook(excelPath)
sheet_index=rb.sheet_names().index(sheetName)
old_rows=rb.sheet_by_name(sheetName).nrows#已存在的excel中数据行数 wkb = copy(rb)
sheet = wkb.get_sheet(sheet_index)
for i in range(rowNO):
for j in range(colNO):
sheet.write(i+old_rows,j,listTable[i][j])
#print str(i)+'行'+str(j)+'列'
wkb.save(excelPath)
return True
else:
raise TypeError,u'传入的类型不是list'
# -*- coding: UTF-8 -*-
from selenium import webdriver
import unittest class BasePage(unittest.TestCase):
def setUP(self):
self.driver= webdriver.PhantomJS(executable_path="phantomjs.exe")
#self.driver.set_window_size(1400, 1000)
#self.driver.implicitly_wait(1)
self.verificationErrors = [] def tearDown(self):
self.driver.quit()
#self.driver.close()
self.assertEqual([], self.verificationErrors)
selenium配合phantomjs实现爬虫功能,并把抓取的数据写入excel的更多相关文章
- iOS开发——网络实用技术OC篇&网络爬虫-使用青花瓷抓取网络数据
网络爬虫-使用青花瓷抓取网络数据 由于最近在研究网络爬虫相关技术,刚好看到一篇的的搬了过来! 望谅解..... 写本文的契机主要是前段时间有次用青花瓷抓包有一步忘了,在网上查了半天也没找到写的完整的教 ...
- iOS开发——网络使用技术OC篇&网络爬虫-使用正则表达式抓取网络数据
网络爬虫-使用正则表达式抓取网络数据 关于网络数据抓取不仅仅在iOS开发中有,其他开发中也有,也叫网络爬虫,大致分为两种方式实现 1:正则表达 2:利用其他语言的工具包:java/Python 先来看 ...
- 「拉勾网」薪资调查的小爬虫,并将抓取结果保存到excel中
学习Python也有一段时间了,各种理论知识大体上也算略知一二了,今天就进入实战演练:通过Python来编写一个拉勾网薪资调查的小爬虫. 第一步:分析网站的请求过程 我们在查看拉勾网上的招聘信息的时候 ...
- 网络爬虫-使用Python抓取网页数据
搬自大神boyXiong的干货! 闲来无事,看看了Python,发现这东西挺爽的,废话少说,就是干 准备搭建环境 因为是MAC电脑,所以自动安装了Python 2.7的版本 添加一个 库 Beauti ...
- [Python爬虫] 之八:Selenium +phantomjs抓取微博数据
基本思路:在登录状态下,打开首页,利用高级搜索框输入需要查询的条件,点击搜索链接进行搜索.如果数据有多页,每页数据是20条件,读取页数 然后循环页数,对每页数据进行抓取数据. 在实践过程中发现一个问题 ...
- [Python爬虫] 之四:Selenium 抓取微博数据
抓取代码: # coding=utf-8import osimport refrom selenium import webdriverimport selenium.webdriver.suppor ...
- 使用selenium webdriver+beautifulsoup+跳转frame,实现模拟点击网页下一页按钮,抓取网页数据
记录一次快速实现的python爬虫,想要抓取中财网数据引擎的新三板板块下面所有股票的公司档案,网址为http://data.cfi.cn/data_ndkA0A1934A1935A1986A1995. ...
- 网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(2): 抓取allitebooks.com书籍信息及ISBN码
这一篇首先从allitebooks.com里抓取书籍列表的书籍信息和每本书对应的ISBN码. 一.分析需求和网站结构 allitebooks.com这个网站的结构很简单,分页+书籍列表+书籍详情页. ...
- iOS—网络实用技术OC篇&网络爬虫-使用java语言抓取网络数据
网络爬虫-使用java语言抓取网络数据 前提:熟悉java语法(能看懂就行) 准备阶段:从网页中获取html代码 实战阶段:将对应的html代码使用java语言解析出来,最后保存到plist文件 上一 ...
随机推荐
- VAR模型学习笔记
目录 1 定义 VAR模型的具体步骤 建模步骤及公式 代码实现 1 定义 VAR模型除了分析自身滞后项的影响外,还分析其他相关因素的滞后项对未来值产生的影响参考 用来分析随机扰动对系统的动态冲击的大小 ...
- bash数学运算之bc
一.expr 1.1 语法 注意必须有空格 只能精确到整数,无法精确到浮点数 1.2 操作符对照表 使用expr命令时需要加\进行转义,因为部分符号是保留关键字 例1:比较num1跟num2的大小 [ ...
- 百度地图和echarts结合实例
1.由echart对象(bmapChart)获取百度地图对象(bdMap),echart对象(bmapChart)适用于所有的echart的操作和接口,百度地图对象(bdMap)适用于百度地图的所有接 ...
- 将图片中的一部分图片用ps进行旋转
先用选择工具选择你要进行变动的那部分图像,至于选择的方法有多种而且得看你的图片来决定采取何种选择方法.然后在英文输入状态下按下“CTRL+T”出现变换框,你将鼠标移动对角点上,当鼠标变为一种旋转的图标 ...
- 字节流和字符流的read方法
字节流和字符流的read方法 public class Test { public void fileOutput() throws Exception { File file = new File( ...
- jvm(n):JVM面试
Jvm内存结构,一般是面试官对Java虚拟机这块考察的第一问. Java虚拟机的内存结构一般可以从线程共有和线程私有两部分起头作答,然后再详细说明各自的部分,类似树状结构的作答,好处就是思路清晰,面试 ...
- 创建集群corosync
#环境准备 #设置主机名解析yum -y install pcs pacemaker corosync fence-agents-allsystemctl start pcsd.servicesyst ...
- 初学Java时使用记事本开发出现的中文乱码问题
如果是使用微软记事本,那就会麻烦一点,将后缀改为.txt,用记事本打开,左上方:文件→另存为→弹出的窗口的下方会出现使用的编码形式,将编码形式修改为ANSI编码,点击保存→确定替换即可,修改后将后缀改 ...
- Spark学习笔记1
趁着工作业余时间,趁着内心对技术追求的热情,还是对Spark这个大数据内存计算框架动手了,毕竟人与人之间的差距都是在工作业余时间拉开的…… Spark官网:http://spark.apache.or ...
- RESTful api设计风格
简介 REST(Representational State Transfer):表象层状态转变 RESTful对api进行规范和约束,使得api统一规范,增强api的可读性,便于开发. 设计 ...