Java爬爬之网页去重和代理ip

  • 网页去重
    • 去重方案介绍
    • SimHash
      • 流程介绍
    • 签名距离计算
    • 导入simhash的工程
    • 测试simhash
  • 代理的使用
    • 代理服务器
    • 使用代理

网页去重

之前我们对下载的url地址进行了去重操作,避免同样的url下载多次。其实不光url需要去重,我们对下载的内容也需要去重。

在网上我们可以找到许多内容相似的文章。但是实际我们只需要其中一个即可,同样的内容没有必要下载多次,那么如何进行去重就需要进行处理了


去重方案介绍

指纹码对比

最常见的去重方案是生成文档的指纹门。例如对一篇文章进行MD5加密生成一个字符串,我们可以认为这是文章的指纹码,再和其他的文章指纹码对比,一致则说明文章重复。
但是这种方式是完全一致则是重复的,如果文章只是多了几个标点符号,那仍旧被认为是重复的,这种方式并不合理。

BloomFilter

这种方式就是我们之前对url进行去重的方式,使用在这里的话,也是对文章进行计算得到一个数,再进行对比,缺点和方法1是一样的,如果只有一点点不一样,也会认为不重复,这种方式不合理。

KMP算法

KMP算法是一种改进的字符串匹配算法。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。能够找到两个文章有哪些是一样的,哪些不一样。
这种方式能够解决前面两个方式的“只要一点不一样就是不重复”的问题。但是它的时空复杂度太高了,不适合大数据量的重复比对。

还有一些其他的去重方式:最长公共子串、后缀数组、字典树、DFA等等,但是这些方式的空复杂度并不适合数据量较大的工业应用场景。我们需要找到一款性能高速度快,能够进行相似度对比的去重方案

Google 的 simhash 算法产生的签名,可以满足上述要求。这个算法并不深奥,比较容易理解。这种算法也是目前Google搜索引擎所目前所使用的网页去重算法。


SimHash

流程介绍

simhash是由 Charikar 在2002年提出来的,为了便于理解尽量不使用数学公式,分为这几步:

  • 1、分词,把需要判断文本分词形成这个文章的特征单词。
  • 2、hash,通过hash算法把每个词变成hash值,比如“美国”通过hash算法计算为100101,“51区”通过hash算法计算为 101011。这样我们的字符串就变成了一串串数字。
  • 3、加权,通过2步骤的hash生成结果,需要按照单词的权重形成加权数字串,“美国”的hash值为“100101”,通过加权计算为“4 -4 -44 -4 4” “51区”计算为 “ 5 -5 5 -5 5 5”。
  • 4、合并,把上面各个单词算出来的序列值累加,变成只有一个序列串。 “美国”的 “4 -4 -4 4 -4 4”,“51区”的 “
    5 -5 5 -5 5 5”,把每一位进行累加, “4+5 -4±5 -4+5 4±5 -4+5 4+5”“9 -9 1 -1 1 9”
  • 5、降维,把算出来的 “9 -9 1 -1 1 9”变成 0 1 串,形成最终的simhash签名。


签名距离计算

我们把库里的文本都转换为simhash签名,并转换为long类型存储,空间大大减少。现在我们虽然解决了空间,但是如何计算两个simhash的相似度呢?

我们通过海明距离(Hamming distance)就可以计算出两个simhash到底相似不相似。两个simhash对应二进制(01串)取值不同的数量称为这两个simhash的海明距离。

举例如下: 10101 和 00110 从第一位开始依次有第一位、第四、第五位不同,则海明距离为3。对于二进制字符串的a和b,海明距离为等于在a XOR b运算结果中1的个数(普遍算法)。


导入simhash的工程

参考项目:https://github.com/CreekLou/simhash.git

导入工程simhash,并打开测试用例。


测试simhash

@Component
public class TaskTest {@Scheduled(cron = "0/5 * * * * *")public void test() {System.out.println(LocalDateTime.now()+"任务执行了");String str1 = readAllFile("D:/test/testin.txt");SimHasher hash1 = new SimHasher(str1);//打印simhash签名System.out.println(hash1.getSignature());System.out.println("============================");String str2 = readAllFile("D:/test/testin2.txt");//打印simhash签名SimHasher hash2 = new SimHasher(str2);System.out.println(hash2.getSignature());System.out.println("============================");//打印海明距离        System.out.println(hash1.getHammingDistance(hash2.getSignature()));}public static String readAllFile(String filename) {String everything = "";try {FileInputStream inputStream = new FileInputStream(filename);everything = IOUtils.toString(inputStream);inputStream.close();} catch (IOException e) {}return everything;}
}


代理的使用

有些网站不允许爬虫进行数据爬取,因为会加大服务器的压力。其中一种最有效的方式是通过ip+时间进行鉴别,因为正常人不可能短时间开启太多的页面,发起太多的请求。

我们使用的WebMagic可以很方便的设置爬取数据的时间。但是这样会大大降低我们爬取数据的效率,如果不小心ip被禁了,会让我们无法爬去数据,那么我们就有必要使用代理服务器来爬取数据。

代理服务器

代理(英语:Proxy),也称网络代理,是一种特殊的网络服务,允许一个网络终端(一般为客户端)通过这个服务与另一个网络终端(一般为服务器)进行非直接的连接。

提供代理服务的电脑系统或其它类型的网络终端称为代理服务器(英文:Proxy Server)。一个完整的代理请求过程为:客户端首先与代理服务器创建连接,接着根据代理服务器所使用的代理协议,请求对目标服务器创建连接、或者获得目标服务器的指定资源


我们就需要知道代理服务器在哪里(ip和端口号)才可以使用。网上有很多代理服务器的提供商,但是大多是免费的不好用,付费的还行。

提供两个免费代理ip的服务商网站:

米扑代理
https://proxy.mimvp.com/free.php
西刺免费代理IP
http://www.xicidaili.com/


使用代理

WebMagic使用的代理APIProxyProvider。因为相对于Site的“配置”,ProxyProvider定位更多是一个“组件”,所以代理不再从Site设置,而是由HttpClientDownloader设置。

*API* *说明*
HttpClientDownloader.setProxyProvider(ProxyProvider proxyProvider) 设置代理

ProxyProvider有一个默认实现:SimpleProxyProvider。它是一个基于简单Round-Robin的、没有失败检查的ProxyProvider。可以配置任意个候选代理,每次会按顺序挑选一个代理使用。它适合用在自己搭建的比较稳定的代理的场景。

如果需要根据实际使用情况对代理服务器进行管理(例如校验是否可用,定期清理、添加代理服务器等),只需要自己实现APIProxyProvider即可。

可以访问网址http://ip.chinaz.com/getip.aspx 测试当前请求的ip

为了避免干扰,把其他任务的@Component注释掉,在案例中加入编写以下逻辑:

@Component
public class ProxyTest implements PageProcessor {@Scheduled(fixedDelay = 10000)public void testProxy() {HttpClientDownloader httpClientDownloader = new HttpClientDownloader();httpClientDownloader.setProxyProvider(SimpleProxyProvider.from(new Proxy("39.137.77.68",80)));Spider.create(new ProxyTest()).addUrl("http://ip.chinaz.com/getip.aspx").setDownloader(httpClientDownloader).run();}@Overridepublic void process(Page page) {//打印获取到的结果以测试代理服务器是否生效System.out.println(page.getHtml());}private Site site = new Site();@Overridepublic Site getSite() {return site;}
}

Java爬爬之网页去重和代理ip相关推荐

  1. 定时任务与网页去重、代理的使用

    定时任务与网页去重.代理的使用 一.定时任务 在案例中我们使用的是Spring内置的Spring Task,这是Spring3.0加入的定时任务功能.我们使用注解的方式定时启动爬虫进行数据爬取. 我们 ...

  2. 网页爬虫使用代理IP的几种方案,爬虫如何设置代理?

    不少网络公司在进行爬虫数据业务的时候,都会选择代理IP,网页爬虫在现如今非常常见,尤其是一些大数据处理公司,都会使用爬虫的方式来进行信息的抓取,而要想进行信息的精准抓取,那就必须使用靠谱且稳定的代理I ...

  3. 多线程爬取免费代理ip池 (给我爬)

    多线程爬取免费代理ip池 (给我爬) 文章目录 多线程爬取免费代理ip池 (给我爬) 安装的库 IP 隐藏 代理ip 多线程爬取 读入代理ip 写入代理ip 验证代理ip 解析网页得到代理ip 获取网 ...

  4. python3 爬取西祠代理IP数据

    1 import requests 2 from lxml import etree 3 4 5 # 将可以使用的代理IP的信息存储到文件 6 def write_proxy(proxies): 7 ...

  5. Python爬虫方式抓取免费http代理IP

    我们新手在练手的时候,常常需要一些代理IP进行爬虫抓取,但是因为学习阶段,对IP质量要求不高,主要是弄懂原理,所以花钱购买爬虫代理IP就显得没必要(大款忽略),今天跟大家分享一下,如果使用爬虫抓取免费 ...

  6. 付费代理IP——Redis数据库的使用01

    1.Redis初尝试: 在完成Redis数据库安装后,启动Redis数据库,打开Redis Desktop Manager: 用Python连接数据库: r = redis.Redis(host='1 ...

  7. 搭建代理IP池的方法

    突破次数的限制就可以使爬虫更高效的工作,代理IP是突破次数限制,提高爬虫高效工作的最好的工具.所以,很多人都想通过建立IP池的方法,实现换IP突破限制,那么这IP池如何进行搭建呢? 一,免费搭建代理I ...

  8. 用selenium通过免费https代理IP模拟浏览器行为

    先用requests库简单测试代理IP的可用性,再用selenium通过测试可用的代理IP模拟浏览器行为.以下代码提供一个思路,可作为一个学习用的测试例子. 免费代理可用性确实很低很低,非生产需求还是 ...

  9. java代理实现爬取代理IP

    仅仅使用了一个java文件,运行main方法即可,需要依赖的jar包是com.alibaba.fastjson(版本1.2.28)和Jsoup(版本1.10.2) 如果用了pom,那么就是以下两个: ...

最新文章

  1. window7 telnet localhost 5554
  2. iOS开发系列-线程同步dispatch_barrier_async
  3. (四) View/Model 全解(mvc)
  4. LG将授权webOS给其他电视厂商使用
  5. netcore一键部署到linux服务器以服务方式后台运行
  6. 汇编中各寄存器的作用(16位CPU14个,32位CPU16个)和 x86汇编指令集大全(带注释)
  7. MySQL数据库的终结_python中数据库的操作终结
  8. 多元线性回归dw值_SPSS教程10:多元线性回归
  9. 操作cookies值
  10. 涂料动漫学习笔记(一)
  11. java培训 lambda表达式_java 8 中lambda表达式学习
  12. Nutch1.2二次开发详细攻略(二)【图文】------Windows平台下Nutch1.2的搭建
  13. ATTCK实战系列一(内网渗透入门)
  14. 一键提取app源码_【补发】自动答题脚本教程及源码分享(无视分辨率)
  15. 电脑版的微信客户端也能刷朋友圈啦
  16. spring-security-oauth2(五) 记住我
  17. glide加载大图片白屏崩溃闪退
  18. 使用openfiler配置共享存储(1)——openfiler的安装和配置
  19. 智安网络丨DDoS攻击:无限战争
  20. homepod怎么设置为中文_HomePod终于能听懂中文了,但它真能搞定智能家居吗?

热门文章

  1. Mysql之limit语句
  2. 软件测试中Bug的分类(类型)
  3. 2020年超级计算机排名,2020中国高性能计算机TOP100榜单正式发布
  4. java课程设计拼图_java拼图游戏课程设计报告
  5. C语言错误信息报告函数strerror、perror的使用
  6. Matlab图像处理入门教程(菜鸟级)
  7. 学习模拟集成电路的九个阶段
  8. 三种方法解决git拒绝连接问题fatal: unable to access xxxx: Failed to connect to xxxx : Connection refused
  9. 6大科研神器,科研党必备,至少提高效率90%
  10. 高速公路数字孪生3D场景制作全流程记录【Blender + UE4】