当前位置: 首页 > news >正文

只做PC版网站互联网行业信息网站

只做PC版网站,互联网行业信息网站,开发大型网站,建站公司联系电话前言 文章抄袭在互联网中普遍存在#xff0c;很多博主都收受其烦。近几年随着互联网的发展#xff0c;抄袭等不道德行为在互联网上愈演愈烈#xff0c;甚至复制、黏贴后发布标原创屡见不鲜#xff0c;部分抄袭后的文章甚至标记了一些联系方式从而使读者获取源码等资料。这…前言 文章抄袭在互联网中普遍存在很多博主都收受其烦。近几年随着互联网的发展抄袭等不道德行为在互联网上愈演愈烈甚至复制、黏贴后发布标原创屡见不鲜部分抄袭后的文章甚至标记了一些联系方式从而使读者获取源码等资料。这种恶劣的行为使人愤慨。 本文使用搜索引擎结果作为文章库再与本地或互联网上数据做相似度对比实现文章查重由于查重的实现过程与一般情况下的微博情感分析实现流程相似从而轻易的扩展出情感分析功能下一篇将在此篇代码的基础上完成数据采集、清洗到情感分析的整个过程。 由于近期时间上并不充裕暂时实现了主要功能细节上并没有进行优化但是在代码结构上进行了一些简要的设计使得之后的功能扩展、升级更为简便。我本人也将会持续更新该工具的功能争取让这个工具在技术上更加的成熟、实用。 技术 本文实现的查重功能为了考虑适配大多数站点从而使用selenium用作数据获取配置不同搜索引擎的信息实现较为通用的搜索引擎查询并且不需要考虑过多的动态数据抓取分词主要使用jieba库完成对中文语句的分词使用余弦相似度完成文本相似度的对比并导出对比数据至Excel文章留作举报信息。 微博情感分析基于sklearn使用朴素贝叶斯完成对数据的情感分析在数据抓取上实现流程与文本查重的功能类似。 测试代码获取 CSDN codechina 代码仓库https://codechina.csdn.net/A757291228/s-analysetooldemo 环境 作者的环境说明如下 操作系统Windows7 SP1 64python 版本3.7.7浏览器谷歌浏览器浏览器版本 80.0.3987 (64 位) 如有错误欢迎指出欢迎留言交流。 一、实现文本查重 1.1 selenium安装配置 由于使用的selenium在使用前需要确保读者是否已安装selenium使用pip命令安装如下 pip install selenium安装完成 Selenium 还需要下载一个驱动。 谷歌浏览器驱动驱动版本需要对应浏览器版本不同的浏览器使用对应不同版本的驱动点击下载如果是使用火狐浏览器查看火狐浏览器版本点击 GitHub火狐驱动下载地址 下载英文不好的同学右键一键翻译即可每个版本都有对应浏览器版本的使用说明看清楚下载即可 安装了selenium后新建一python文件名为selenium_search先在代码中引入 from selenium import webdriver可能有些读者没有把驱动配置到环境中接下来我们可以指定驱动的位置博主已配置到环境中 driver webdriver.Chrome(executable_pathrF:\python\dr\chromedriver_win32\chromedriver.exe)新建一个变量url赋值为百度首页链接使用get方法传入url地址尝试打开百度首页完整代码如下 from selenium import webdriverurlhttps://www.baidu.com driverwebdriver.Chrome() driver.get(url)在小黑框中使用命令行运行python文件windows下 运行脚本后将会打开谷歌浏览器并跳转至百度首页 这样就成功使用selenium打开了指定网址接下来将指定搜索关键词查询得到结果再从结果中遍历到相似数据。 1.2 selenium百度搜索引擎关键词搜索 在自动操控浏览器进行关键字键入到搜索框前需要获取搜索框元素对象。使用谷歌浏览器打开百度首页右键搜索框选择查看将会弹出网页元素代码查看视窗找到搜索框元素使用鼠标在元素节点中移动鼠标当前位置的元素节点将会对应的在网页中标蓝 在html代码中id的值大多数情况下唯一除非是打错了在此选择id作为获取搜索框元素对象的标记。selenium提供了find_element_by_id方法可以通过传入id获取到网页元素对象。 inputdriver.find_element_by_id(kw)获取元素对象后使用send_keys方法可传入需要键入的值 input.send_keys(php基础教程 第十一步 面向对象)在此我传入了 “php基础教程 第十一步 面向对象”作为关键字作为搜索。运行脚本查看是否在搜索框中键入了关键字。代码如下 input.send_keys(php基础教程 第十一步 面向对象)成功打开浏览器并键入了搜索关键字 现在还差点击“百度一下”按钮完成最终的搜索。使用与查看搜索框相同的元素查看方法查找“百度一下”按钮的id值 使用find_element_by_id方法获取到该元素对象随后使用click方法使该按钮完成点击操作 search_btndriver.find_element_by_id(su) search_btn.click()完整代码如下 from selenium import webdriverurlhttps://www.baidu.com driverwebdriver.Chrome() driver.get(url) inputdriver.find_element_by_id(kw) input.send_keys(php基础教程 第十一步 面向对象) search_btndriver.find_element_by_id(su) search_btn.click()浏览器自动完成了键入搜索关键字及搜索功能 1.3 搜索结果遍历 当前已在浏览器中得到了搜索结果接下来需要获取整个web页面内容得到搜索结果。使用selenium并不能很方便的获取到在这里使用BeautifulSoup对整个web页面进行解析并获取搜索结果。 BeautifulSoup是一个HTML/XML解析器使用BeautifulSoup会极大的方便我们对整个html的信息获取。 使用BeautifulSoup前需确保已安装。安装命令如下 pip install BeautifulSoup安装后在当前python文件头部引入 from bs4 import BeautifulSoup获取html文本可以调用page_source即可 htmldriver.page_source得到了html代码后新建BeautifulSoup对象传入html内容并且指定解析器这里指定使用 html.parser 解析器 soup BeautifulSoup(html, html.parser)接下来查看搜索内容发现所有的结果都由一个h标签包含并且class为t BeautifulSoup提供了select方法对标签进行获取支持通过类名、标签名、id、属性、组合查找等。我们发现百度搜索结果中结果皆有一个class “t”此时可以通过类名进行遍历获取最为简便 search_res_listsoup.select(.t)在select方法中传入类名t在类名前加上一个点.表示是通过类名获取元素。 完成这一步后可以添加print尝试打印出结果 print(search_res_list)一般情况下可能输出search_res_list为空列表这是因为我们在浏览器解析数据渲染到浏览器前已经获取了浏览器当前页的内容这时有一个简单的方法可以解决这个问题但是此方法效率却不高在此只是暂时使用之后将会用其它效率高于此方法的代码替换使用time需要在头部引入 time.sleep(2)完整代码如下 from selenium import webdriver from bs4 import BeautifulSoup import timeurlhttps://www.baidu.com driverwebdriver.Chrome() driver.get(url) inputdriver.find_element_by_id(kw) input.send_keys(php基础教程 第十一步 面向对象) search_btndriver.find_element_by_id(su) search_btn.click()time.sleep(2)#在此等待 使浏览器解析并渲染到浏览器htmldriver.page_source #获取网页内容 soup BeautifulSoup(html, html.parser) search_res_listsoup.select(.t) print(search_res_list)运行程序将会输出内容 获取到的结果为所有class为t的标签包括该标签的子节点并且使用点.运算发可以获取子节点元素。通过浏览器得到的搜索内容皆为链接点击可跳转那么只需要获取每一个元素下的a标签即可 for el in search_res_list:print(el.a)从结果中很明显的看出搜索结果的a标签已经获取那么接下来我们需要的是提取每个a标签内的href超链接。获取href超链接直接使用列表获取元素的方式获取即可 for el in search_res_list:print(el.a[href])运行脚本成功得到结果 细心的读者可能会发现这些获取到的结果中都是baidu的网址。其实这些网址可以说是“索引”通过这些索引再次跳转到真实网址。由于这些“索引”不一定会变动并不利于长期存储在此还是需要获取到真实的链接。 我们调用js脚本对这些网址进行访问这些网址将会跳转到真实网址跳转后再获取当前的网址信息即可。调用execute_script方法可执行js代码代码如下 for el in search_res_list:js window.open(el.a[href])driver.execute_script(js)打开新的网页后需要获取新网页的句柄否则无法操控新网页。获取句柄的方法如下 handle_thisdriver.current_window_handle#获取当前句柄 handle_alldriver.window_handles#获取所有句柄获取句柄后需要把当前操作的对象切换成新的页面。由于打开一个页面后所有页面只有2个简单的使用遍历做一个替换 handle_exchangeNone#要切换的句柄 for handle in handle_all:#不匹配为新句柄if handle ! handle_this:#不等于当前句柄就交换handle_exchange handle driver.switch_to.window(handle_exchange)#切换切换后操作对象为当前刚打开的页面。通过current_url属性拿到新页面的url real_urldriver.current_url print(real_url)随后关闭当前页面把操作对象置为初始页面 driver.close() driver.switch_to.window(handle_this)#换回最初始界面运行脚本成功获取到真实url 最后在获取到真实url后使用一个列表将结果存储 real_url_list.append(real_url)这一部分完整代码如下 from selenium import webdriver from bs4 import BeautifulSoup import timeurlhttps://www.baidu.com driverwebdriver.Chrome() driver.get(url) inputdriver.find_element_by_id(kw) input.send_keys(php基础教程 第十一步 面向对象) search_btndriver.find_element_by_id(su) search_btn.click()time.sleep(2)#在此等待 使浏览器解析并渲染到浏览器htmldriver.page_source soup BeautifulSoup(html, html.parser) search_res_listsoup.select(.t)real_url_list[] # print(search_res_list) for el in search_res_list:js window.open(el.a[href])driver.execute_script(js)handle_thisdriver.current_window_handle#获取当前句柄handle_alldriver.window_handles#获取所有句柄handle_exchangeNone#要切换的句柄for handle in handle_all:#不匹配为新句柄if handle ! handle_this:#不等于当前句柄就交换handle_exchange handledriver.switch_to.window(handle_exchange)#切换real_urldriver.current_urlprint(real_url)real_url_list.append(real_url)#存储结果driver.close()driver.switch_to.window(handle_this)1.4 获取源文本 在当前文件的目录下新建一个文件夹命名为textsrc在该目录下创建一个txt文件把需要对比的文本存放至该文本中。在此我存放的内容为文章“php基础教程 第十一步 面向对象”的内容。 在代码中编写一个函数为获取文本内容 def read_txt(path):f open(path,r)return f.read() srcread_txt(rF:\tool\textsrc\src.txt)为了方便测试这里使用是绝对路径。 获取到文本内容后编写余弦相似度的对比方法。 1.5 余弦相似度 相似度计算参考文章《python实现余弦相似度文本比较》本人修改一部分从而实现。 本文相似度对比使用余弦相似度算法一般步骤分为分词-向量计算-计算相似度。 新建一个python文件名为Analyse。新建一个类名为Analyse在类中添加分词方法并在头部引入jieba分词库以及collections统计次数 from jieba import lcut import jieba.analyse import collectionsCount方法 #分词 def Count(self,text):tag jieba.analyse.textrank(text,topK20)word_counts collections.Counter(tag) #计数统计return word_countsCount方法接收一个text变量text变量为文本使用textrank方法分词并且使用Counter计数。 随后添加MergeWord方法使词合并方便之后的向量计算 #词合并 def MergeWord(self,T1,T2):MergeWord []for i in T1:MergeWord.append(i)for i in T2:if i not in MergeWord:MergeWord.append(i)return MergeWord合并方法很简单不再做解释。接下来添加向量计算方法 # 得出文档向量 def CalVector(self,T1,MergeWord):TF1 [0] * len(MergeWord)for ch in T1:TermFrequence T1[ch]word chif word in MergeWord:TF1[MergeWord.index(word)] TermFrequencereturn TF1最后添加相似度计算方法 def cosine_similarity(self,vector1, vector2):dot_product 0.0normA 0.0normB 0.0for a, b in zip(vector1, vector2):#两个向量组合成 [(1, 4), (2, 5), (3, 6)] 最短形式表现dot_product a * b normA a ** 2normB b ** 2if normA 0.0 or normB 0.0:return 0else:return round(dot_product / ((normA**0.5)*(normB**0.5))*100, 2)相似度方法接收两个向量随后计算相似度并返回。为了代码冗余度少在这里先简单的添加一个方法完成计算流程 def get_Tfidf(self,text1,text2):#测试对比本地数据对比搜索引擎方法# self.correlate.word.set_this_url(url)T1 self.Count(text1)T2 self.Count(text2)mergeword self.MergeWord(T1,T2)return self.cosine_similarity(self.CalVector(T1,mergeword),self.CalVector(T2,mergeword))Analyse类的完整代码如下 from jieba import lcut import jieba.analyse import collectionsclass Analyse:def get_Tfidf(self,text1,text2):#测试对比本地数据对比搜索引擎方法# self.correlate.word.set_this_url(url)T1 self.Count(text1)T2 self.Count(text2)mergeword self.MergeWord(T1,T2)return self.cosine_similarity(self.CalVector(T1,mergeword),self.CalVector(T2,mergeword))#分词def Count(self,text):tag jieba.analyse.textrank(text,topK20)word_counts collections.Counter(tag) #计数统计return word_counts#词合并def MergeWord(self,T1,T2):MergeWord []for i in T1:MergeWord.append(i)for i in T2:if i not in MergeWord:MergeWord.append(i)return MergeWord# 得出文档向量def CalVector(self,T1,MergeWord):TF1 [0] * len(MergeWord)for ch in T1:TermFrequence T1[ch]word chif word in MergeWord:TF1[MergeWord.index(word)] TermFrequencereturn TF1#计算 TF-IDFdef cosine_similarity(self,vector1, vector2):dot_product 0.0normA 0.0normB 0.0for a, b in zip(vector1, vector2):#两个向量组合成 [(1, 4), (2, 5), (3, 6)] 最短形式表现dot_product a * b normA a ** 2normB b ** 2if normA 0.0 or normB 0.0:return 0else:return round(dot_product / ((normA**0.5)*(normB**0.5))*100, 2) 1.6 搜索结果内容与文本做相似度对比 在selenium_search文件中引入Analyse并且新建对象 from Analyse import Analyse AnalyseAnalyse()在遍历搜索结果中添加获取新打开后的页面的网页内容 time.sleep(5) html_2driver.page_source使用 time.sleep(5)是为了等待浏览器能够有时间渲染当前web内容。获取到新打开的页面内容后进行相似度对比 Analyse.get_Tfidf(src,html_2)由于返回的是一个值使用print输出 print(相似度,Analyse.get_Tfidf(src,html_2))完整代码如下 from selenium import webdriver from bs4 import BeautifulSoup import time from Analyse import Analysedef read_txt(path):f open(path,r)return f.read()#获取对比文件 srcread_txt(rF:\tool\textsrc\src.txt) AnalyseAnalyse()urlhttps://www.baidu.com driverwebdriver.Chrome() driver.get(url) inputdriver.find_element_by_id(kw) input.send_keys(php基础教程 第十一步 面向对象) search_btndriver.find_element_by_id(su) search_btn.click()time.sleep(2)#在此等待 使浏览器解析并渲染到浏览器htmldriver.page_source soup BeautifulSoup(html, html.parser) search_res_listsoup.select(.t)real_url_list[] # print(search_res_list) for el in search_res_list:js window.open(el.a[href])driver.execute_script(js)handle_thisdriver.current_window_handle#获取当前句柄handle_alldriver.window_handles#获取所有句柄handle_exchangeNone#要切换的句柄for handle in handle_all:#不匹配为新句柄if handle ! handle_this:#不等于当前句柄就交换handle_exchange handledriver.switch_to.window(handle_exchange)#切换real_urldriver.current_urltime.sleep(5)html_2driver.page_sourceprint(相似度,Analyse.get_Tfidf(src,html_2))print(real_url)real_url_list.append(real_url)driver.close()driver.switch_to.window(handle_this)运行脚本 结果显示有几个高度相似的链接那么这几个就是疑似抄袭的文章了。 以上是完成基本查重的代码但是相对于说代码比较冗余、杂乱接下来我们优化一下代码。 二、代码优化 通过以上的程序编程简要步骤可以分为获取搜索内容-获取结果-计算相似度。我们可以新建三个类分别为Browser、Analyse已新建、SearchEngine。 Browser用于搜索、数据获取等Analyse用于相似度分析、向量计算等SearchEngine用于不同搜索引擎的基本配置因为大部分搜多引擎的搜索方式较为一致。 2.1Browser 类 初始化 新建一个python文件名为Browser添加初始化方法 def __init__(self,conf):self.browserwebdriver.Chrome()self.confconfself.engine_confEngineConfManage().get_Engine_conf(conf[engine]).get_conf()self.browserwebdriver.Chrome()为新建一个浏览器对象conf为传入的搜索配置之后进行搜索内容由编写配置字典实现self.engine_confEngineConfManage().get_Engine_conf(conf[engine]).get_conf()为获取搜索引擎的配置不同搜索引擎的输入框、搜索按键不一致通过不同的配置信息实现多搜索引擎搜索。 添加搜索方法 #搜索内容写入到搜素引擎中def send_keyword(self):input self.browser.find_element_by_id(self.engine_conf[searchTextID])input.send_keys(self.conf[kw])以上方法中self.engine_conf[searchTextID]与self.conf[kw]通过初始化方法得到对应的搜索引擎配置信息直接获取信息得到元素。 点击搜索 #搜索框点击def click_search_btn(self):search_btn self.browser.find_element_by_id(self.engine_conf[searchBtnID])search_btn.click()通过使用self.engine_conf[searchBtnID]获取搜索按钮的id。 获取搜索结果与文本 #获取搜索结果与文本def get_search_res_url(self):res_link{}WebDriverWait(self.browser,timeout30,poll_frequency1).until(EC.presence_of_element_located((By.ID, page)))#内容通过 BeautifulSoup 解析contentself.browser.page_sourcesoup BeautifulSoup(content, html.parser)search_res_listsoup.select(.self.engine_conf[searchContentHref_class])for el in search_res_list:js window.open(el.a[href])self.browser.execute_script(js)handle_thisself.browser.current_window_handle #获取当前句柄handle_allself.browser.window_handles #获取所有句柄handle_exchangeNone #要切换的句柄for handle in handle_all: #不匹配为新句柄if handle ! handle_this: #不等于当前句柄就交换handle_exchange handleself.browser.switch_to.window(handle_exchange) #切换real_urlself.browser.current_urltime.sleep(1)res_link[real_url]self.browser.page_source #结果获取self.browser.close()self.browser.switch_to.window(handle_this)return res_link以上方法跟之前编写的遍历搜索结果内容相似从中添加了WebDriverWait(self.browser,timeout30,poll_frequency1).until(EC.presence_of_element_located((By.ID, page)))替代了sleep用于判断EC.presence_of_element_located((By.ID, page))是否找到id值为page的网页元素id为page的网页元素为分页按钮的标签id如果未获取表示当前web页并未加载完全等待时间为timeout3030秒如果已过去则跳过等待。 以上代码中并不做相似度对比而是通过 res_link[real_url]self.browser.page_source 将内容与url存入字典随后返回之后再做相似度对比这样编写利于之后的功能扩展。 打开目标搜索引擎进行搜索 #打开目标搜索引擎进行搜索def search(self):self.browser.get(self.engine_conf[website]) #打开搜索引擎站点self.send_keyword() #输入搜索kwself.click_search_btn() #点击搜索return self.get_search_res_url() #获取web页搜索数据最后添加一个search方法直接调用search方法即可实现之前的所有操作不用暴露过多简化使用。 完整代码如下 from selenium import webdriver from bs4 import BeautifulSoup from SearchEngine import EngineConfManage from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By import timeclass Browser:def __init__(self,conf):self.browserwebdriver.Chrome()self.confconfself.engine_confEngineConfManage().get_Engine_conf(conf[engine]).get_conf()#搜索内容写入到搜素引擎中def send_keyword(self):input self.browser.find_element_by_id(self.engine_conf[searchTextID])input.send_keys(self.conf[kw])#搜索框点击def click_search_btn(self):search_btn self.browser.find_element_by_id(self.engine_conf[searchBtnID])search_btn.click()#获取搜索结果与文本def get_search_res_url(self):res_link{}WebDriverWait(self.browser,timeout30,poll_frequency1).until(EC.presence_of_element_located((By.ID, page)))#内容通过 BeautifulSoup 解析contentself.browser.page_sourcesoup BeautifulSoup(content, html.parser)search_res_listsoup.select(.self.engine_conf[searchContentHref_class])for el in search_res_list:js window.open(el.a[href])self.browser.execute_script(js)handle_thisself.browser.current_window_handle #获取当前句柄handle_allself.browser.window_handles #获取所有句柄handle_exchangeNone #要切换的句柄for handle in handle_all: #不匹配为新句柄if handle ! handle_this: #不等于当前句柄就交换handle_exchange handleself.browser.switch_to.window(handle_exchange) #切换real_urlself.browser.current_urltime.sleep(1)res_link[real_url]self.browser.page_source #结果获取self.browser.close()self.browser.switch_to.window(handle_this)return res_link#打开目标搜索引擎进行搜索def search(self):self.browser.get(self.engine_conf[website]) #打开搜索引擎站点self.send_keyword() #输入搜索kwself.click_search_btn() #点击搜索return self.get_search_res_url() #获取web页搜索数据2.2SearchEngine 类 SearchEngine类主要用于不同搜索引擎的配置编写。更加简便的实现搜索引擎或相似业务的扩展。 #搜索引擎配置 class EngineConfManage:def get_Engine_conf(self,engine_name):if engine_namebaidu:return BaiduEngineConf()elif engine_nameqihu360:return Qihu360EngineConf()elif engine_namesougou:return SougouEngineConf()class EngineConf:def __init__(self):self.engineConf{}def get_conf(self):return self.engineConfclass BaiduEngineConf(EngineConf):engineConf{}def __init__(self):self.engineConf[searchTextID]kwself.engineConf[searchBtnID]suself.engineConf[nextPageBtnID_xpath_f]//*[idpage]/div/a[10]self.engineConf[nextPageBtnID_xpath_s]//*[idpage]/div/a[11]self.engineConf[searchContentHref_class]tself.engineConf[website]http://www.baidu.comclass Qihu360EngineConf(EngineConf):def __init__(self):passclass SougouEngineConf(EngineConf):def __init__(self):pass在此只实现了百度搜索引擎的配置编写。所有不同种类的搜索引擎继承EngineConf基类使子类都有了get_conf方法。EngineConfManage类用于不同搜索引擎的调用传入引擎名即可。 2.3如何使用 首先引入两个类 from Browser import Browser from Analyse import Analyse新建一个方法读取本地文件 def read_txt(path):f open(path,r)return f.read()获取文件并新建数据分析类 srcread_txt(rF:\tool\textsrc\src.txt)#获取本地文本 AnalyseAnalyse()配置信息字典编写 #配置信息 conf{kw:php基础教程 第十一步 面向对象,engine:baidu,}新建Browser类并传入配置信息 drvierBrowser(conf)获取搜索结果及内容 url_contentdrvier.search()#获取搜索结果及内容遍历结果及计算相似度 for k in url_content:print(k,相似度,Analyse.get_Tfidf(src,url_content[k]))完整代码如下 from Browser import Browser from Analyse import Analysedef read_txt(path):f open(path,r)return f.read()srcread_txt(rF:\tool\textsrc\src.txt)#获取本地文本 AnalyseAnalyse()#配置信息 conf{kw:php基础教程 第十一步 面向对象,engine:baidu,}drvierBrowser(conf) url_contentdrvier.search()#获取搜索结果及内容 for k in url_content:print(k,相似度,Analyse.get_Tfidf(src,url_content[k]))是不是感觉舒服多了简直不要太清爽。你以为这就完了吗还没完接下来扩展一下功能。 三、功能扩展 暂时这个小工具的功能只有查重这个基础功能并且这个存在很多问题。如没有白名单过滤、只能查一篇文章的相似度、如果比较懒也没有直接获取文章列表自动查重的功能以及结果导出等。接下来慢慢完善部分功能由于篇幅关系并不完全把的功能实现在此列出之后将会持续更新。 3.1自动获取文本 新建一个python文件名为FileHandle。该类用于自动获取指定目录下txt文件txt文件文件名为关键字内容为该名称的文章内容。类代码如下 import osclass FileHandle:#获取文件内容def get_content(self,path):f open(path,r) #设置文件对象content f.read() #将txt文件的所有内容读入到字符串str中f.close() #将文件关闭return content#获取文件内容def get_text(self):file_pathos.path.dirname(__file__) #当前文件所在目录txt_pathfile_pathr\textsrc #txt目录rootdiros.path.join(txt_path) #目标目录内容local_text{}# 读txt 文件for (dirpath,dirnames,filenames) in os.walk(rootdir):for filename in filenames:if os.path.splitext(filename)[1].txt:flag_file_pathdirpath\\filename #文件路径flag_file_contentself.get_content(flag_file_path) #读文件路径if flag_file_content!:local_text[filename.replace(.txt, )]flag_file_content #键值对内容return local_text其中有两个方法get_content与get_text。get_text为获取目录下所有txt文件路径通过get_content获取到详细文本内容返回local_textlocal_text键为文件名值为文本内容。 3.2BrowserManage类 在Browser类文件中添加一个BrowserManage类继承于Browser添加方法 #打开目标搜索引擎进行搜索def search(self):self.browser.get(self.engine_conf[website]) #打开搜索引擎站点self.send_keyword() #输入搜索kwself.click_search_btn() #点击搜索return self.get_search_res_url() #获取web页搜索数据添加该类使Browser类的逻辑与其它方法分开便于扩展。 3.3Browser类的扩展 在Browser类中添加下一页方法使搜索内容时能够获取更多内容并且可指定获取结果条数 #下一页def click_next_page(self,md5):WebDriverWait(self.browser,timeout30,poll_frequency1).until(EC.presence_of_element_located((By.ID, page)))#百度搜索引擎翻页后下一页按钮 xpath 不一致 默认非第一页xpathtry:next_page_btn self.browser.find_element_by_xpath(self.engine_conf[nextPageBtnID_xpath_s])except:next_page_btn self.browser.find_element_by_xpath(self.engine_conf[nextPageBtnID_xpath_f])next_page_btn.click()#md5 进行 webpag text 对比判断是否已翻页 暂时使用存在bugi0while md5hashlib.md5(self.browser.page_source.encode(encodingUTF-8)).hexdigest():#md5 对比time.sleep(0.3)#防止一些错误暂时使用强制停止保持一些稳定i1if i100:return Falsereturn True百度搜索引擎翻页后下一页按钮 xpath 不一致 默认非第一页xpath出现异常使用另外一个xpath。随后对页面进行md5对比md5值如果当前页面没有刷新md5值将不会改变等待小短时间之后点击下一页。 3.4get_search_res_url方法的修改 get_search_res_url方法的修改了部分内容添加了增加结果条数指定、下一页内容获取以及白名单设置更改过后的代码如下 #获取搜索结果与文本def get_search_res_url(self):res_link{}WebDriverWait(self.browser,timeout30,poll_frequency1).until(EC.presence_of_element_located((By.ID, page)))#内容通过 BeautifulSoup 解析contentself.browser.page_sourcesoup BeautifulSoup(content, html.parser)search_res_listsoup.select(.self.engine_conf[searchContentHref_class])while len(res_link)self.conf[target_page]:for el in search_res_list:js window.open(el.a[href])self.browser.execute_script(js)handle_thisself.browser.current_window_handle #获取当前句柄handle_allself.browser.window_handles #获取所有句柄handle_exchangeNone #要切换的句柄for handle in handle_all: #不匹配为新句柄if handle ! handle_this: #不等于当前句柄就交换handle_exchange handleself.browser.switch_to.window(handle_exchange) #切换real_urlself.browser.current_urlif real_url in self.conf[white_list]: #白名单continuetime.sleep(1)res_link[real_url]self.browser.page_source #结果获取self.browser.close()self.browser.switch_to.window(handle_this)content_md5hashlib.md5(self.browser.page_source.encode(encodingUTF-8)).hexdigest() #md5对比self.click_next_page(content_md5)return res_linkwhile len(res_link)self.conf[target_page]:为增加了对结果条数的判断。 content_md5hashlib.md5(self.browser.page_source.encode(encodingUTF-8)).hexdigest() #md5对比 self.click_next_page(content_md5)以上代码增加了当前页面刷新后的md5值判断不一致则进行跳转。 if real_url in self.conf[white_list]: #白名单continue以上代码对白名单进行了判断自己设置的白名单不加入到条数。 3.5新建Manage类 新建一python文件名为Manage再次封装。代码如下 from Browser import BrowserManage from Analyse import Analyse from FileHandle import FileHandleclass Manage:def __init__(self,conf):self.drvierBrowserManage(conf)self.textdicFileHandle().get_text()self.analyseAnalyse()def get_local_analyse(self): resdic{}for k in self.textdic:res{}self.drvier.set_kw(k)url_contentself.drvier.search()#获取搜索结果及内容for k1 in url_content:res[k1]self.analyse.get_Tfidf(self.textdic[k],url_content[k1])resdic[k]resreturn resdic以上代码初始化方法接收一个参数且初始化方法中新建了BrowserManage对象、Analyse对象以及获取了文本内容。 get_local_analyse方法遍历文本使用文件名当作关键字进行搜索并且将搜索内容与当前文本做相似度对比最后返回结果。 结果如下 博主目录下文件如下 相似度分析部分以上为主要内容工具之后将会丢GitHub及csdn的代码仓库中使用的无头模式本篇所讲的内容为一般实现。 所有完整的代码如下 Analyse类 from jieba import lcut import jieba.analyse import collections from FileHandle import FileHandleclass Analyse:def get_Tfidf(self,text1,text2):#测试对比本地数据对比搜索引擎方法# self.correlate.word.set_this_url(url)T1 self.Count(text1)T2 self.Count(text2)mergeword self.MergeWord(T1,T2)return self.cosine_similarity(self.CalVector(T1,mergeword),self.CalVector(T2,mergeword))#分词def Count(self,text):tag jieba.analyse.textrank(text,topK20)word_counts collections.Counter(tag) #计数统计return word_counts#词合并def MergeWord(self,T1,T2):MergeWord []for i in T1:MergeWord.append(i)for i in T2:if i not in MergeWord:MergeWord.append(i)return MergeWord# 得出文档向量def CalVector(self,T1,MergeWord):TF1 [0] * len(MergeWord)for ch in T1:TermFrequence T1[ch]word chif word in MergeWord:TF1[MergeWord.index(word)] TermFrequencereturn TF1#计算 TF-IDFdef cosine_similarity(self,vector1, vector2):dot_product 0.0normA 0.0normB 0.0for a, b in zip(vector1, vector2):#两个向量组合成 [(1, 4), (2, 5), (3, 6)] 最短形式表现dot_product a * b normA a ** 2normB b ** 2if normA 0.0 or normB 0.0:return 0else:return round(dot_product / ((normA**0.5)*(normB**0.5))*100, 2)Browser类 from selenium import webdriver from bs4 import BeautifulSoup from SearchEngine import EngineConfManage from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By import hashlib import time import xlwtclass Browser:def __init__(self,conf):self.browserwebdriver.Chrome()self.confconfself.conf[kw]self.engine_confEngineConfManage().get_Engine_conf(conf[engine]).get_conf()#搜索内容设置def set_kw(self,kw):self.conf[kw]kw#搜索内容写入到搜素引擎中def send_keyword(self):input self.browser.find_element_by_id(self.engine_conf[searchTextID])input.send_keys(self.conf[kw])#搜索框点击def click_search_btn(self):search_btn self.browser.find_element_by_id(self.engine_conf[searchBtnID])search_btn.click()#获取搜索结果与文本def get_search_res_url(self):res_link{}WebDriverWait(self.browser,timeout30,poll_frequency1).until(EC.presence_of_element_located((By.ID, page)))#内容通过 BeautifulSoup 解析contentself.browser.page_sourcesoup BeautifulSoup(content, html.parser)search_res_listsoup.select(.self.engine_conf[searchContentHref_class])while len(res_link)self.conf[target_page]:for el in search_res_list:js window.open(el.a[href])self.browser.execute_script(js)handle_thisself.browser.current_window_handle #获取当前句柄handle_allself.browser.window_handles #获取所有句柄handle_exchangeNone #要切换的句柄for handle in handle_all: #不匹配为新句柄if handle ! handle_this: #不等于当前句柄就交换handle_exchange handleself.browser.switch_to.window(handle_exchange) #切换real_urlself.browser.current_urlif real_url in self.conf[white_list]: #白名单continuetime.sleep(1)res_link[real_url]self.browser.page_source #结果获取self.browser.close()self.browser.switch_to.window(handle_this)content_md5hashlib.md5(self.browser.page_source.encode(encodingUTF-8)).hexdigest() #md5对比self.click_next_page(content_md5)return res_link#下一页def click_next_page(self,md5):WebDriverWait(self.browser,timeout30,poll_frequency1).until(EC.presence_of_element_located((By.ID, page)))#百度搜索引擎翻页后下一页按钮 xpath 不一致 默认非第一页xpathtry:next_page_btn self.browser.find_element_by_xpath(self.engine_conf[nextPageBtnID_xpath_s])except:next_page_btn self.browser.find_element_by_xpath(self.engine_conf[nextPageBtnID_xpath_f])next_page_btn.click()#md5 进行 webpag text 对比判断是否已翻页 暂时使用存在bugi0while md5hashlib.md5(self.browser.page_source.encode(encodingUTF-8)).hexdigest():#md5 对比time.sleep(0.3)#防止一些错误暂时使用强制停止保持一些稳定i1if i100:return Falsereturn True class BrowserManage(Browser): #打开目标搜索引擎进行搜索def search(self):self.browser.get(self.engine_conf[website]) #打开搜索引擎站点self.send_keyword() #输入搜索kwself.click_search_btn() #点击搜索return self.get_search_res_url() #获取web页搜索数据Manage类 from Browser import BrowserManage from Analyse import Analyse from FileHandle import FileHandleclass Manage:def __init__(self,conf):self.drvierBrowserManage(conf)self.textdicFileHandle().get_text()self.analyseAnalyse()def get_local_analyse(self): resdic{}for k in self.textdic:res{}self.drvier.set_kw(k)url_contentself.drvier.search()#获取搜索结果及内容for k1 in url_content:res[k1]self.analyse.get_Tfidf(self.textdic[k],url_content[k1])resdic[k]resreturn resdicFileHandle类 import osclass FileHandle:#获取文件内容def get_content(self,path):f open(path,r) #设置文件对象content f.read() #将txt文件的所有内容读入到字符串str中f.close() #将文件关闭return content#获取文件内容def get_text(self):file_pathos.path.dirname(__file__) #当前文件所在目录txt_pathfile_pathr\textsrc #txt目录rootdiros.path.join(txt_path) #目标目录内容local_text{}# 读txt 文件for (dirpath,dirnames,filenames) in os.walk(rootdir):for filename in filenames:if os.path.splitext(filename)[1].txt:flag_file_pathdirpath\\filename #文件路径flag_file_contentself.get_content(flag_file_path) #读文件路径if flag_file_content!:local_text[filename.replace(.txt, )]flag_file_content #键值对内容return local_text 本文最终使用方法如下 from Manage import Managewhite_list[blog.csdn.net/A757291228,www.cnblogs.com/1-bit,blog.csdn.net/csdnnews]#白名单 #配置信息 conf{engine:baidu,target_page:5white_list:white_list,}print(Manage(conf).get_local_analyse())IT漫画、教程资料、IT文章尽在公众号碧油鸡~ 此文转载请注明原文地址https://blog.csdn.net/A757291228 CSDN:1_bit
http://www.pierceye.com/news/776308/

相关文章:

  • 档案网站建设视频网络软营销的案例
  • 德州市建设局质监站网站织梦做的网站打包在dw修改
  • 做那个男女的视频网站湖南响应式网站公司
  • 1个ip可以做几个网站电商网站建设阿里云
  • 网站做seo需要些什么wordpress虎嗅破解版
  • 网站开发按钮图片素材巩义自助建站优化
  • 石家庄网站建设接单常见的网络直接营销有哪些
  • 上海网站建设技术托管找合伙人做网站
  • 网站和自媒体都可以做东莞专业营销网站建设推广
  • 毕业设计网站怎么做校园网二手书交易网站建设
  • 网站运营托管协议凡科建设网站还用买服务器吗
  • 黑龙江省建设网官方网站erp系统软件免费版
  • 网站建设案例算命网站百度搜索站长平台网站
  • 手机wap网站模板 带后台thefox wordpress
  • 公司网站建设与设计制作游戏网站的设计方案
  • 移动端网站设计规范程序员帮忙做放贷网站
  • 网站到期查询广西建设信息网
  • 服务器可以放几个网站市场调研的五个步骤
  • 网站前置审批h5页面制作软件thinkphp
  • 企业网站设计调查问卷步骤记录器
  • dw里响应式网站怎么做郑州电力高等专科学校学费多少
  • 用app怎么样建网站深圳专业做网站的
  • 怎样做浏览的网站不被发现互联网营销师报考条件
  • 电子商务网站建设与电子支付网站进不去怎么解决
  • 微信网站模板下载电子商务网站建设的四个步骤
  • 网站内如何做论坛建设网站宝安区
  • 公司网站管理制定的作用网站建设设计文档模板
  • 做网站 附加信息全网整合营销公司
  • 做网站都需要用到什么软件每年网站备案抽查
  • 网站如何做电脑和手机软件ps素材网站大全