程序功能为采集网页文本和图片,存储为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=iniFilePathif not os.path.exists(self.iniFilePath):os.makedirs(self.iniFilePath)self.parmFilePath=self.iniFilePath+"\\"+parmPathself.WebUrlKey=WebUrlKeyself.WebPageKey=WebPageKeyself.makeConfile(configFile)self.makeParmFile(self.parmFilePath)self.Cfg = ConfigParser()self.Cfg.read(self.parmFilePath)self.refererUrl = self.Cfg[self.WebUrlKey]['网站URL'] #爬取网站的refererulself.docNum=0self.Web = FC.getWebdriver()web=Nonedef makeConfile(self,file):# 生成配置文件if os.path.exists(file):with open(file, 'r') as f:content = f.readlines()f.close()if len(content) > 0:returnf = 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:returnf = 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'/' + urlelse:url = self.refererUrl + urlreturn url#################################################################################### 根据selenium内容页获取URL列表def getOnePageUrlList(self,webdriver,UrlPattern,prefix):url=webdriver.current_urlhtml = webdriver.page_sourceurls = 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_urlelse:item_url = prefix + item_urlif validators.url(item_url) and item_url not in newurls: newurls.append(item_url)return newurls####################################################################################根据参数配置获取内容页URL列表def getPageUrlList(self):global SpiderStateSpiderState=True#判断入口URL模式pageUrlList=[]constKey=self.WebUrlKeyprefixUrl = self.Cfg[constKey]['网站URL']startUrl = self.Cfg[constKey]['采集入口URL']startNum=0stopNum=0try:startNum=int(self.Cfg[constKey]['采集入口URL变量初始值'].strip())stopNum=int(self.Cfg[constKey]['采集入口URL变量终止值'].strip())except:startNum = 0stopNum = 0nextUrlXpath=self.Cfg[constKey]['下一页XPATH'].strip()cataUrlPattern=self.Cfg[constKey]['目录页URL正则表达式'].strip()pageUrlPattern=self.Cfg[constKey]['内容页URL正则表达式'].strip()url = startUrlweb=self.Webwindow.frame.列表框_日志.Append("[+]请稍后,正在采集内容列表URL.....")if startNum>0 and startNum<=stopNum:for i in range(startNum, stopNum+1):if SpiderState == False: breakif startUrl.find("{}") > 1: url = startUrl.format(str(i))if len(re.findall(pattern=pageUrlPattern, string=url))>=1: #链接为内容页URLpageUrlList.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 + newurlsprint(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=Nonetry:btn = web.find_element_by_xpath(nextUrlXpath)except Exception as e:window.frame.列表框_日志.Append("[+]提示:【下一页XPATH】设置错误,错误信息:"+nextUrlXpath+e.__str__())btn=Nonewhile btn!=None:try:weburl = web.current_urlif len(re.findall(pattern=pageUrlPattern, string=weburl)) >= 1:  # 链接为内容页URLpageUrlList.append(url)pageurls = self.getOnePageUrlList(web, UrlPattern=pageUrlPattern, prefix=prefixUrl)window.frame.列表框_日志.Append("[+]目录页检索【{}】采集到{}条内容页URL。".format(weburl, len(pageurls)))pageUrlList = pageUrlList + pageurlstry:nextUrl=btn.get_attribute("href")except Exception as e:nextUrl=''if nextUrl=='':breaknextUrl=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 = Noneexcept Exception as e:print(e)break# 轮训获取内容页项目pageUrlList = FC.updateUrlList(pageUrlList, prefixUrl)#URL数组去重pageUrlList = list(tuple(pageUrlList))del webreturn  pageUrlList####################################################################################根据参数配置获取内容页URL列表def savePageContentToWord(self,pageUrl):try:web=self.Webweb.get(pageUrl)web.implicitly_wait(3)html=web.page_source  #.encode()soup = BeautifulSoup(html, 'html.parser')parmKey=WebPageKeyselectTag=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,0tmpstr=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.stringpageTitle=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)returnfor (idx,selectHtml) in enumerate(selectHtmlList):fileNumStr=''title=''if idx>0 :fileNumStr=str(idx)element=selectHtml.find(fileTitleTag) # 取得title标签的文字内容if element!=None:title=element.stringfileNametitle=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 = 0for 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.stringscontents=''for itemString in part_strings:itemString=itemString.rstrip()if len(itemString)>1:contents=contents+"\n"+itemStringif str(self.Cfg[WebPageKey]['是否删除段首数字']).lower().strip() in ('是','y','yes'):contents=FC.delStrfirstNum(contents.strip(),delCharList)doc.add_paragraph(contents)# .get_text())  # 向文档里添加文字 pif (i < len(imgtagList)):  # 写完片段后紧接写入位于此处分割的图片imgurl = imgtagList[i].get(imgUrlTag)  # 图片地址一般是srcimgurl=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 + 1if 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+1window.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=Trueelse:self.多选框_是否删除段首数字.Value=Falseif str(self.selectCfg[WebPageKey]['是否插入文档标题']).strip() in ('是','y','yes'):self.多选框_是否插入文档标题.Value=Trueelse:self.多选框_是否插入文档标题.Value=Falseif str(self.Cfg['浏览器参数']['是否显示浏览器']).strip() in ('是','y','yes'):self.多选框_是否显示浏览器.Value=Trueelse:self.多选框_是否显示浏览器.Value=Falsedef 列表框_参数文件_鼠标中键滚动(self,event):passdef 编辑框_项目名称_内容被改变(self,event):passdef 编辑框_项目名称_按下Enter键(self,event):passdef 编辑框_变量初值_内容被改变(self,event):passdef 编辑框_变量终值_内容被改变(self,event):passdef 列表框_日志_鼠标中键滚动(self,event):passdef 按钮_浏览_按钮被单击(self,event):print('按钮_浏览,按钮被单击')path = wx.DirSelector("选择文件夹路径")if path == None or len(path) < 3:self.编辑框_生成文件路径.SetValue('')returnself.编辑框_生成文件路径.SetValue(path)def 多选框_是否插入文档标题_狀态被改变(self,event):print('多选框_是否插入文档标题,狀态被改变')def 多选框_是否删除段首数字_狀态被改变(self,event):print('多选框_是否删除段首数字,狀态被改变')def 按钮_新增_按钮被单击(self,event):print('按钮_新增,按钮被单击')newName='新建项目名称.ini'self.selectParmFile=newNamewebspider=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.编辑框_项目名称.Valueif len(newIniFileName)<1 :wx.MessageBox("请输入项目名称", caption='错误提示', style=wx.OK, parent=None)self.编辑框_项目名称.SetFocus()returnself.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 SpiderStateif self.按钮_开始爬取.LabelText==startStr:if self.selectParmFile=='':wx.MessageBox("请先选取采集项目",caption="提示",style=wx.OK)returnself.按钮_开始爬取.SetLabelText(stopStr)pool = ThreadPoolExecutor(max_workers=os.cpu_count())pool.submit(self.spider,self.selectParmFile)self.按钮_开始爬取.LabelText == startStrelif self.按钮_开始爬取.LabelText[:4]==stopStr[:4]:SpiderState = Falseself.按钮_开始爬取.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 SpiderStateself.列表框_日志.Clear()webspider = TySpider(parmIni)urllist = webspider.getPageUrlList()msg="[+]共计检索到到{}条非重复URL".format(len(urllist))self.列表框_日志.Append(msg)i=1for 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 webspiderbreaki=i+1msg="[+]采集完毕!本次共计采集{}个文档".format(webspider.docNum)del webspiderself.列表框_日志.Append(msg)self.按钮_开始爬取.LabelText ="开始采集"def 显示参数列表文件(self):iniFileList=FC.getExtFileList('ini',iniFilePath)self.列表框_参数文件.Clear()if len(iniFileList)<1:returnfor itemFile in iniFileList:self.列表框_参数文件.Append(itemFile)class myApp(wx.App):def  OnInit(self):self.frame = Frame()self.frame.Show(True)return Trueif __name__ == '__main__':window = myApp()window.MainLoop()

通用爬取文章及图片导出到Word主程序代码相关推荐

  1. 用python爬虫爬取网页壁纸图片(彼岸桌面网唯美图片)

    参考文章:https://www.cnblogs.com/franklv/p/6829387.html 今天想给我的电脑里面多加点壁纸,但是嫌弃一个个保存太慢,于是想着写个爬虫直接批量爬取,因为爬虫只 ...

  2. [day4]python网络爬虫实战:爬取美女写真图片(Scrapy版)

    l> 我的新书<Android App开发入门与实战>已于2020年8月由人民邮电出版社出版,欢迎购买.点击进入详情 文章目录 1.开发环境 2.第三方库 3.Scrapy简介 4. ...

  3. python唯美壁纸_用python爬虫爬取网页壁纸图片(彼岸桌面网唯美图片)

    参考文章:https://www..com/franklv/p/6829387.html 今天想给我的电脑里面多加点壁纸,但是嫌弃一个个保存太慢,于是想着写个爬虫直接批量爬取,因为爬虫只是很久之前学过 ...

  4. python爬取京东手机数据_实例解析Python如何实现爬取京东手机图片

    本文主要为大家分享一篇Python如何实现爬取京东手机图片的方法,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧,希望能帮助到大家. 运行环境Python3.6.4#爬取京东手机图片i ...

  5. 用Python实现爬虫爬取京东笔记本电脑图片

    最近需要从网上搜集一些数据,于是花了几个小时把爬虫学了一下.其实我在两年前的一个简单的站内搜索引擎的实现已经涉及到了简单的爬虫,不过那时候老想着偷懒,加上山大新闻网的设计又很好爬,所以当时写得很low ...

  6. Java爬虫爬取wallhaven的图片

    Java爬虫爬取wallhaven的图片 参考文章:JAVA Jsoup爬取网页图片下载到本地 需要的jar包:jsuop wallhaven网站拒绝java程序访问,所以要伪装报头. 发送请求时 C ...

  7. 想要快速爬取整站图片?速进(附完整代码)

      大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语-不温不火,本意是希望自己性情温和.作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己 ...

  8. Java爬虫-WebMagic爬取博客图片(好色龍的網路觀察日誌)

    WebMagic爬取博客图片 最近在学习java爬虫,接触到WebMagic框架,正好拿我喜爱的博客来练习,希望龙哥(博主)不要责备我~~ 博客链接: 好色龍的網路觀察日誌 ,超级有趣的翻译漫画,持续 ...

  9. Python3爬取Bing每日图片,并设置为电脑桌面

    文章目录 1 - 简述 2 - 核心代码 2.1 - 爬取BingImage 2.2 - 设置为桌面 2.3 - 设置为每日自动执行 3 - 完整代码 4 - 运行结果 作为鄙视链底层的"脚 ...

最新文章

  1. hive sql练习_SQL语句+语法 I 数据分析面试必备
  2. 【SSRS】入门篇(二) -- 建立数据源
  3. 下载安装tomcat6.0
  4. 个人的小项目mysql_mgr_test开放了
  5. Visual Studio中怎样更改Nuget程序包源
  6. spring基础整理
  7. 电脑黑屏故障的解决方案
  8. jdbctemplate调用 mysql存储过程
  9. apache 版本_Apache官宣!ShardingSphere首个Apache版本发布
  10. 时间和日期的JS库Day.js入门教程
  11. 文本分类pytorch Bert fine tune
  12. 高数-极限-求极限值--两个重要极限(以及拓展公式)
  13. TCP协议之《ACK pingpong交互模式详解》
  14. android开发 问卷调查案例_基于Android的问卷调查系统模型分析与设计
  15. Python数据处理基础操作
  16. 语音识别 --- 音频信号提取
  17. 「AI初识境」给深度学习新手做项目的10个建议
  18. Ora-600 ktbdchk1: bad dscn
  19. 生死狙击九天取密(逍遥工作室)
  20. 使用达思SQL数据库修复软件导出数据库时的接收数据的数据库如何清空表数据?...

热门文章

  1. 热门Java开发工具IDEA入门指南——了解并学习IDE
  2. 来了!阿狸16周年生日限定藏品将发布,百“狸”挑一选中你
  3. UI设计师注意,网站头图的10个黄金法则
  4. 老人智能手表方案/案列/APP/小程序/网站
  5. 女生选择了计算机专业能做什么工作?其实有这 5 种,前景很好
  6. 2022年6月护肤行业数据洞察报告(小红书)
  7. IG痛失亚军,含泪夺冠,奖杯是用区块链的技术合成的你知道吗
  8. 细谈围城---我的启示录
  9. [008]菠萝咕老肉的做法(全程图)
  10. 深入理解String、StringBuffer和StringBuilder类的区别