用python实现网络查重(python爬取网页文字[网页结构不一致;网页编码格式];txt文本分割;chrome驱动;python计算文章余弦相似度)
最近做项目有一个小功能是对用户上传的文章进行简单的网络查重。就是搜索特定主题,用这个关键词去在网上搜索文章再爬取。其中也借鉴了其他大佬的代码和文章,文章中会贴出。自己记录以下,以免日后遗忘。主要分为以下部分:
目录
- chrome驱动安装
- 保存特定主题下搜索出来文章的url
- 根据URL进行网络爬虫爬取文章保存为txt
- 爬取时遇到的问题及解决方案
- 不同网页的网页结构不一致问题
- 不同网页的编码格式不一致问题
- txt文本分割
- 字符串分割
- 余弦相似度查重
chrome驱动安装
要实现自动搜索关键词需要安装chrome或firefox驱动,这里我安装的是chrome驱动,主要参考了这篇文章:chrome驱动安装。这篇文章当中安装地址啥的写的很详细,我就再记录几个需要注意的点:
- 驱动版本要和自己电脑上的谷歌版本要对应,大版本一定要相同,小版本可以不同
- 要将chromedriver.exe放到和当前环境相同的地址下(和python.exe一个路径)
保存特定主题下搜索出来文章的url
这部分代码参考:自动化测试
上述文章讲了一个比较完整的python网络爬虫过程,但是我没跑起来,就只借鉴了自动化测试部分的代码
例如我要搜索爱国主题下的演讲稿
from selenium import webdriver
from bs4 import BeautifulSoup
import timeurl='https://www.baidu.com'
driver=webdriver.Chrome()
driver.get(url)
input=driver.find_element_by_id('kw')
input.send_keys('关于爱国的演讲稿')
search_btn=driver.find_element_by_id('su')
search_btn.click()time.sleep(2)#在此等待 使浏览器解析并渲染到浏览器html=driver.page_source
soup = BeautifulSoup(html, "html.parser")
search_res_list=soup.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_this=driver.current_window_handle#获取当前句柄handle_all=driver.window_handles#获取所有句柄handle_exchange=None#要切换的句柄for handle in handle_all:#不匹配为新句柄if handle != handle_this:#不等于当前句柄就交换handle_exchange = handledriver.switch_to.window(handle_exchange)#切换real_url=driver.current_urlprint(real_url)real_url_list.append(real_url)#存储结果driver.close()driver.switch_to.window(handle_this)
最终返回结果是一个url列表
根据URL进行网络爬虫爬取文章保存为txt
我们获取了url后,就要对这些url进行爬取
from urllib import response
import requests
from bs4 import BeautifulSoup
import datetime
import chardet #字符集检测
import urllib
from urllib.request import urlopen# 根据url获取内容
def get_content(url_list):from urllib import responseimport requestsfrom bs4 import BeautifulSoupimport chardet #字符集检测from urllib.request import urlopenimport re# 存储爬取的文本内容content_list = []for i in range(len(url_list)):try:header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'}url = url_list[i]response = requests.get(url, headers=header)# 判断网页编码格式content = urlopen(url).read()result = chardet.detect(content)response.encoding = result['encoding']print(response.status_code)html = response.textsoup = BeautifulSoup(html,'lxml')data = soup.find_all('p')# 临时存储单个结构temp_list = []for x in data:if len(x.text) == 0:continuetext = x.text# print(text)temp_list.append(text)passcontent_list.append(temp_list)except:# 跳过该url的操作continue# 将列表展开flat_list = [item for sublist in content_list for item in sublist]# 转换为字符串str_content = ''.join(flat_list)# 剔除Unicode分隔符空格符等s = re.sub(r'[\u2002\u3000\n\xa0]+', '', str_content)return s
封装成了一个函数,需要传入的参为url列表。写入方式为追加写,所有url的爬取内容均放在一个文件当中
爬取时遇到的问题及解决方案
不同网页的网页结构不一致问题
刚开始自己只打开了一个网页结构进行查看并编码,但是在输入其他url时就会报错,找不到这个标签之类的,后来发现所有网页的文字段都在<p></p>标签内,所以在解析网页时仅仅
soup.find_all('p')
就可以爬取文字了。
不同网页的编码格式不一致问题
在找到p标签爬取之后发现有不少乱码,肯定是编码格式的问题,所以我就查看了几个网页的编码格式,确实不一样
import chardet
import urllib
from urllib.request import urlopendef automatic_detect(url):content=urlopen(url).read()result=chardet.detect(content)encoding=result['encoding']return encodingfor url in url_list:print(automatic_detect(url))
可以看到编码格式有utf8和GB2312,所以在上面的代码中可以看到多了两行置顶编码格式的代码
content = urlopen(url).read()
result = chardet.detect(content)
response.encoding = result['encoding']
添加之后,爬取的汉字中文均正常,没有乱码问题
txt文本分割
若是保存了一个大的文件。我想把它再分成几个小文件,查重的时候分别匹配查重
这部分代码主要参考python文本分割,自己做了一点微调方便函数的调用
def split_By_size(filename,size=4000):txt_list = []with open(filename,'r', encoding='utf8') as fin:buf = fin.read(size)sub = 1while len(buf)>0:[des_filename, extname] = os.path.splitext(filename)new_filename = des_filename + '_' + str(sub) + extnameprint( '正在生成子文件: %s' %new_filename)txt_list.append(new_filename)with open(new_filename,'w', encoding='utf8') as fout:fout.write(buf)sub = sub + 1buf = fin.read(size) print("ok")return txt_list
传入的参数是文件名或路径,和分割单个文件的大小。最终返回的是一个小文件名字的列表
字符串分割
2023年1月6日修改。我把爬取的内容都放在了一个列表,按照列表的切片操作再进行分割
# content为爬取的内容
# text为之后要查重的文本
length = len(content)
# 存储分割后的结果
split_list = []
start = 0
while start < len(text):split_list.append(text[start:start+length])start += length
余弦相似度查重
爬取了文章那就可以开始匹配查重了
这一部分没有自己的修改,是借鉴了某个大佬的代码,
用python实现网络查重(python爬取网页文字[网页结构不一致;网页编码格式];txt文本分割;chrome驱动;python计算文章余弦相似度)相关推荐
- Python之网络爬虫(selenium爬取动态网页、爬虫案例分析、哈希算法与RSA加密)
文章目录 一.selenium爬取动态网页 二.爬虫案例分析 三.哈希hash算法与RSA加密 一.selenium爬取动态网页 1.动态网页认知 爬虫其实就是在模仿浏览器的行为 应对要多次数据的交互 ...
- 【Python实现网络爬虫】Scrapy爬取网易新闻(仅供学习交流使用!)
目录 1. 新建项目 2. 修改itmes.py文件 3. 定义spider,创建一个爬虫模板 3.1 创建crawl爬虫模板 3.2 补充知识:selectors选择器 3.3. 分析网页内容 主体 ...
- python三国演义人物出场统计_python爬取三国演义文本
1.目标 python爬取三国演义,生成词云.图表 2.码前须知 项目目标:三国人物名称及出现次数-----数据统计分析 提出问题:哪个人物在三国演义中出现的次数最多?,我们希望通过数据分析来获得答案 ...
- python爬取公交车站数据_Python爬虫实例_城市公交网络站点数据的爬取方法
爬取的站点:http://beijing.8684.cn/ (1)环境配置,直接上代码: # -*- coding: utf-8 -*- import requests ##导入requests fr ...
- python 列表查重_用python对excel查重
这篇文章我们来讲一下在网站建设中,用python对excel查重.本文对大家进行网站开发设计工作或者学习都有一定帮助,下面让我们进入正文. 最近媳妇工作上遇到一个重复性劳动,excel表格查重,重复的 ...
- python文件查重并合并_用python对excel查重
最近媳妇工作上遇到一个重复性劳动,excel表格查重,重复的标记起来,问我能不能写个程序让它自动查重标记 必须安排 第一次正儿八经写python,边上网查资料,边写 终于成功了 在此记录一下 首先安装 ...
- [day4]python网络爬虫实战:爬取美女写真图片(Scrapy版)
l> 我的新书<Android App开发入门与实战>已于2020年8月由人民邮电出版社出版,欢迎购买.点击进入详情 文章目录 1.开发环境 2.第三方库 3.Scrapy简介 4. ...
- [day1]python网络爬虫实战:爬取美女写真图片
l> 我的新书<Android App开发入门与实战>已于2020年8月由人民邮电出版社出版,欢迎购买.点击进入详情 文章目录 1.开发环境 2.第三方库 3.实现 1.分析url格 ...
- [day2]python网络爬虫实战:爬取美女写真图片(增强版)
l> 我的新书<Android App开发入门与实战>已于2020年8月由人民邮电出版社出版,欢迎购买.点击进入详情 文章目录 1.开发环境 2.第三方库 3.实现 1.分析url格 ...
最新文章
- 我下载的mysql解压后没有安装_mysql 解压版安装配置方法教程
- OpenCV 仿射变换
- [javaEE] 三层架构案例-用户模块(二)
- Html5元素及基本语法
- 后 BERT 时代的那些 NLP 预训练模型
- 前端学习(2351):text组件的使用
- 可能是全网最全的 Java 日志框架适配、冲突解决方案
- 支持 RISC-V 芯片的 Android 系统来了!
- 使用TinyPng来压缩图片
- graphpad数据小数点_Image J和Graphpad如何对Western Blot条带灰度分析【干货】 | 每日生物评论...
- WEB学习第四天(网页模型
- 程序开发者的10大开源网站
- python3几种常见解压压缩包的方法
- Linux服务器跑机器学习代码报错记录
- The project uses Gradle 4.1 which is incompatible with Java 11 or newer
- java email qq邮箱 与 阿里企业邮箱/个人邮箱
- ZYNQ学习笔记(五)---按键控制LED灯亮灭实验
- 软件测试项目管理系统系统描述
- jquery控制元素的隐藏和显示的几种方法。
- 多功能在线起名取名查重工具微信小程序源码 可开流量主 带安装教程