这篇文章是写webmagic爬虫的一个实例。
比如我要抓取(佛山头条-佛山新闻网)该网站的头条数据,浏览器打开该网站,可以看到左边一列就是新闻列表,我们就是要这些新闻了,然后F12,找到该列表数据来源,可能来源于html页面,也可能来源于异步请求json数据,如下图:
![](https://img.haomeiwen.com/i17624504/3eb8a36cf45862c6.png)
从上面的图可以看到,我们只要拿到a标签href属性值,就可以得到新闻的url,该url需要修改一下,成为完整的url,就可以访问这些url,得到新闻的内容了。
![](https://img.haomeiwen.com/i17624504/b0acdea266764514.png)
就分析到这里,下面是代码。
先引入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();
}
}
写这篇文章主要是自己想当笔记使用,也希望能帮到他人。
网友评论