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 进行封装