以前用的是Python语言进行爬虫,现在尝试用Java语言爬虫。我这里爬取的是手表品牌大全网站的爬取,这个网站的爬取我已经用python语言的scrapy进行抓取过,scrapy使用item,pipeline爬取数据,并且上传图片到oss,现在尝试用java语言爬取该网址。
简洁的描述下,爬取这个网址的流程。首先这个网址是没有反爬的,通过爬取这个网址是为了熟悉webmagic爬取的流程,以及抓取数据的方法。该网址有三重跟进,网址入口是展示了所有手表品牌,我们需要把每个品牌都抓下来。
之后跟进每个品牌的链接,可以看到每个品牌有很多系列。
之后跟进系列,可以看到该系列的每款手表,需要爬取该系列的信息。注意这里有翻页的情况。
然后获取每个手表的详细链接,爬取手表的具体信息。
有过scrapy基础的小伙伴,看webmagic的官方文档应该不会很困难,这个爬虫框架参考了scrapy的运行原理,上手会快点。如果没有scrapy基础,也没有关系,webmagic官方文档也简洁明了的介绍了它的运行原理。
前期准备工作
- Java语言基础知识 Java 菜鸟教程
- 开发软件IDEA,创建maven项目
- 了解爬虫的基本流程
- 理解webmagic官方文档
初次爬取
这里的爬取,代码是很冗长的。后期会慢慢进行优化。
1.按照webmagic官方文档来,我建了一个iwatch.class
package com.webmagic.demo;
import com.webmagic.pipeline.BrandPipeline;
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;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class iwatch implements PageProcessor {
// 抓取网站的相关配置,包括编码、抓取间隔、重试次数等
private Site site = Site.me().setRetryTimes(3).setSleepTime(100);
public Site getSite() {
return site;
}
public void process(Page page) {
/*主要爬取代码块*/
}
public static void main(String[] args) {
Spider.create(new iwatch())
.addUrl("http://www.iwatch365.com/brand/")
.thread(5)
.run();
}
}
- 在process中先写brand,品牌这块
/*用if来判断需要处理的是哪种请求,所有的请求,最后都会回到process里面进行处理*/
/*它不像scrapy那样,有回调函数,可以分开写,各个网址的解析都在这里写*/
/*初始网址,获取品牌信息*/
if (page.getUrl().toString().equals("http://www.iwatch365.com/brand/")) {
ArrayList<Map> brand_list = new ArrayList<Map>();
List<Selectable> nodes = page.getHtml().xpath("//div[@class='list_main']//li").nodes();
for (Selectable node : nodes
) {
Map<String, String> map = new HashMap<String, String>();
/*这是一堆解析,可以不看*/
String brand_url = node.xpath("//a/@href").toString();
String brand_img_url = node.xpath("//a/img/@src").toString();
String brand_chname = node.xpath(