Java爬虫框架Webmagic
webmagic是一个开源的Java爬虫框架,目标是简化爬虫的开发流程,让开发者专注于
逻辑功能的开发。webmagic的核心非常简单,但是覆盖爬虫的整个流程,也是很好的学习
爬虫开发的材料。
webmagic的主要特色:
完全模块化的设计,强大的可扩展性。
核心简单但是涵盖爬虫的全部流程,灵活而强大,也是学习爬虫入门的好材料。
提供丰富的抽取页面API。
无配置,但是可通过POJO+注解形式实现一个爬虫。
支持多线程。
支持分布式。
支持爬取js动态渲染的页面。
无框架依赖,可以灵活的嵌入到项目中去。
四大组件
Downloader
负责从互联网上下载页面,以便后续处理。WebMagic默认使用了
ApacheHttpClient作为下载工具。
PageProcessor
PageProcessor负责解析页面,抽取有用信息,以及发现新的链接。WebMagic使用Jsoup
作为HTML解析工具,并基于其开发了解析XPath的工具Xsoup。
在这四个组件中,PageProcessor对于每个站点每个页面都不一样,是需要使用者定制的部
分。
Scheduler
Scheduler负责管理待抓取的URL,以及一些去重的工作。WebMagic默认提供了JDK的内
存队列来管理URL,并用集合来进行去重。也支持使用Redis进行分布式管理。
Pipeline
Pipeline负责抽取结果的处理,包括计算、持久化到文件、数据库等。WebMagic默认提供
了“输出到控制台”和“保存到文件”两种结果处理方案
导入依赖
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic‐core</artifactId>
<version>0.7.3</version>
</dependency>
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic‐extension</artifactId>
<version>0.7.3</version>
</dependency>
编写类实现网页内容的爬取
public class Demo implements PageProcessor{
int myid = 0;
int size =10;
// 抓取网站的相关配置,可以包括编码、抓取间隔1s、重试次数等
private Site site = Site.me().setCharset("utf8").setRetryTimes(1000).setSleepTime(1000);
public Site getSite() {
return site;
}
public void process(Page page) {
Html html = page.getHtml();
size++;
String hahawebname = html.xpath("//div[@class=\"odd_anim_title_tnew\"]/div[@class=\"tvversion\"]/a/span[@class=\"anim_title_text\"]/h1/text()").get();//得分
String goal = html.xpath("//div[@class=\"anim_star\"]/ul/li[@id=\"anim_score_info\"]/span[@class=\"points_text\"]/text()").get();//得分
String mentotalold = html.xpath("//div[@class=\"anim_star\"]/ul/li[@id=\"score_statistics\"]/span[@id=\"score_count_span\"]/text()").get();//人数
String mentotal = mentotalold.replaceAll("人评分","");
String content = html.xpath("//div[@class=\"odd_anim_title_mnew\"]/p/span[@id=\"gamedescshort\"]/text()").get();//内容
String contentdetail = html.xpath("//div[@class=\"odd_anim_title_mnew\"]/p/span[@id=\"gamedescall\"]/text()").get();//内容
String url = "http://donghua.dmzj.com/donghua_info/"+size+".html";
System.out.println("hahawebname: "+ hahawebname);
System.out.println("goal: "+goal);
System.out.println("mentotal: "+ mentotal);
System.out.println("content: "+ content);
System.out.println("url: "+ url);
System.out.println("contentdetail: "+ contentdetail);
}
public static void main(String[] args) {
int username = 10;
long startTime, endTime;
System.out.println("开始爬取...");
for(;username<=15000;username++) {
startTime = System.currentTimeMillis();
Spider.create(new Demo()).addUrl("https://www.biquge5200.cc/52_52542/").thread(1).run();
endTime = System.currentTimeMillis();
System.out.println("爬取结束,耗时约" + ((endTime - startTime) / 1000) + "秒");
}
}
}
网站需要根据自己的综合实践以及正则表达式、XPATH对页面进行处理,可以打印在输出框,也可以整合用到Mybatis,可以将爬下来的数据直接持久化到数据库中