由于之前一直在做手工测试,刚刚接触到自动化测试,并且认识了webdriver这个工具,所以说想用这个工具来搞事情,正巧自动化测试中有读取文本的方法,所以我灵机一动,准备用webdriver来拔取我最近看的小说,并把它下载到本地的text文件中。
1.准备工作
环境:python3
工具:eclipse+pydev
依赖包:selenium
驱动:chromeDriver/geckodriver/iedriver(一个就行)
个人水平:刚开始接触自动化测试的萌新,安装了python环境和编辑器,并且下载过驱动和selenium包,如果没有的话,请查看这篇博客
http://blog.csdn.net/ccggaag/article/details/72650411
2.思路
首先我们进入 http://www.biquge.com/0_249 这个页面,也就是包含所有的章节目录的这个页面,我的思路是每次点击章节进入这章的页面,然后获取到章节的内容后,再返回到目录页面,进入到下一章页面
2.1 目录的逐个访问
我们发现,最后一章和第一章的xpath(路径)只是数字上的区别,所以我们把.//*[@id='list']/dl/dd[2059]/a 这个路径分成三部分:
a=".//*[@id='chapterslist']/dl/dd["
b = 0
c="]/a"
b = 0
c="]/a"
每次把b增加1,然后循环的通过xpath定位后点击进入章节内容的页面。
2.2 章节内容的获取
通过火狐浏览器的插件:firebug和firepath获取到xpath
3.脚本实现
from selenium import webdriver import time from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By import logging import sys #准备阶段 driver = webdriver.Chrome() f = open("黑铁之堡.txt","w") #生成日志文件 logger = logging.getLogger() formatter = logging.Formatter('%(asctime)s %(levelname)-8s: %(message)s') file_handler = logging.FileHandler("黑铁之堡.log") file_handler.setFormatter(formatter) # 可以通过setFormatter指定输出格式 console_handler = logging.StreamHandler(sys.stdout) console_handler.formatter = formatter logger.addHandler(file_handler) logger.addHandler(console_handler) logger.setLevel(logging.INFO) #基本属性 a=".//*[@id='list']/dl/dd[" b = 9 c="]/a" #封装方法 def count(b): b= b+1 return b def url(url): return (a+str(url)+c) #打开目录页 driver.get("http://www.biqudu.com/0_249/") #循环获取xpath while b<2059: try: b= count(b) print(url(b)) #xpath是目录页底部的一个元素的路径,为了确保页面加载完 WebDriverWait(driver,3,0.5).until(EC.presence_of_element_located((By.XPATH,".//*[@id='footer']/div[2]/p[1]"))) ele=driver.find_element_by_xpath(url(b)) newUrl =ele.get_attribute("href") #获取到这章的Url,然后访问这章 logger.info(newUrl ) driver.get(newUrl ) #标题 title = WebDriverWait(driver,5,0.5).until(EC.presence_of_element_located((By.XPATH,".//*[@id='wrapper']/div[5]/div[2]/div[2]/h1"))) #内容 text = WebDriverWait(driver,3,0.5).until(EC.presence_of_element_located((By.XPATH,".//*[@id='content']"))) #写入到txt文件,记得加入换行: f.write(title.text) f.write(" ") f.write(text.text) f.write(" ") #日志记录章节的信息 logger.info(title.text) logger.info(b) #返回目录页 driver.back() except: #如果由于网络等原因无法获取到,那么重新进入目录页 logger.error(Exception) driver.get("http://www.biqudu.com/0_249/") b= b-1 #关闭文件和driver驱动 driver.close() f.close()
然后我们就得到了小说的txt和日志文件啦