使用webmagic 爬取天气网站

在WebMagic里,实现一个基本的爬虫只需要编写一个类,实现PageProcessor接口即可。这个类基本上包含了抓取一个网站,你需要写的所有代码。

该例子使用webmagic爬取天气网上杭州的历史天气数据,使用Jsoup解析页面,代码如下:

package com.yelling.weather.spider;

import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

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.Html;
import us.codecraft.webmagic.selector.Selectable;


public class WeatherRepoPageProcessor implements PageProcessor {

    // 部分一:抓取网站的相关配置,包括编码、抓取间隔、重试次数等
    private Site site = Site.me().setRetryTimes(3).setSleepTime(1000);
    private String [] tit = {"最高气温:\t","最低气温:\t","天气:\t","风向:\t","风力:\t"};
    public void process(Page page) {
        // 部分二:定义如何抽取页面信息,并保存下来
        String url = page.getUrl().toString();
        //System.out.println(url);
        if(!url.endsWith("index.html")&&url.endsWith("html")){
            Html html = page.getHtml();
            //获取城市名
            String city = html.xpath("//*[@id=\"tool_site\"]/div[1]/h3").toString();
            city = city.substring(city.indexOf(">") + 1, city.indexOf("20"));

            //System.out.println(city);
            String content = html.toString();
            Document docList = Jsoup.parse(content);
            //定位到class
            Elements es = docList.getElementsByClass("tqtongji2");
            //定位到ul
            Elements UlTag = es.get(0).getElementsByTag("ul");

            for (int j = 1; j < UlTag.size(); j++) {
                Element obj = UlTag.get(j);
                Elements LiTag = obj.getElementsByTag("li");
                Element li1 = LiTag.get(0);
                //获取某日天气详情链接
                String ss = li1.getElementsByTag("a").get(0).html();
                System.out.println(city+"\t"+ss);
                //获取每个li标签数据
                for(int i = 1;i<LiTag.size();i++){
                    System.out.println(tit[i-1]+LiTag.get(i).html());
                }
                System.out.println("*******************");
                // System.out.println(LiTag.html());
            }

        }





        // 部分三:从页面发现后续的url地址来抓取

        //爬取杭州历年的天气数据
        page.addTargetRequests(page.getHtml().links().regex("http://lishi\\.tianqi\\.com/[a-z]+/[\\d]+\\.html").all());
        page.addTargetRequests(page.getHtml().links().regex("http://lishi\\.tianqi\\.com/hangzhou/index\\.html").all());
    }

    public Site getSite() {
        return site;
    }

    public static void main(String[] args) {
        //添加种子url,并打开5个线程开始爬虫
        Spider.create(new WeatherRepoPageProcessor()).addUrl("http://lishi.tianqi.com").thread(5).run();
    }
}

运行结果:

运行结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值