webmagic的简单使用

2019-08-12  本文已影响0人  傻明蚕豆

    这篇文章是写webmagic爬虫的一个实例。

    比如我要抓取(佛山头条-佛山新闻网)该网站的头条数据,浏览器打开该网站,可以看到左边一列就是新闻列表,我们就是要这些新闻了,然后F12,找到该列表数据来源,可能来源于html页面,也可能来源于异步请求json数据,如下图:

从上面的图可以看到,我们只要拿到a标签href属性值,就可以得到新闻的url,该url需要修改一下,成为完整的url,就可以访问这些url,得到新闻的内容了。

就分析到这里,下面是代码。

先引入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>

新建一个类实现PageProcessor接口;

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.Request;

import us.codecraft.webmagic.Site;

import us.codecraft.webmagic.Spider;

import us.codecraft.webmagic.processor.PageProcessor;

import us.codecraft.webmagic.utils.HttpConstant;

/**

* @author  LUO.XIAO.MING

* @email  1060120317@qq.com

* @date    2019年8月11日 下午11:58:20

* @version 1.0

* @remark 

*/

public class TestProcessor implements PageProcessor{

//这里添加请求头,还有设置请求连接超时,请求失败再次请求次数等等。

private Site site=Site

.me()

.setTimeOut(300000)

.setRetrySleepTime(5000)

.setSleepTime(5000)

.setRetryTimes(5)

.addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8")

.addHeader("Accept-Encoding", "gzip, deflate")

.addHeader("Accept-Language", "zh-CN,zh;q=0.9")

.addHeader("Connection", "keep-alive")

.addHeader("Upgrade-Insecure-Requests", "1")

.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36")

;

@Override

public Site getSite() {

return this.site;

}

//这里是重点,每个url请求成功都会进入这个方法,即所有url的内容都在这里处理。

@Override

public void process(Page page) {

//这里用jsoup解析html内容

Document document = Jsoup.parse(page.getHtml().toString(), "UTF-8");

//获取当前url

String url=page.getUrl().toString();

if(url.equals("http://www.foshannews.com/fstt/")) {

//这里是新闻列表url

//获取所有a标签的href属性值,经过修改得到完整url,再放入爬虫

Elements elements = document.select("a");

for(Element ele:elements) {

String href = ele.attr("href");

// http://www.foshannews.com/fstt/201908/t20190811_262924.html

href="http://www.foshannews.com/fstt"+href.substring(1,href.length());

if(href.matches("http://www.foshannews.com/fstt/[0-9]{6}/t[0-9]{8}_[0-9]{1,8}.html")) {

page.addTargetRequest(href);

}

}

}else if(url.matches("http://www.foshannews.com/fstt/[0-9]{6}/t[0-9]{8}_[0-9]{1,8}.html")) {

//符合上面的url就是新闻内容页,在这里解析页面内容。

if(document.select("h1[class=tit]")!=null) {

String title=document.select("h1[class=tit]").get(0).text();

System.out.println(title);

}

}

}

public static void main(String[] args) {

//创建一个Get请求

String url="http://www.foshannews.com/fstt/";

Request request=new Request(url);

request.setCharset("UTF-8");

request.setMethod(HttpConstant.Method.GET);

//这里是爬虫入口

TestProcessor processor=new TestProcessor();

Spider.create(processor)

.addRequest(request)

.run();

}

}

写这篇文章主要是自己想当笔记使用,也希望能帮到他人。

    

上一篇 下一篇

猜你喜欢

热点阅读