前言

很多网站对访问量的判断并不严格,只要页面被点击即视为有效访问,但是应该现在反爬虫越来越严格,为防止部分网站会对IP进行拉黑,所以这里写一个小程序爬取代理IP,并使用代理IP刷访问量。原本想把代理IP包装成一个bean类,但是发现爬下来的代理IP都不需要用户名和密码,那就只要ip和端口就行了,索性实现得简单点,只关心ip和端口好了。

模块组织

FileUtil:用于提供爬取到的IP和url的写入文件、读取文件的接口。

CheckUtil:用于校验爬取到的IP是否可用。

SpiderUtil:爬虫动作的主要模块,用于爬取IP和需要刷访问量的url。

ClickUtil:使用代理IP访问指定url。

FileUtil

包含write、read两个方法,传入文件名,向该文件中写入(读取)数据。

package com.zixuan.add_uv.utils;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;public class FileUtil {//追加写入数据public  void write(String selection,String data,boolean isAppend){//输出流File file = new File(System.getProperty("user.dir")+"/conf");if(!file.exists()){file.mkdir();}try{if (selection.toLowerCase().equals("ip")){file = new File(System.getProperty("user.dir")+"/conf/ip.txt");}if(selection.toLowerCase().equals("url")){file = new File(System.getProperty("user.dir")+"/conf/url.txt");}FileOutputStream fos = new FileOutputStream(file,isAppend);fos.write(data.getBytes());fos.write("\r\n".getBytes());fos.close();}catch (Exception e){System.out.println("写入文件失败。");}}//读取文件,并将文件内容写入一个list里,返回该listpublic List<String> readFile(String fileName){List<String> listStr = new ArrayList<>();//输入流String path = FileUtil.class.getResource("").getPath();File file = new File(System.getProperty("user.dir")+"/conf/"+fileName);try{FileInputStream is = new FileInputStream(file);Scanner scanner = new Scanner(is);while (scanner.hasNextLine()) {listStr.add(scanner.nextLine());}scanner.close();is.close();} catch (Exception e) {System.out.println("读取文件失败");}return listStr;}
}

CheckUtil

使用代理IP访问百度,如果能够访问,则返回true,不能访问则返回false。

package com.zixuan.add_uv.utils;import org.jsoup.Jsoup;public class CheckIPUtil {//测试代理IP是否可用public static boolean checkProxy(String ip, Integer port) {System.out.println("检查中:"+ip);try {Jsoup.connect("http://www.baidu.com").timeout(1 * 1000).proxy(ip, port).get();System.out.println(ip+"可用");return true;} catch (Exception e) {System.out.println("失败,"+ip+"不可用");return false;}}public static boolean checkProxy(String s){String[] strings = s.split(" ");return checkProxy(strings[0],Integer.parseInt(strings[1]));}
}

SpiderUtil

主要实现爬取代理IP和url两个功能。

爬取代理IP:指定代理IP网站,以及爬取的页数。从页面中获取代理IP和端口后,使用CheckUtil中的校验方法检验,如果可用,则追加写入ip.txt文件中。并实现了runable接口,可以使用多线程进行爬取,提高效率。

爬取url:修改代码中中文写的两处地方。分别是正则表达式和爬取的页面。举个例子,如果要刷qq空间访问量,你需要传入一个用户的主页,然后用正则匹配出用户主页的说说的url,程序会自动爬取说说的url并写入到url.txt文件。

package com.zixuan.add_uv.utils;import com.alibaba.fastjson.JSONObject;
import com.zixuan.add_uv.bean.ProxyInfo;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;import java.io.IOException;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class SpiderUtil {static FileUtil fileUtil = new FileUtil();//爬取代理IPpublic static void spiderIP(String url, int totalPage) {String ipReg = "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3} \\d{1,6}";Pattern ipPtn = Pattern.compile(ipReg);for (int i = 1; i <= totalPage; i++) {System.out.println("开始爬取第"+i+"/"+totalPage+"页...");//发送请求,获取文档Document doc = null;try {doc = getDocument(url + i , "www.kuaidaili.com");} catch (IOException e) {System.out.println("链接不可用,爬取失败:"+url+i);return;}Matcher m = ipPtn.matcher(doc.text());while (m.find()) {String s = m.group();if (CheckIPUtil.checkProxy(s)) {fileUtil.write("IP", s, true);}}}}//爬取博客urlpublic static void spiderUrl(String username) {HashSet<String> urlSet = new HashSet<String>();String urlReg = "这里写匹配页面中爬取的正则";Pattern urlPtn = Pattern.compile(urlReg);Document doc = null;try {doc = getDocument("这里写要爬取的页面", "爬取网站的host");} catch (IOException e) {e.printStackTrace();return;}Matcher m = urlPtn.matcher(doc.body().html());while (m.find()) {String s = m.group();urlSet.add(s);}Iterator<String> iterator = urlSet.iterator();while (iterator.hasNext()) {String s = iterator.next();System.out.println(s);fileUtil.write("URL", s, true);}}//获取页面public static Document getDocument(String url, String host) throws IOException {Document doc = null;doc = Jsoup.connect(url).header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8").header("Accept-Encoding", "gzip, deflate, sdch").header("Accept-Language", "zh-CN,zh;q=0.8,en;q=0.6").header("Cache-Control", "max-age=0").header("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36").header("Cookie", "Hm_lvt_7ed65b1cc4b810e9fd37959c9bb51b31=1462812244; _gat=1; _ga=GA1.2.1061361785.1462812244").header("Host", host).header("Referer", "https://" + host + "/").timeout(30 * 1000).get();return doc;}//创建爬ip的runnable对象public static spiderIpExcutor excutorBulid(String url,int totalPage){return new spiderIpExcutor(url, totalPage);}//执行爬虫的runnable类static class spiderIpExcutor implements Runnable{String url = null;int totalPage = 0;public spiderIpExcutor(String url,int totalPage){this.url=url;this.totalPage=totalPage;}@Overridepublic void run() {if (url.equals("")||url==null||totalPage<=0){System.out.println("参数错误");}else {spiderIP(url,totalPage);}}}}

ClickUtil

click:点击行为的主要实现。

clickAll:传入一个IP,使用这个ip访问所有的url。在此方法中调用click方法。

ClickExcutor:实现runable接口,使用多线程进行访问,提高刷uv的效率。

package com.zixuan.add_uv.utils;import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;import java.io.IOException;
import java.util.Iterator;
import java.util.List;public class ClickUtil {//访问urlpublic static void click(String url, String proxy) throws IOException {String proxyIP = proxy.split(" ")[0];int proxyPort = Integer.parseInt(proxy.split(" ")[1]);Document doc = Jsoup.connect(url).header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8").header("Accept-Encoding", "gzip, deflate, sdch").header("Accept-Language", "zh-CN,zh;q=0.8,en;q=0.6").header("Cache-Control", "max-age=0").header("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36").header("Cookie", "Hm_lvt_7ed65b1cc4b810e9fd37959c9bb51b31=1462812244; _gat=1; _ga=GA1.2.1061361785.1462812244").header("Host", "写目标网站的host").header("Referer", "写上一个页面的地址,指明是从哪个页面跳转到这里的").timeout(10 * 1000).proxy(proxyIP, proxyPort).ignoreContentType(true).get();try {Thread.sleep(5*1000);} catch (InterruptedException e) {e.printStackTrace();}}//使用一个IP访问所有url//如果失败三次,则停止,下一个IPpublic static void clickAll() {FileUtil fileUtil = new FileUtil();Iterator<String> ips = fileUtil.readFile("ip.txt").iterator();while (ips.hasNext()) {String ip = ips.next();int exceptionFlag = 0;Iterator<String> urls = fileUtil.readFile("url.txt").iterator();while (urls.hasNext()) {String url = urls.next();System.out.println("尝试访问:"+url+"\n 使用代理:"+ip);try {click(url, ip);} catch (IOException e) {exceptionFlag++;}if(exceptionFlag>=3){break;}}}}//获取excutor的build方法public static ClickExcutor excutorBuild(int time){return new ClickExcutor(time);}//点击行为的runable类static class ClickExcutor implements Runnable{int time = 1;public ClickExcutor(int time){if(time>1) {this.time = time;}else {System.out.println("输入次数不正确,默认执行一次");}}@Overridepublic void run() {for (int i = 0; i < time; i++) {clickAll();}}}
}

controler

程序的入口,使用线程池同时爬取多个网站的代理IP。并在30s延迟后,开始刷uv。

package com.zixuan.add_uv.controler;import com.zixuan.add_uv.utils.ClickUtil;
import com.zixuan.add_uv.utils.FileUtil;
import com.zixuan.add_uv.utils.SpiderUtil;import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;public class Controler {public static void main(String[] args) {ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(8);scheduledThreadPool.schedule(SpiderUtil.excutorBulid("https://www.xicidaili.com/nn/",150),1, TimeUnit.SECONDS);scheduledThreadPool.schedule(SpiderUtil.excutorBulid("https://www.xicidaili.com/nt/",150),1,TimeUnit.SECONDS);scheduledThreadPool.schedule(SpiderUtil.excutorBulid("https://www.xicidaili.com/wt/",150),1,TimeUnit.SECONDS);scheduledThreadPool.schedule(SpiderUtil.excutorBulid("https://www.xicidaili.com/wn/",150),1,TimeUnit.SECONDS);scheduledThreadPool.schedule(SpiderUtil.excutorBulid("https://ip.jiangxianli.com/?page=",150),1,TimeUnit.SECONDS);SpiderUtil.spiderUrl("xxxxx");scheduledThreadPool.schedule(ClickUtil.excutorBuild(5000),30,TimeUnit.SECONDS);scheduledThreadPool.schedule(ClickUtil.excutorBuild(5000),60,TimeUnit.SECONDS);scheduledThreadPool.schedule(ClickUtil.excutorBuild(5000),90,TimeUnit.SECONDS);}
}

Java:爬取代理ip,并使用代理IP刷uv相关推荐

  1. JAVA爬取淘宝、京东、天猫以及苏宁商品详细数据(一)

    JAVA爬取某东.某宝以及某宁商品详细数据(一) 写在最前 反爬策略问题解决 请求头配置 无代理模式 代理模式 某东 JDHTML解析 JD商品解析 天猫 TMHTML解析 苏宁 SNHTML解析 写 ...

  2. Java爬取解析去哪儿景点信息

    前言:这两周在做 Web 课的大作业,顺便琢磨了一下如何使用 Java 从网上获取一些数据,现在写这篇博客记录一下. PS:这里仅限交流学习用,如利用代码进行恶意攻击他网站,和作者无关!!! Java ...

  3. 用java爬取学校数据_Java爬取校内论坛新帖

    Java爬取校内论坛新帖 为了保持消息灵通,博主没事会上上校内论坛看看新帖,作为爬虫爱好者,博主萌生了写个爬虫自动下载的想法. 嗯,这次就选Java. 第三方库准备 Jsoup Jsoup是一款比较好 ...

  4. Jsoup:用Java也可以爬虫,怎么使用Java进行爬虫,用Java爬取网页数据,使用Jsoup爬取数据,爬虫举例:京东搜索

    Jsoup:用Java也可以爬虫,怎么使用Java进行爬虫,用Java爬取网页数据,使用Jsoup爬取数据,爬虫举例:京东搜索 一.资源 为什么接下来的代码中要使用el.getElementsByTa ...

  5. java爬取网页内容 简单例子(2)——附jsoup的select用法详解

    [背景] 在上一篇博文 java爬取网页内容 简单例子(1)--使用正则表达式 里面,介绍了如何使用正则表达式去解析网页的内容,虽然该正则表达式比较通用,但繁琐,代码量多,现实中想要想出一条简单的正则 ...

  6. Java爬取校内论坛新帖

    Java爬取校内论坛新帖 为了保持消息灵通,博主没事会上上校内论坛看看新帖,作为爬虫爱好者,博主萌生了写个爬虫自动下载的想法. 嗯,这次就选Java. 第三方库准备 Jsoup Jsoup是一款比较好 ...

  7. Java爬取并下载酷狗音乐

    本文方法及代码仅供学习,仅供学习. 案例: 下载酷狗TOP500歌曲,代码用到的代码库包含:Jsoup.HttpClient.fastJson等. 正文: 1.分析是否可以获取到TOP500歌单 打开 ...

  8. MinerConfig.java 爬取配置类

    MinerConfig.java 爬取配置类 package com.iteye.injavawetrust.miner;import java.util.List;/*** 爬取配置类* @auth ...

  9. java爬取单张图片

    我们经常需要在网页上获取一些图片,有的图片我们是可以直接下载使用,有的图片需要我们登陆账号甚至付费下载,所以在此我写了一个使用Java爬取任意网页单张图片的爬虫. 代码解析 1.图片的网络位置 2.进 ...

  10. java爬取当当网所有分类的图书信息(ISBN,作者,出版社,价格,所属分类等)

    java爬取当当网所有分类的图书信息(ISBN,作者,出版社,价格,所属分类等) 顺手写的,没有建立新项目,放我自己的项目的一个文件夹里了,有兴趣的朋友可以拉下来试试 https://gitee.co ...

最新文章

  1. 基坑计算理论m法弹性支点法_基坑支护结构设计应注意的一些问题
  2. java8之重新认识HashMap(转自美团技术团队)
  3. python random.choice报错_如何解决mtrand.RandomState.choice中的内存错误...
  4. 参考文献中会议名称怎么缩写_期刊缩写查询总结
  5. 深入理解Golang之context
  6. 使用java理解程序逻辑 第十二章_Java多线程中锁的理解与使用(二)
  7. android组件化掘金,MVPArms 官方快速组件化方案
  8. 通俗易懂的哈希算法讲解
  9. Lazy Binomial Heaps
  10. 坚持-转自网易轻博客LOFTER
  11. 【迟到的Java岗面经】面7家,意外收获5家意向offer,越努力越幸运!
  12. xor指令加解密(笔记)
  13. 机原自检——第3章 平面机构的运动分析
  14. 计算两个日期相差月数,精确到天
  15. 计算机毕业设计-基于ssm的问卷调查管理系统
  16. Drown跨协议攻击TLS漏洞分析
  17. sqlserⅴer随机函数_Sql server自动生成拼音的函数
  18. 按字节编址,求地址间的存储容量方法
  19. JDBC实现DBHelper类
  20. Anaconda创建环境及环境配置

热门文章

  1. 电路设计软件系列教程(五),Protel DXP电路设计软件之设计规则(上)
  2. 企业市场推广之网络营销运营策略探讨
  3. Visual Studio 插件番茄助手2个优秀的特性
  4. 骨骼动画详解-Spine
  5. tp801单板微型计算机英文全称,TP801型微型计算机在低压铸造与差压铸造液面加压控制系统中的应用.pdf...
  6. 真正免费的证件照小程序,在线一键生成标准免冠证件照,证件照底色更换,证件照尺寸修改
  7. C# 读取Word文本框中的文本、图片和表格(附VB.NET代码)
  8. 小运营征战大市场,手游运营也需”千人千面” ——DT时代手游精细化运营解析
  9. 从零开始成为网络工程师,H3CNE从零学起
  10. excel表格公式无效、不生效的解决方案及常见问题、常用函数