免费怎么刷空间访问量(空间访问量秒刷软件推荐)

免费怎么刷空间访问量(空间访问量秒刷软件推荐)

前言

捣鼓了两天,总算是做了demo 啦。整体思路如下:

可以看到整体思路还是比较简单的,真机IP访问的话,很容易被限制,所以增加代理访问。主要就是三步走。

1、将url 存入到url 缓存池中。

2、将代理信息存入到代理池中。

3、分别从url缓存池和代理池中取出一个进行爬取页面,并将页面数据解析出来。下面来仔细看看如何实现的吧。

代理相关

https://raw.githubusercontent.com/fate0/proxylist/master/proxy.list,https://www.xicidaili.com/wt/

所以我在application.properties 中增加获取代理路径的配置。

然后增加一个ipbean 和ipPool.

ipbean

@Setter@GetterpublicclassIpBean{privateStringip;privateintport;privateStringtype;publicIpBean(Stringip,intport,Stringtype){this.ip=ip;this.port=port;this.type=type;}}

ipPool

publicclassIpPool{publicstaticList<IpBean>ipBeanList=newArrayList<>();/***支持并发操作**@parambean*/publicstaticsynchronizedvoidadd(IpBeanbean){if(ipBeanList.size()>=1000){return;}ipBeanList.add(bean);}publicstaticsynchronizedvoidremove(IpBeanbean){ipBeanList.remove(bean);}}

这里做了一个处理,就是当代理池中的数量大于1000时,我们就不再向代理池中增加代理了。

爬取代理信息

@Slf4j@ComponentpublicclassSpider{privateintpages;privateList<IpBean>ipList=newArrayList<>();/***带页数的爬取(适用于西刺代理和快代理)*@paramurl*@parampages页数*@return*/publicList<IpBean>crawl(Stringurl,intpages)throwsException{this.pages=pages;returncrawl(url);}/***不带页数的爬取,爬取URL返回的页面数据。*@paramurl*@return*/publicList<IpBean>crawl(Stringurl)throwsException{String[]urlArr=url.split(ConstantPool.SEPARATORCOMMA);for(inti=0;i<urlArr.length;i ){Stringtemp=urlArr[i];if(temp.substring(temp.length()-1,temp.length()).equalsIgnoreCase(ConstantPool.SEPARATORSLASH)){crawlHasPage(temp);}else{crawlNoPage(temp);}}returnipList;}/***带页数的爬取*@paramurl*/privatevoidcrawlHasPage(Stringurl){for(inti=1;i<pages;i ){getResponseFromXiCi(url,i);}}/***不带页数的爬取*@paramurl*/privatevoidcrawlNoPage(Stringurl)throwsException{IpBeanipBean=null;getResponseFromJson(HttpUtils.getHttpURLConnection(url,ipBean));}/***从https://raw.githubusercontent.com/fate0/proxylist/master/proxy.list上爬取代理IP并放入ipList中*@paramconn*@return*/privatevoidgetResponseFromJson(HttpURLConnectionconn){try{intcode=conn.getResponseCode();if(code==200){InputStreamis=conn.getInputStream();BufferedReaderin=newBufferedReader(newInputStreamReader(is,”UTF-8″));StringoneJson=in.readLine();while(oneJson!=null&&oneJson.trim().length()!=0){JSONObjectjsonObject=JSON.parseObject(oneJson);Stringip=(String)jsonObject.get(“host”);intport=Integer.parseInt(jsonObject.get(“port”).toString());Stringtype=(String)jsonObject.get(“type”);ipList.add(newIpBean(ip,port,type));oneJson=in.readLine();}}}catch(Exceptione){e.printStackTrace();}}/***从西刺带上爬取代理IP。*@paramurl*@paramindex*/privatevoidgetResponseFromXiCi(Stringurl,intindex){Stringhtml=null;try{html=HttpUtils.getResponseContent(url index,null);}catch(Exceptione){log.error(“{}”,e);}Documentdocument=Jsoup.parse(html);Elementseles=document.selectFirst(“table”).select(“tr”);for(inti=1;i<eles.size();i ){Elementele=eles.get(i);Stringip=ele.children().get(1).text();intport=Integer.parseInt(ele.children().get(2).text().trim());Stringtype=ele.children().get(5).text().trim();ipList.add(newIpBean(ip,port,type));}}}

getResponseFromXiCi() 返回的是html 页面,所以就需要我们爬取信息啦。使用了Jsoup 类

定时获取

@Component@Configuration@EnableScheduling@Slf4jpublicclassAutoSpider{@Value(“${pages}”)privateintpages;@Value(“${proxyUrl}”)privateStringproxyUrl;@AutowiredSpiderspider;@Scheduled(cron=”006-23**?”)publicvoidgetIp(){List<IpBean>list=null;try{list=spider.crawl(proxyUrl,pages);}catch(Exceptione){log.error(“{}”,e);}for(IpBeanipBean:list){IpPool.add(ipBean);}log.info(“代理数量:” IpPool.ipBeanList.size());}}

上面这些,就可以自动定时的获取代理IP,并存入代理池中,我们访问页面的时候直接从代理池中取就好了。不用关心其他。

访问路径的设计

urlPool

publicclassUrlPool{publicstaticSet<String>urlPool=newHashSet<>();publicstaticvoidadd(Stringurl){urlPool.add(url.trim());}publicstaticvoidremove(Stringurl){urlPool.remove(url.trim());}}定时更新url

下面这个方法就是从 url.txt 文件中一行一行的读取 url ,然后添加到 urlPool 中。

publicstaticvoidgetUrlFile(){log.info(“路径:” ConstantPool.BASEPATH);Filefile=newFile(ConstantPool.BASEPATH ConstantPool.FILENAME);if(!file.exists()){return;}BufferedReaderbr=null;try{br=newBufferedReader(newFileReader(file));Stringurl=””;while((url=br.readLine())!=null){//使用readLine方法,一次读一行log.info(url);UrlPool.add(url.trim());}}catch(Exceptione){log.error(“{}”,e);}finally{//关闭流try{if(br!=null){br.close();}}catch(IOExceptione){log.error(“{}”,e);}}}

然后我们创建一个定时任务,定期的执行,将 URL 存到 urlPool 中,利用 Set 达到去重的效果。

@Component@Configuration@EnableScheduling@Slf4jpublicclassAutoReadUrl{@Scheduled(cron=”0*/306-23**?”)privatevoidconfigureTasks(){FileUtils.getUrlFile();}}通过接口增删查 url

首先我们写一个向文件末尾增加url。如下就是将源文件读取出来,然后设置

fos=newFileOutputStream(file,true);

表示支持追加内容。

publicstaticbooleanaddContentToFile(Stringurls){String[]urlArr=urls.split(ConstantPool.SEPARATORCOMMA);Filefile=newFile(ConstantPool.BASEPATH ConstantPool.FILENAME);FileOutputStreamfos=null;OutputStreamWriterosw=null;try{if(!file.exists()){booleanhasFile=file.createNewFile();if(hasFile){log.info(“filenotexists,createnewfile”);}fos=newFileOutputStream(file);}else{fos=newFileOutputStream(file,true);}osw=newOutputStreamWriter(fos,”utf-8″);for(inti=0;i<urlArr.length;i ){osw.write(urlArr[i]);//写入内容osw.write(“\r\n”);//换行}}catch(Exceptione){log.error(“{}”,e);returnfalse;}finally{//关闭流try{if(osw!=null){osw.close();}if(fos!=null){fos.close();}}catch(IOExceptione){log.error(“{}”,e);returnfalse;}}returntrue;}

然后写一个增删查的接口

@RestController@CrossOrigin(origins=”*”)@Slf4j@RequestMapping(“/url”)publicclassUrlController{@RequestMapping(“/add”)publicSet<String>addUrl(@RequestParam(value=”urls”)Stringurls){if(FileUtils.addContentToFile(urls)){log.info(“添加成功:” urls);}FileUtils.getUrlFile();returnUrlPool.urlPool;}@RequestMapping(“/list”)publicSet<String>getUrls(){FileUtils.getUrlFile();returnUrlPool.urlPool;}@RequestMapping(“/del”)publicSet<String>delUrls(@RequestParam(value=”urls”)Stringurls){FileUtils.delUrlFile();Iterator<String>iterator=UrlPool.urlPool.iterator();while(iterator.hasNext()){Stringurl=iterator.next().trim();if(url.equals(urls.trim())){iterator.remove();}else{FileUtils.addContentToFile(url);}}FileUtils.getUrlFile();returnUrlPool.urlPool;}}

其中 @CrossOrigin(origins = “*”)表示这个接口支持跨域请求。

这样我们可以通过接口增加删除url .并定期的将url.txt中的url 更新到urlPool 中使用。

爬取

通过上面这些,我们的代理池和url池中都有数据啦。我们这里就以爬取博客为例
我们创建一个线程。

@Slf4jpublicclassVistThreadextendsThread{privateList<IpBean>proxyList;privateStringurl;publicVistThread(List<IpBean>proxyList,Stringurl){this.proxyList=proxyList;this.url=url;}@Overridepublicvoidrun(){vistUrlByProxy(proxyList,url);}/***单个url,通过代理访问*@paramlist代理列表*@paramurl访问的url*/privatevoidvistUrlByProxy(List<IpBean>list,Stringurl){if(list==null||list.isEmpty()){IpBeanipBean=null;vistUrlByProxy(ipBean,url);}Iterator<IpBean>it=list.iterator();while(it.hasNext()){IpBeanipBean=it.next();if(!vistUrlByProxy(ipBean,url)){ipBean=null;vistUrlByProxy(ipBean,url);it.remove();}}}/***单个url,通过代理访问*@paramipBean代理*@paramurl访问的url*/privatebooleanvistUrlByProxy(IpBeanipBean,Stringurl){try{BlogBeanblog=getBlogInfo(url,ipBean);if(ipBean==null){log.info(“真机ip”);}else{log.info(“IP:” ipBean.getIp() “:” ipBean.getPort());}log.info(“阅读量:” blog.getReadCount() blog.getTitleArticle() “(” blog.getArticleType() “)” “访问成功:” url);returntrue;}catch(Exceptione){log.error(“{}”,e);log.info(“访问失败”);returnfalse;}}/***获取文章的标题,类型,阅读数量*@paramurl访问文章的链接*@paramipBean代理*@return*@throwsException*/publicBlogBeangetBlogInfo(Stringurl,IpBeanipBean)throwsException{Stringhtml=HttpclientUtils.getResponseContent(url,ipBean);Documentdocument=Jsoup.parse(html);ElementstitleArticle=document.getElementsByClass(“title-article”);ElementsarticleType=document.getElementsByClass(“article-type”);ElementsreadCount=document.getElementsByClass(“read-count”);BlogBeanblog=newBlogBean(titleArticle.text(),articleType.text(),readCount.text());returnblog;}}

getBlogInfo() 方法就可以爬取到博客的基本信息啦。

番外

上面贴的代码不是很完整。不过主要的思路就是这样的啦。

如果想要源码的,可以后台回复“view”获取!!!

发表评论

登录后才能评论