java + webmagic 静态爬取知乎列表信息,下个版本将给大家介绍如何动态爬取列表信息

1.使用webmagic 前我们先需要导入如下包:commons 使用jar包 commons-dbcp/collections/io/lang/logging/logging-api/pool/validator/.jar

导入,assertj-core.jar断言包 参考:https://blog.csdn.net/mmk1992/article/details/52205264?utm_source=blogxgwz2

导入fastjson Fastjson是一个Java语言编写的高性能功能完善的JSON库,当然必备fastjson jar包。快速解析json神器,方便快捷的工具。

导入guava-15.0.jar 工具类 就是封装平常用的方法,不需要你重复造轮子,节省开发人员时间,提高工作效率。谷歌作为大公司,当然会从日常的工作中提取中很多高效率的方法出来。所以就诞生了guava。可参考:https://blog.csdn.net/yyyCHyzzzz/article/details/54983574?utm_source=blogxgwz0

导入 slf4j-api ,slf4j-log4j.jar,在工程中通过slf4j接入不同的日志系统。更直观一点,slf4j是个数据线,一端嵌入程序,另一端链接日志系统,从而实现将程序中的信息导入到日志系统并记录。 

导入jsoup  用来解析html  参考 http://www.open-open.com/jsoup/whitelist-sanitizer.htm

导入jedis -2.0.0.jar 连接池 参考 https://blog.csdn.net/jesting1988/article/details/55803915/

导入 httpclient 和 httpcore -4.3.2 HttpCore是一套实现了HTTP协议最基础方面的组件,尽管HTTP协议在使用最小占用来开发全功能的客户端和服务器的HTTP服务是足够的。

导入 webmagic-core-0.5.2.jar webmagic-extension-0.5.2 webmagic 核心jar包

导入hamcrest-core。1.3.jar 单元测试jar包

第二步查看我们需要的页面元素。

package spliter.control;

import java.util.ArrayList;
import java.util.Date;
import java.util.Dictionary;
import java.util.HashMap;
import java.util.List; 
import java.util.regex.Matcher;
import java.util.regex.Pattern;


import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;

import us.codecraft.webmagic.processor.PageProcessor; 

import us.codecraft.webmagic.selector.Selectable;

public class infocontrol implements PageProcessor {
    //Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6721.400 QQBrowser/10.2.2243.400
	// 部分一 :抓取网站的相关配置 ,包括编码 ,抓取间隔 ,重试次数 
		private	Site site= Site.me()
					.setRetryTimes(8)
					.setSleepTime(3000);
				// .addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:62.0) Gecko/20100101 Firefox/62.0") 
				// .addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8")
				 //.addHeader("Accept-Encoding", "gzip, deflate, br")
				 //.addHeader("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2") 
				 //.addHeader("Connection", "keep-alive");
                 
		//*[@id="SearchMain"]/div/div/div/div[1]/div/div/div[2]/h2/div/span
	// 是定制 爬虫逻辑的核心接口 , 在这里 编写抽取逻辑 
		public void process(Page  page) {
			 List<String> newlist=new ArrayList<String>();
			  // authorname   signature , answer ,post ,followers 爬去这些信息
			//String authorsname=page.getHtml().xpath("*").toString();
		    HashMap<String, List<String>> map= new HashMap<String, List<String>>();
			// TODO Auto-generated method stub
			String regex1="div[@class='ContentItem-meta']/div/div[@class='RichText ztext SearchItem-meta Highlight']/text()";
			 List<String> signature=page.getHtml().xpath(regex1).all(); // signature 个性签名 
			 String regex2="div[@id='null-toggle']/a[@class='UserLink-link']/img[@class='Avatar Avatar--large UserLink-avatar']";
			 List<String> authorname=page.getHtml().xpath(regex2).all();// authorname 作者名字
			 String bregex="alt="+"[^#%]{0,}"+"";
			 Pattern p=Pattern.compile(bregex);
			 for(int i = 0;i<authorname.size();i++){
				String ss= authorname.get(i).toString();
				   Matcher m=p.matcher(ss);
				    if(m.find()){
				      String  mlist[]= m.group().split("alt=");    //分割alt= 
				      for(String es: mlist){
				    	     authorname.set(i, es);
				      }
				       
			 }
			 }
			 List<String> answerall=page.getHtml().xpath("div[@class='ContentItem-status']/a[@class='ContentItem-statusItem Search-statusLink']/text()").all();
			// System.out.println("------------");
			 for(int i = 0;i <  authorname.size();i++){
				// System.out.println(authorname.size());    
				  for (int j=0;j<answerall.size();){
                       j=j+3;
					  //System.out.println(answerall.get(j));             
					  if(j!=0){
						  newlist.add(answerall.get(j-3));
						  newlist.add(answerall.get(j-2));
						  newlist.add(answerall.get(j-1));
						  map.put(authorname.get(i), newlist);
					  }else{
						 continue;
					  }
				  }
			 }
			 System.out.println(map);
			
		}
		
	
	   
    public Site getSite() {
		// TODO Auto-generated method stub
		return this.site;
	}
	public static void main(String [] args){
		long startTime ,endTime;
		startTime=new Date().getTime();
        Spider.create(new infocontrol()).addUrl("https://www.zhihu.com/search?type=people&q=java").thread(9).run();
        endTime=new Date().getTime();
	    System.out.println("  ---共耗时 --"+(endTime-startTime)/1000+"秒");	
		
	}


	 
}

我是拿hashmap 进行封装

猜你喜欢

转载自blog.csdn.net/weixin_40279039/article/details/83410240