Selenium学习四——利用Python爬取网页多个页面的表格数据并存到已有的excel中
来源:互联网 发布:软件研发部门规划 编辑:程序博客网 时间:2024/06/05 21:03
利用Python爬取网页多个页面的表格数据并存到已有的excel中
1、具体要求
获取牛客网->题库->在线编程->剑指Offer网页,获取表格中的全部题目,保存到本地excel中
2、技术要求
利用Selenium+Python获取网页,操作到table页面
通过xlwt、xlrd、xlutils模块,将表格保存到本地excel
xlwt:写入excel(新建)
xlrd:读取excel
xlutils:将xlrd.Book转为xlwt.workbook,在原有的excel基础上进行修改,添加等。
技术博客参考:http://www.cnblogs.com/jiangzhaowei/p/5856604.html
3、主要代码
from xlutils.copy import copyimport xlwtimport xlrdimport osdef load_Table(page): #创建工作簿 wbk = xlwt.Workbook(encoding='utf-8', style_compression=0) #创建工作表 sheet = wbk.add_sheet('sheet 1', cell_overwrite_ok=True) excel = r"C:\xxx\test.xls" table_rows = driver.find_element_by_xpath("//*[@class='module-body offer-body']/table/tbody").find_elements_by_tag_name('tr') row = 20 for i, tr in enumerate(table_rows): if i==0 and page==0: table_cols1 = tr.find_elements_by_tag_name('th') for j, tc in enumerate(table_cols1): sheet.write(i, j, tc.text) wbk.save(excel) else: table_cols2 = tr.find_elements_by_tag_name('td') for j, tc in enumerate(table_cols2): #老的工作簿,打开excel oldWb = xlrd.open_workbook(excel, formatting_info=True) #新的工作簿,复制老的工作簿 newWb = copy(oldWb) #新的工作表 newWs = newWb.get_sheet(0) newWs.write(i + page * row, j, tc.text) #os.remove(excel) newWb.save(excel)def switch_page(): #获取页数(除去首页 、尾页、上一页和下一页) pages = driver.find_element_by_xpath("//*[@class='pagination']/ul").find_elements_by_tag_name('li') t = len(pages)-4 for i in range(t): driver.find_element_by_link_text(str(i+1)).click() print i load_Table(i)
4、xlutils
引入模块
from xlutils.copy import copyimport xlwtimport xlrd
用xlwt创建工作簿工作表
#创建工作簿 wbk = xlwt.Workbook(encoding='utf-8', style_compression=0) #创建工作表 sheet = wbk.add_sheet('sheet 1', cell_overwrite_ok=True)
写入excel,并保存到本地原有的excel中(用xlwt这样保存会覆盖之前的内容)
sheet.write(i, j, tc.text) wbk.save(excel)
用xlrd打开excel(formatting_info=true保证时间数据在copy时保持原样)
oldWb = xlrd.open_workbook(excel, formatting_info=True)
复制excel文件
newWb = copy(oldWb)
读取复制的excel文件的第一个sheet
newWs = newWb.get_sheet(0)
向这个sheet写入数据
newWs.write(i, j, tc.text)
删除原先存在的excel
os.remove(excel)
保存这个新的excel文件
newWb.save(excel)
5、全部代码
#coding:utf-8from selenium import webdriverfrom selenium.webdriver.common.action_chains import ActionChainsfrom xlutils.copy import copyimport xlwtimport xlrdimport osimport time'''下载牛客网首页 > 在线编程 > 剑指Offer的题目表到excel读取excel里的值'''driver = webdriver.Chrome()driver.get("https://www.nowcoder.com/")time.sleep(2)def switch_window(): #获取当前句柄 h = driver.current_window_handle print h #跳转到指定页面 element = driver.find_element_by_xpath("//*[@class='nowcoder-navbar']/li[2]/a") ActionChains(driver).move_to_element(element).perform() driver.find_element_by_xpath("//*[@class='sub-nav']/li[3]/a").click() time.sleep(2) driver.find_element_by_xpath("//*[@class='topic-list clearfix']/li[1]").click() #切换到指定页面 driver.close() all_h = driver.window_handles for i in all_h: if i != h: driver.switch_to.window(i)def load_Table(page): #创建工作簿 wbk = xlwt.Workbook(encoding='utf-8', style_compression=0) #创建工作表 sheet = wbk.add_sheet('sheet 1', cell_overwrite_ok=True) excel = r"C:\xxx\test.xls" table_rows = driver.find_element_by_xpath("//*[@class='module-body offer-body']/table/tbody").find_elements_by_tag_name('tr') row = 20 print row for i, tr in enumerate(table_rows): if i==0 and page==0: table_cols1 = tr.find_elements_by_tag_name('th') for j, tc in enumerate(table_cols1): sheet.write(i, j, tc.text) wbk.save(excel) else: table_cols2 = tr.find_elements_by_tag_name('td') for j, tc in enumerate(table_cols2): #老的工作簿,打开excel oldWb = xlrd.open_workbook(excel, formatting_info=True) #新的工作簿,复制老的工作簿 newWb = copy(oldWb) #新的工作表 newWs = newWb.get_sheet(0) newWs.write(i + page * row, j, tc.text) os.remove(excel) newWb.save(excel) print 'save done'def switch_page(): pages = driver.find_element_by_xpath("//*[@class='pagination']/ul").find_elements_by_tag_name('li') t = len(pages) for i in range(t-4): driver.find_element_by_link_text(str(i+1)).click() print i load_Table(i)switch_window()switch_page()print 'done'
6、遇到的问题
本次试验代码对于table换页的处理较为粗暴,直接通过点击页码操作,for循环将每一页添加到excel中去。由于是学的阶段,还有其他的方法以后再完善。
①在添加过程中,一开始没有使用xlutils,导致每次只有最后一页数据,因为覆盖了。
②后来添加的时候for语句没有写好,导致行乱序了,仔细一点就ok
注:数字变为字符串前面要加str转换,table的index从0开始,页面元素定位从1开始
如
定位find_element_by_xxpath("//*[@class='search-input-wrap']/table/tbody/tr[4]/td[2]")
- Selenium学习四——利用Python爬取网页多个页面的表格数据并存到已有的excel中
- Selenium学习三——利用Python爬取网页表格数据并存到excel
- python 网页爬取数据并存到数据库中
- Python爬取天气预报数据,并存入到本地EXCEL中
- Python爬虫系列(四)(简单)Dota排行榜爬取,并存入Excel表格
- 数据导入到已存在的excel表格中
- Android 将数据保存到已有的固定模板的Excel表中
- python爬虫爬取网页表格数据
- 如何把excel中的数据导入到oracle数据已有的表中
- jQuery 将网页中一个表格中的数据已行为最小单元添加到另外的一个表格当中
- 从Jsp页面导出数据到Excel表格中
- 利用JDBC连接取数据并导入到EXCEL中
- 将页面中指定表格的数据导入到Excel中
- 简单的POI导出JSP页面表格数据到excel
- 页面表格数据下载到Excel的超实用方法
- python爬虫:爬取豆瓣读书某个tag下的书籍并存入excel
- python 网络上抓取数据处理并存入到Excel'中
- python使用selenium爬取InCites中journal数据
- 关于"XML 文档(2, 2)中有错误:不应有 <xml xmlns=''>"错误
- 欢迎使用CSDN-markdown编辑器
- dp动态规划分类详解
- gdb调试多线程
- SPOJ422:Transposing is Even More Fun(Polya)
- Selenium学习四——利用Python爬取网页多个页面的表格数据并存到已有的excel中
- JSP中相对路径与绝对路径问题
- HDU 4272 LianLianKan
- 高并发系统限流
- OTT系统和IPTV系统不一样吗?有什么区别?
- 关于字符串
- 关于项目的一点点总结,签到返利日历的实现
- CAN通信中地址设置的问题
- $.Deferred(),for循环内异步请求问题的解决办法