最近做项目有一个小功能是对用户上传的文章进行简单的网络查重。就是搜索特定主题,用这个关键词去在网上搜索文章再爬取。其中也借鉴了其他大佬的代码和文章,文章中会贴出。自己记录以下,以免日后遗忘。主要分为以下部分:

目录

  • chrome驱动安装
  • 保存特定主题下搜索出来文章的url
  • 根据URL进行网络爬虫爬取文章保存为txt
    • 爬取时遇到的问题及解决方案
      • 不同网页的网页结构不一致问题
      • 不同网页的编码格式不一致问题
  • txt文本分割
  • 字符串分割
  • 余弦相似度查重

chrome驱动安装

要实现自动搜索关键词需要安装chrome或firefox驱动,这里我安装的是chrome驱动,主要参考了这篇文章:chrome驱动安装。这篇文章当中安装地址啥的写的很详细,我就再记录几个需要注意的点:

  1. 驱动版本要和自己电脑上的谷歌版本要对应,大版本一定要相同,小版本可以不同
  2. 要将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计算文章余弦相似度)相关推荐

  1. Python之网络爬虫(selenium爬取动态网页、爬虫案例分析、哈希算法与RSA加密)

    文章目录 一.selenium爬取动态网页 二.爬虫案例分析 三.哈希hash算法与RSA加密 一.selenium爬取动态网页 1.动态网页认知 爬虫其实就是在模仿浏览器的行为 应对要多次数据的交互 ...

  2. 【Python实现网络爬虫】Scrapy爬取网易新闻(仅供学习交流使用!)

    目录 1. 新建项目 2. 修改itmes.py文件 3. 定义spider,创建一个爬虫模板 3.1 创建crawl爬虫模板 3.2 补充知识:selectors选择器 3.3. 分析网页内容 主体 ...

  3. python三国演义人物出场统计_python爬取三国演义文本

    1.目标 python爬取三国演义,生成词云.图表 2.码前须知 项目目标:三国人物名称及出现次数-----数据统计分析 提出问题:哪个人物在三国演义中出现的次数最多?,我们希望通过数据分析来获得答案 ...

  4. python爬取公交车站数据_Python爬虫实例_城市公交网络站点数据的爬取方法

    爬取的站点:http://beijing.8684.cn/ (1)环境配置,直接上代码: # -*- coding: utf-8 -*- import requests ##导入requests fr ...

  5. python 列表查重_用python对excel查重

    这篇文章我们来讲一下在网站建设中,用python对excel查重.本文对大家进行网站开发设计工作或者学习都有一定帮助,下面让我们进入正文. 最近媳妇工作上遇到一个重复性劳动,excel表格查重,重复的 ...

  6. python文件查重并合并_用python对excel查重

    最近媳妇工作上遇到一个重复性劳动,excel表格查重,重复的标记起来,问我能不能写个程序让它自动查重标记 必须安排 第一次正儿八经写python,边上网查资料,边写 终于成功了 在此记录一下 首先安装 ...

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

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

  8. [day1]python网络爬虫实战:爬取美女写真图片

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

  9. [day2]python网络爬虫实战:爬取美女写真图片(增强版)

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

最新文章

  1. 我下载的mysql解压后没有安装_mysql 解压版安装配置方法教程
  2. OpenCV 仿射变换
  3. [javaEE] 三层架构案例-用户模块(二)
  4. Html5元素及基本语法
  5. 后 BERT 时代的那些 NLP 预训练模型
  6. 前端学习(2351):text组件的使用
  7. 可能是全网最全的 Java 日志框架适配、冲突解决方案
  8. 支持 RISC-V 芯片的 Android 系统来了!
  9. 使用TinyPng来压缩图片
  10. graphpad数据小数点_Image J和Graphpad如何对Western Blot条带灰度分析【干货】 | 每日生物评论...
  11. WEB学习第四天(网页模型
  12. 程序开发者的10大开源网站
  13. python3几种常见解压压缩包的方法
  14. Linux服务器跑机器学习代码报错记录
  15. The project uses Gradle 4.1 which is incompatible with Java 11 or newer
  16. java email qq邮箱 与 阿里企业邮箱/个人邮箱
  17. ZYNQ学习笔记(五)---按键控制LED灯亮灭实验
  18. 软件测试项目管理系统系统描述
  19. jquery控制元素的隐藏和显示的几种方法。
  20. 多功能在线起名取名查重工具微信小程序源码 可开流量主 带安装教程

热门文章

  1. 【数据结构】二叉查找树(BST)
  2. firefox实用插件推荐(一)
  3. cyber security and phish detection
  4. android 社交类ui设计,社交类APP个人主页UI设计
  5. ADS42LB69使用记录
  6. 随笔录2014.5.17
  7. 基于5G的ATG组网形式及容量研究
  8. VTL虚拟磁带库的性能限制
  9. Kaggle Competition : U.S. Patent Phrase to Phrase Matching
  10. Windows沙箱环境 —— Sandboxie