程序功能为采集网页文本和图片,存储为word。
如下图
实现主要代码如下:
import os,sys
import random
import SpiderUtils as FC
import re
import validators
import time
import requests
from requests.exceptions import RequestException
from selenium import webdriver
from bs4 import BeautifulSoup
from configparser import ConfigParser
from lxml import etree
from docx import Document
import wx
import wx.adv
from concurrent.futures import ThreadPoolExecutor
import 关于窗口 as aboutWindow
#################################################################################
configFile="CommonSpider.ini"
iniFilePath=os.getcwd() + "\\Model"
SpiderState=False #当前是否处于爬取状态
WebUrlKey="URL参数"
WebPageKey="内容页参数"
class TySpider():
def __init__(self,parmPath):
#定义常量
self.iniFilePath=iniFilePath
if not os.path.exists(self.iniFilePath):os.makedirs(self.iniFilePath)
self.parmFilePath=self.iniFilePath+"\\"+parmPath
self.WebUrlKey=WebUrlKey
self.WebPageKey=WebPageKey
self.makeConfile(configFile)
self.makeParmFile(self.parmFilePath)
self.Cfg = ConfigParser()
self.Cfg.read(self.parmFilePath)
self.refererUrl = self.Cfg[self.WebUrlKey]['网站URL'] #爬取网站的refererul
self.docNum=0
self.Web = FC.getWebdriver()
web=None
def makeConfile(self,file):
# 生成配置文件
if os.path.exists(file):
with open(file, 'r') as f:
content = f.readlines()
f.close()
if len(content) > 0:
return
f = open(file, "w")
f.write("[浏览器参数]\n")
f.write("驱动类型 = firefox\n")
f.write("驱动路径 = webdriver/geckodriver_64.exe\n")
f.write("是否显示浏览器 = 否\n")
f.close()
def makeParmFile(self,file):
# 生成配置文件
if os.path.exists(file):
with open(file, 'r') as f:
content = f.readlines()
f.close()
if len(content) > 0:
return
f = open(file, "w")
f.write("["+self.WebUrlKey+"]\n")
f.write("网站名称 = \n")
f.write("网站URL = https://\n")
f.write("采集入口URL = \n")
f.write("采集入口URL变量初始值 = 2\n")
f.write("采集入口URL变量终止值 = 10\n")
f.write("下一页XPATH =\n")
f.write("目录页URL正则表达式 = https://\n")
f.write("内容页URL正则表达式 = https://\n\n")
f.write("["+self.WebPageKey+"]\n")
f.write("#提示:标签参数 class前置符号为.,id前置符号为#;标识去除内容soupselect参数用【,】分割,各元素不要存在父子关系,或将父元素前置\n")
f.write("选取内容soupselect参数 =\n")
f.write("去除内容soupselect参数 =\n")
f.write("文件标题soupselect参数 =\n")
f.write("图片标识soupselect参数 =img\n")
f.write("图片urlsoupselect参数 =src\n")
f.write("#图片水印位置选项【左上|右上|左下|右下】\n")
f.write("图片水印位置 =右下\n")
f.write("图片水印宽度 =\n")
f.write("图片水印高度 =\n")
f.write("生成文件路径 = \n")
f.write("是否插入文档标题 = 是\n")
f.write("标题固定字符 =\n")
f.write("是否删除段首数字 = 是\n")
f.write("首段数字符号 =、,\n")
f.close()
def changeToReferUrl(self,url): #将不完整的url转成含有
if url[:4].lower() != 'http':
if self.refererUrl[-1:] != r'/' and url[0:1] != r'/':
url = self.refererUrl + r'/' + url
else:
url = self.refererUrl + url
return url
###################################################################################
# 根据selenium内容页获取URL列表
def getOnePageUrlList(self,webdriver,UrlPattern,prefix):
url=webdriver.current_url
html = webdriver.page_source
urls = FC.get_findAll_urls(html, UrlPattern)
# 链接添加固定值
newurls = []
for item_url in urls:
if len(item_url) > 1 and item_url[:4].lower() != 'http':
if prefix[-1:] != r'/' and item_url[0:1] != r'/':
item_url = prefix + r'/' + item_url
else:
item_url = prefix + item_url
if validators.url(item_url) and item_url not in newurls: newurls.append(item_url)
return newurls
###################################################################################
#根据参数配置获取内容页URL列表
def getPageUrlList(self):
global SpiderState
SpiderState=True
#判断入口URL模式
pageUrlList=[]
constKey=self.WebUrlKey
prefixUrl = self.Cfg[constKey]['网站URL']
startUrl = self.Cfg[constKey]['采集入口URL']
startNum=0
stopNum=0
try:
startNum=int(self.Cfg[constKey]['采集入口URL变量初始值'].strip())
stopNum=int(self.Cfg[constKey]['采集入口URL变量终止值'].strip())
except:
startNum = 0
stopNum = 0
nextUrlXpath=self.Cfg[constKey]['下一页XPATH'].strip()
cataUrlPattern=self.Cfg[constKey]['目录页URL正则表达式'].strip()
pageUrlPattern=self.Cfg[constKey]['内容页URL正则表达式'].strip()
url = startUrl
web=self.Web
window.frame.列表框_日志.Append("[+]请稍后,正在采集内容列表URL.....")
if startNum>0 and startNum<=stopNum:
for i in range(startNum, stopNum+1):
if SpiderState == False: break
if startUrl.find("{}") > 1: url = startUrl.format(str(i))
if len(re.findall(pattern=pageUrlPattern, string=url))>=1: #链接为内容页URL
pageUrlList.append(url)
elif len(re.findall(pattern=cataUrlPattern, string=url))>=1: #链接为目录页URL,提取页面中的内容URL
#web.implicitly_wait(random.randint(2, 5))
web.get(url)
newurls=self.getOnePageUrlList(web,UrlPattern=pageUrlPattern,prefix=prefixUrl)
window.frame.列表框_日志.Append("[+]目录页检索进度【{}/{}】->【{}】采集到{}条内容页URL。".format(i,len(range(startNum, stopNum+1)),url,len(newurls)))
pageUrlList = pageUrlList + newurls
print(newurls)
elif len(nextUrlXpath)>1: #根据下一页Xpath获取链接
web.get(url)
#web.implicitly_wait(random.randint(2,5))
#滑动到页面底部
js = "window.scrollTo(0,-document.body.scrollHeight)"
web.execute_script(js)
btn=None
try:
btn = web.find_element_by_xpath(nextUrlXpath)
except Exception as e:
window.frame.列表框_日志.Append("[+]提示:【下一页XPATH】设置错误,错误信息:"+nextUrlXpath+e.__str__())
btn=None
while btn!=None:
try:
weburl = web.current_url
if len(re.findall(pattern=pageUrlPattern, string=weburl)) >= 1: # 链接为内容页URL
pageUrlList.append(url)
pageurls = self.getOnePageUrlList(web, UrlPattern=pageUrlPattern, prefix=prefixUrl)
window.frame.列表框_日志.Append("[+]目录页检索【{}】采集到{}条内容页URL。".format(weburl, len(pageurls)))
pageUrlList = pageUrlList + pageurls
try:
nextUrl=btn.get_attribute("href")
except Exception as e:
nextUrl=''
if nextUrl=='':
break
nextUrl=self.changeToReferUrl(nextUrl)
if FC.isUrlStr(nextUrl):
web.get(nextUrl)
else:
btn.click()
web.implicitly_wait(random.randint(2, 5))
try:
btn = web.find_element_by_xpath(nextUrlXpath)
except Exception as e:
print(e)
btn = None
except Exception as e:
print(e)
break
# 轮训获取内容页项目
pageUrlList = FC.updateUrlList(pageUrlList, prefixUrl)
#URL数组去重
pageUrlList = list(tuple(pageUrlList))
del web
return pageUrlList
###################################################################################
#根据参数配置获取内容页URL列表
def savePageContentToWord(self,pageUrl):
try:
web=self.Web
web.get(pageUrl)
web.implicitly_wait(3)
html=web.page_source #.encode()
soup = BeautifulSoup(html, 'html.parser')
parmKey=WebPageKey
selectTag=self.Cfg[parmKey]['选取内容soupselect参数']
removeSelectTags=(self.Cfg[parmKey]['去除内容soupselect参数']).strip().replace(',',',').split(',') #需要去除的节点标签列表,用,分割
fileTitleTag=self.Cfg[parmKey]['文件标题soupselect参数']
imgTag=self.Cfg[parmKey]['图片标识soupselect参数']
imgUrlTag=self.Cfg[parmKey]['图片urlsoupselect参数']
savePath=self.Cfg[parmKey]['生成文件路径']
titleConstStr=self.Cfg[parmKey]['标题固定字符']
#读取水印设置参数
maskPos=self.Cfg[parmKey]['图片水印位置']
if maskPos not in ['左上','右上','左下','右下']: maskPos='右下'
maskWidth,maskHeight=0,0
tmpstr=str(self.Cfg[parmKey]['图片水印宽度']).strip()
if tmpstr!='' and tmpstr.isnumeric() :maskWidth=int(tmpstr)
tmpstr=self.Cfg[parmKey]['图片水印高度']
if tmpstr != '' and tmpstr.isnumeric(): maskHeight = int(tmpstr)
#读取网页标题
pageTitle = soup.title.string
pageTitle=pageTitle.replace(titleConstStr,'')
delCharList=str(self.Cfg[parmKey]['首段数字符号']).strip().replace(',',',').split(',')
selectHtmlList = soup.select(selectTag)
if len(selectHtmlList)<1:
window.frame.列表框_日志.Append("[+]该页没有检索到适配内容,请检查【选取内容soupselect参数】配置选项是否正确!URL:"+pageUrl)
return
for (idx,selectHtml) in enumerate(selectHtmlList):
fileNumStr=''
title=''
if idx>0 :fileNumStr=str(idx)
element=selectHtml.find(fileTitleTag) # 取得title标签的文字内容
if element!=None:title=element.string
fileNametitle=title.replace(titleConstStr,'')
if title=='' or title==None: fileNametitle = FC.filterFileName(pageTitle+fileNumStr)
# 去除不要的标签内容
if removeSelectTags[0]!='' and len(removeSelectTags) > 0:
try:
selectHtmlStr=str(selectHtml)
for itemTag in removeSelectTags:
clearlist=selectHtml.select(itemTag)
if len(clearlist)>0:
for item in clearlist:
delstr=str(item)
selectHtmlStr=selectHtmlStr.replace(delstr,'')
selectHtml=BeautifulSoup(selectHtmlStr,'html.parser')
except Exception as e:
window.frame.列表框_日志.Append('[-]去除非选标签过程发生错误信息:' + e.__str__())
imgtagList=selectHtml.select(imgTag)
wordParaS = FC.splitHtmlByImg(selectHtml, imgtagList) # 按图片分割成段,返回list串
doc = Document()
if str(self.Cfg[WebPageKey]['是否插入文档标题']).lower().strip() in ('是', 'y', 'yes'):
doc.add_heading(fileNametitle) # 向文档里添加标题
i = 0
for part in wordParaS: # 循环写入
part = '<html><body><div >' + str(part) # part是含html标签的字符串,下面使用BeautifuSoup时需要lxml格式化,所以需要加前缀
# 使的每个part部分都更像一个网页,否则BeautifulSoup(part,'lxml')处理的时候会把第二部分开始的内容处理为空
part_tag = BeautifulSoup(part, 'lxml') # 如果不进行lxml处理,下面get_text()无法使用。
part_strings=part_tag.strings
contents=''
for itemString in part_strings:
itemString=itemString.rstrip()
if len(itemString)>1:contents=contents+"\n"+itemString
if str(self.Cfg[WebPageKey]['是否删除段首数字']).lower().strip() in ('是','y','yes'):
contents=FC.delStrfirstNum(contents.strip(),delCharList)
doc.add_paragraph(contents)# .get_text()) # 向文档里添加文字 p
if (i < len(imgtagList)): # 写完片段后紧接写入位于此处分割的图片
imgurl = imgtagList[i].get(imgUrlTag) # 图片地址一般是src
imgurl=self.changeToReferUrl(imgurl)
print('下载图片:',imgurl)
img_name = FC.pic_down(self.refererUrl, imgurl) # 图片有防盗链,需要加入referer='http://n'
print('写入第 ' + str(i + 1) + ' 张图片:' +imgurl,'--->',img_name)
# doc.add_paragraph('此处需要插入图片'+img_name+imgurl)#向文档里添加文字
try:
if FC.isMaskImgFile(img_name,maskPos,maskWidth,maskHeight):doc.add_picture(img_name) # 向文档里添加图片
except Exception as e:
window.frame.列表框_日志.Append('[-]插入图片{}错误'.format(img_name)+e.__str__())
print("插入图片{}错误".format(img_name),e)
if os.path.exists(img_name): os.remove(img_name)
i = i + 1
if not os.path.exists(savePath):os.makedirs(savePath)
if len(fileNametitle)<1:fileNametitle=FC.filterFileName(contents[:20]) #如果文件名为空字符则取文档 前15个字符命名。
docxFile=os.path.join(savePath,fileNametitle + '.docx')
doc.save(docxFile)
self.docNum=self.docNum+1
window.frame.列表框_日志.Append('[+]采集第{}个文件:'.format(self.docNum)+docxFile)
del(doc)
except Exception as e:
window.frame.列表框_日志.Append('[-]采集页面{}发生错误:'.format(pageUrl)+e.__str__())
class Frame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, title='网页采集Word文档生成器V1.1【作者:谢海亮】', size=(830, 630),name='frame',style=541072448)
self.启动窗口 = wx.Panel(self)
self.Centre()
self.列表框_参数文件 = wx.ListBox(self.启动窗口,size=(199, 458),pos=(8, 32),name='listBox',choices=[],style=32)
self.列表框_参数文件.Bind(wx.EVT_LISTBOX_DCLICK,self.列表框_参数文件_表项被双击)
self.标签_入口URL = wx.StaticText(self.启动窗口,size=(79, 15),pos=(218, 75),label='采集入口URL:',name='staticText',style=2321)
self.编辑框_入口URL = wx.TextCtrl(self.启动窗口,size=(278, 28),pos=(308, 74),value='',name='text',style=0)
self.标签_项目名称 = wx.StaticText(self.启动窗口,size=(60, 24),pos=(235, 44),label='项目名称:',name='staticText',style=2321)
self.编辑框_项目名称 = wx.TextCtrl(self.启动窗口,size=(278, 28),pos=(308, 39),value='',name='text',style=0)
self.编辑框_项目名称.Bind(wx.EVT_TEXT,self.编辑框_项目名称_内容被改变)
self.标签_参数文件标题 = wx.StaticText(self.启动窗口,size=(198, 20),pos=(6, 6),label='双击选取采集项目参数文件',name='staticText',style=2321)
self.标签_域名 = wx.StaticText(self.启动窗口,size=(62, 24),pos=(599, 43),label='网站域名:',name='staticText',style=2321)
self.编辑框_域名 = wx.TextCtrl(self.启动窗口,size=(138, 27),pos=(671, 39),value='',name='text',style=0)
self.标签_URL变量 = wx.StaticText(self.启动窗口,size=(81, 16),pos=(586, 76),label='URL变量值:',name='staticText',style=2321)
self.编辑框_变量初值 = wx.TextCtrl(self.启动窗口,size=(51, 27),pos=(671, 75),value='',name='text',style=0)
self.编辑框_变量初值.Bind(wx.EVT_TEXT,self.编辑框_变量初值_内容被改变)
self.编辑框_变量终值 = wx.TextCtrl(self.启动窗口,size=(54, 27),pos=(755, 73),value='',name='text',style=0)
self.编辑框_变量终值.Bind(wx.EVT_TEXT,self.编辑框_变量终值_内容被改变)
self.标签_横线 = wx.StaticText(self.启动窗口,size=(16, 14),pos=(732, 77),label='—',name='staticText',style=2321)
self.标签_下一页XPATH = wx.StaticText(self.启动窗口,size=(106, 16),pos=(252, 178),label='下一页XPATH:',name='staticText',style=2321)
self.编辑框_下一页XPATH = wx.TextCtrl(self.启动窗口,size=(448, 28),pos=(362, 178),value='',name='text',style=0)
self.标签_内容正则表达式 = wx.StaticText(self.启动窗口,size=(137, 24),pos=(216, 146),label='内容页URL正则表达式:',name='staticText',style=2321)
self.编辑框_内容正则表达式 = wx.TextCtrl(self.启动窗口,size=(449, 28),pos=(361, 143),value='',name='text',style=0)
self.标签_选取内容soupselect参数 = wx.StaticText(self.启动窗口,size=(84, 21),pos=(224, 258),label='选取内容标签:',name='staticText',style=2321)
self.编辑框_选取内容soupselect参数 = wx.TextCtrl(self.启动窗口,size=(184, 28),pos=(315, 255),value='',name='text',style=0)
self.标签_目录正则表达式 = wx.StaticText(self.启动窗口,size=(132, 24),pos=(219, 113),label='目录页URL正则表达式:',name='staticText',style=2321)
self.编辑框_目录正则表达式 = wx.TextCtrl(self.启动窗口,size=(452, 28),pos=(360, 108),value='',name='text',style=0)
self.标签_Select标签 = wx.StaticText(self.启动窗口,size=(589, 28),pos=(223, 224),label='内容页BeautifulsoupSelect参数',name='staticText',style=2321)
标签_Select标签_字体 = wx.Font(12,75,90,700,False,'黑体',28)
self.标签_Select标签.SetFont(标签_Select标签_字体)
self.标签_Select标签.SetForegroundColour((0, 128, 255, 255))
self.列表框_日志 = wx.ListBox(self.启动窗口,size=(802, 100),pos=(7, 495),name='listBox',choices=[],style=32)
self.列表框_日志.Bind(wx.EVT_MOUSEWHEEL,self.列表框_日志_鼠标中键滚动)
self.标签_文件标题soupselect参数 = wx.StaticText(self.启动窗口,size=(84, 24),pos=(226, 328),label='文件标题标签:',name='staticText',style=2321)
self.编辑框_文件标题soupselect参数 = wx.TextCtrl(self.启动窗口,size=(182, 31),pos=(315, 326),value='',name='text',style=0)
self.标签_图片标识soupselect参数 = wx.StaticText(self.启动窗口,size=(89, 22),pos=(223, 291),label='图片标识标签:',name='staticText',style=2321)
self.编辑框_图片标识soupselect参数 = wx.TextCtrl(self.启动窗口,size=(183, 29),pos=(315, 290),value='',name='text',style=0)
self.标签_图片urlsoupselect参数 = wx.StaticText(self.启动窗口,size=(87, 24),pos=(512, 296),label='图片URL标签:',name='staticText',style=2321)
self.编辑框_图片urlsoupselect参数 = wx.TextCtrl(self.启动窗口,size=(202, 29),pos=(605, 292),value='',name='text',style=0)
self.标签_生成文件路径 = wx.StaticText(self.启动窗口,size=(90, 21),pos=(509, 261),label='生成文件路径:',name='staticText',style=2321)
self.编辑框_生成文件路径 = wx.TextCtrl(self.启动窗口,size=(162, 30),pos=(605, 256),value='',name='text',style=0)
self.按钮_浏览 = wx.Button(self.启动窗口,size=(40, 29),pos=(770, 255),label='浏览',name='button')
self.按钮_浏览.Bind(wx.EVT_BUTTON,self.按钮_浏览_按钮被单击)
self.多选框_是否插入文档标题 = wx.CheckBox(self.启动窗口,size=(119, 21),pos=(223, 395),name='check',label='是否插入文档标题',style=16384)
self.多选框_是否插入文档标题.Bind(wx.EVT_CHECKBOX,self.多选框_是否插入文档标题_狀态被改变)
self.多选框_是否删除段首数字 = wx.CheckBox(self.启动窗口,size=(116, 24),pos=(364, 395),name='check',label='是否删除段首数字',style=16384)
self.多选框_是否删除段首数字.Bind(wx.EVT_CHECKBOX,self.多选框_是否删除段首数字_狀态被改变)
self.多选框_是否显示浏览器 = wx.CheckBox(self.启动窗口, size=(123, 24), pos=(506, 395), name='check',
label='是否显示浏览器', style=16384)
self.多选框_是否显示浏览器.Bind(wx.EVT_CHECKBOX, self.多选框_是否显示浏览器_狀态被改变)
self.编辑框_标题固定字符 = wx.TextCtrl(self.启动窗口,size=(202, 29),pos=(605, 329),value='',name='text',style=0)
self.标签_标题固定字符 = wx.StaticText(self.启动窗口,size=(97, 22),pos=(509, 330),label='标题固定字符:',name='staticText',style=2321)
self.按钮_新增 = wx.Button(self.启动窗口,size=(135, 35),pos=(215, 420),label='新增',name='button')
self.按钮_新增.Bind(wx.EVT_BUTTON,self.按钮_新增_按钮被单击)
self.按钮_删除 = wx.Button(self.启动窗口,size=(135, 35),pos=(372, 420),label='删除',name='button')
self.按钮_删除.Bind(wx.EVT_BUTTON,self.按钮_删除_按钮被单击)
self.按钮_保存 = wx.Button(self.启动窗口,size=(135, 35),pos=(520, 420),label='保存',name='button')
self.按钮_保存.Bind(wx.EVT_BUTTON,self.按钮_保存_按钮被单击)
self.按钮_关于软件 = wx.Button(self.启动窗口, size=(135, 35), pos=(670, 420), label='关于软件', name='button')
self.按钮_关于软件.Bind(wx.EVT_BUTTON, self.按钮_关于软件_按钮被单击)
self.按钮_开始爬取 = wx.Button(self.启动窗口,size=(591, 35),pos=(215, 458),label='开始采集',name='button')
self.按钮_开始爬取.Bind(wx.EVT_BUTTON,self.按钮_开始爬取_按钮被单击)
self.标签_URL参数 = wx.StaticText(self.启动窗口,size=(587, 20),pos=(221, 11),label='项目URL参数',name='staticText',style=2304)
标签_URL参数_字体 = wx.Font(12,75,90,700,False,'黑体',28)
self.标签_URL参数.SetFont(标签_URL参数_字体)
self.标签_URL参数.SetForegroundColour((0, 128, 255, 255))
self.超级链接框_正则表达式 = wx.adv.HyperlinkCtrl(self.启动窗口, size=(89, 22), pos=(713, 206), name='hyperlink',
label='正则表达式工具', url='https://c.runoob.com/front-end/854/', style=1)
self.标签_去除内容soupselect参数 = wx.StaticText(self.启动窗口, size=(109, 24), pos=(204, 368), label='去除内容标签列表:', name='staticText',
style=2321)
self.编辑框_去除内容soupselect参数 = wx.TextCtrl(self.启动窗口, size=(265, 27), pos=(315, 366), value='', name='text', style=0)
self.标签_图片水印高度 = wx.StaticText(self.启动窗口, size=(119, 18), pos=(605, 370), label='裁剪图片水印高度:', name='staticText',
style=2321)
self.编辑框_图片水印高度 = wx.TextCtrl(self.启动窗口, size=(65, 30), pos=(741, 364), value='', name='text', style=0)
self.初始化窗口参数()
def 初始化窗口参数(self):
self.Cfg = ConfigParser()
self.Cfg.read(configFile,encoding='gbk')
self.selectParmFile=""
self.selectCfg=ConfigParser()
self.编辑框_生成文件路径.Disable()
self.显示参数列表文件()
def 列表框_参数文件_表项被双击(self,event):
print('列表框_参数文件,表项被双击')
self.selectParmFile=self.列表框_参数文件.GetString(self.列表框_参数文件.Selection)
self.显示配置文件参数(self.selectParmFile)
def 显示配置文件参数(self,inifile):
self.selectCfg.read(iniFilePath+"\\"+inifile)
# WebPageKey="内容页参数" WebUrlKey="URL参数"
self.标签_URL参数.SetLabel('配置文件【'+inifile+'】参数')
self.编辑框_项目名称.SetValue(os.path.splitext(inifile)[0])
self.编辑框_域名.SetValue(str(self.selectCfg[WebUrlKey]['网站URL']).strip())
self.编辑框_入口URL.SetValue(str(self.selectCfg[WebUrlKey]['采集入口URL']).strip())
self.编辑框_变量初值.SetValue(str(self.selectCfg[WebUrlKey]['采集入口URL变量初始值']).strip())
self.编辑框_变量终值.SetValue(str(self.selectCfg[WebUrlKey]['采集入口URL变量终止值']).strip())
self.编辑框_目录正则表达式.SetValue(str(self.selectCfg[WebUrlKey]['目录页URL正则表达式']).strip())
self.编辑框_内容正则表达式.SetValue(str(self.selectCfg[WebUrlKey]['内容页URL正则表达式']).strip())
self.编辑框_下一页XPATH.SetValue(str(self.selectCfg[WebUrlKey]['下一页XPATH']).strip())
self.编辑框_选取内容soupselect参数.SetValue(str(self.selectCfg[WebPageKey]['选取内容soupselect参数']).strip())
self.编辑框_去除内容soupselect参数.SetValue(str(self.selectCfg[WebPageKey]['去除内容soupselect参数']).strip())
self.编辑框_文件标题soupselect参数.SetValue(str(self.selectCfg[WebPageKey]['文件标题soupselect参数']).strip())
self.编辑框_图片标识soupselect参数.SetValue(str(self.selectCfg[WebPageKey]['图片标识soupselect参数']).strip())
self.编辑框_图片urlsoupselect参数.SetValue(str(self.selectCfg[WebPageKey]['图片urlsoupselect参数']).strip())
self.编辑框_标题固定字符.SetValue(str(self.selectCfg[WebPageKey]['标题固定字符']).strip())
self.编辑框_生成文件路径.SetValue(str(self.selectCfg[WebPageKey]['生成文件路径']).strip())
self.编辑框_图片水印高度.SetValue(str(self.selectCfg[WebPageKey]['图片水印高度']).strip())
if str(self.selectCfg[WebPageKey]['是否删除段首数字']).strip() in ('是','y','yes'):
self.多选框_是否删除段首数字.Value=True
else:
self.多选框_是否删除段首数字.Value=False
if str(self.selectCfg[WebPageKey]['是否插入文档标题']).strip() in ('是','y','yes'):
self.多选框_是否插入文档标题.Value=True
else:
self.多选框_是否插入文档标题.Value=False
if str(self.Cfg['浏览器参数']['是否显示浏览器']).strip() in ('是','y','yes'):
self.多选框_是否显示浏览器.Value=True
else:
self.多选框_是否显示浏览器.Value=False
def 列表框_参数文件_鼠标中键滚动(self,event):
pass
def 编辑框_项目名称_内容被改变(self,event):
pass
def 编辑框_项目名称_按下Enter键(self,event):
pass
def 编辑框_变量初值_内容被改变(self,event):
pass
def 编辑框_变量终值_内容被改变(self,event):
pass
def 列表框_日志_鼠标中键滚动(self,event):
pass
def 按钮_浏览_按钮被单击(self,event):
print('按钮_浏览,按钮被单击')
path = wx.DirSelector("选择文件夹路径")
if path == None or len(path) < 3:
self.编辑框_生成文件路径.SetValue('')
return
self.编辑框_生成文件路径.SetValue(path)
def 多选框_是否插入文档标题_狀态被改变(self,event):
print('多选框_是否插入文档标题,狀态被改变')
def 多选框_是否删除段首数字_狀态被改变(self,event):
print('多选框_是否删除段首数字,狀态被改变')
def 按钮_新增_按钮被单击(self,event):
print('按钮_新增,按钮被单击')
newName='新建项目名称.ini'
self.selectParmFile=newName
webspider=TySpider(newName)
self.显示配置文件参数(newName)
def 按钮_删除_按钮被单击(self,event):
print('按钮_删除,按钮被单击')
resp = wx.MessageBox('确实要删除配置文件【{}】?'.format(self.selectParmFile), '删除提示!', wx.OK | wx.CANCEL | wx.ICON_WARNING)
if resp == wx.OK:
os.remove(iniFilePath+'\\'+self.selectParmFile)
self.显示参数列表文件()
def 按钮_保存_按钮被单击(self,event):
newIniFileName=self.编辑框_项目名称.Value
if len(newIniFileName)<1 :
wx.MessageBox("请输入项目名称", caption='错误提示', style=wx.OK, parent=None)
self.编辑框_项目名称.SetFocus()
return
self.selectCfg.set(WebUrlKey, "网站名称", self.编辑框_项目名称.Value)
self.selectCfg.set(WebUrlKey, "网站URL",self.编辑框_域名.Value)
self.selectCfg.set(WebUrlKey, "采集入口URL", self.编辑框_入口URL.Value)
self.selectCfg.set(WebUrlKey, "采集入口URL变量初始值", self.编辑框_变量初值.Value)
self.selectCfg.set(WebUrlKey, "采集入口URL变量终止值", self.编辑框_变量终值.Value)
self.selectCfg.set(WebUrlKey, "目录页URL正则表达式", self.编辑框_目录正则表达式.Value)
self.selectCfg.set(WebUrlKey, "内容页URL正则表达式", self.编辑框_内容正则表达式.Value)
self.selectCfg.set(WebUrlKey, "下一页XPATH", self.编辑框_下一页XPATH.Value)
self.selectCfg.set(WebPageKey, "标题固定字符", self.编辑框_标题固定字符.Value)
self.selectCfg.set(WebPageKey, "选取内容soupselect参数", self.编辑框_选取内容soupselect参数.Value)
self.selectCfg.set(WebPageKey, "去除内容soupselect参数", self.编辑框_去除内容soupselect参数.Value)
self.selectCfg.set(WebPageKey, "文件标题soupselect参数", self.编辑框_文件标题soupselect参数.Value)
self.selectCfg.set(WebPageKey, "图片标识soupselect参数", self.编辑框_图片标识soupselect参数.Value)
self.selectCfg.set(WebPageKey, "图片urlsoupselect参数", self.编辑框_图片urlsoupselect参数.Value)
self.selectCfg.set(WebPageKey, "生成文件路径", self.编辑框_生成文件路径.Value)
self.selectCfg.set(WebPageKey, "图片水印高度", self.编辑框_图片水印高度.Value)
if self.多选框_是否插入文档标题.Value==True:
self.selectCfg.set(WebPageKey, "是否插入文档标题", '是')
else:
self.selectCfg.set(WebPageKey, "是否插入文档标题", '否')
if self.多选框_是否删除段首数字.Value == True:
self.selectCfg.set(WebPageKey, "是否删除段首数字", '是')
else:
self.selectCfg.set(WebPageKey, "是否删除段首数字", '否')
self.selectCfg.write(open(iniFilePath+'\\'+self.selectParmFile, 'w'))
os.rename(iniFilePath+'\\'+self.selectParmFile,iniFilePath+'\\'+newIniFileName+'.ini')
self.selectParmFile=newIniFileName+'.ini'
self.显示参数列表文件()
def 按钮_开始爬取_按钮被单击(self,event):
startStr = "开始采集"
stopStr = "正在根据参数文件【{}】采集...,点击停止采集!".format(self.selectParmFile)
global SpiderState
if self.按钮_开始爬取.LabelText==startStr:
if self.selectParmFile=='':
wx.MessageBox("请先选取采集项目",caption="提示",style=wx.OK)
return
self.按钮_开始爬取.SetLabelText(stopStr)
pool = ThreadPoolExecutor(max_workers=os.cpu_count())
pool.submit(self.spider,self.selectParmFile)
self.按钮_开始爬取.LabelText == startStr
elif self.按钮_开始爬取.LabelText[:4]==stopStr[:4]:
SpiderState = False
self.按钮_开始爬取.SetLabelText(startStr)
def 按钮_关于软件_按钮被单击(self,event):
print('按钮_关于软件,按钮被单击')
aboutWindow.showWindow()
def 多选框_是否显示浏览器_狀态被改变(self,event):
# 往配置文件写入内容
if self.多选框_是否显示浏览器.Value==True:
self.Cfg.set("浏览器参数", "是否显示浏览器", "是")
else:
self.Cfg.set("浏览器参数", "是否显示浏览器", "否")
self.Cfg.write(open(configFile,'w'))
def spider(self,parmIni):
global SpiderState
self.列表框_日志.Clear()
webspider = TySpider(parmIni)
urllist = webspider.getPageUrlList()
msg="[+]共计检索到到{}条非重复URL".format(len(urllist))
self.列表框_日志.Append(msg)
i=1
for url in urllist:
if SpiderState ==True:
msg = "[+]【当前进度{}/{}】,正在采集URL:{}".format(i,len(urllist),url)
self.列表框_日志.Append(msg)
webspider.savePageContentToWord(url)
else:
msg = "[+]采集被终止!本次共计采集{}个文档".format(webspider.docNum)
self.列表框_日志.Append(msg)
del webspider
break
i=i+1
msg="[+]采集完毕!本次共计采集{}个文档".format(webspider.docNum)
del webspider
self.列表框_日志.Append(msg)
self.按钮_开始爬取.LabelText ="开始采集"
def 显示参数列表文件(self):
iniFileList=FC.getExtFileList('ini',iniFilePath)
self.列表框_参数文件.Clear()
if len(iniFileList)<1:return
for itemFile in iniFileList:
self.列表框_参数文件.Append(itemFile)
class myApp(wx.App):
def OnInit(self):
self.frame = Frame()
self.frame.Show(True)
return True
if __name__ == '__main__':
window = myApp()
window.MainLoop()