java爬虫抓取网页数据( 有没有什么轻便的框架供我们使用?什么框架?)
优采云 发布时间: 2022-03-18 05:08java爬虫抓取网页数据(
有没有什么轻便的框架供我们使用?什么框架?)
Java 爬虫 (二)
前言:在上一篇博客中,我们使用了基于HttpURLConnection的方法进行数据爬取
Java爬虫(一),但是里面没有框架,通过原生http爬取,那么问题来了,有没有轻量级的框架给我们用?
Jsoup是一个Java HTML解析器,可以直接解析一个URL地址和HTML文本内容。它提供了一个非常省力的API,可以通过DOM、CSS和类似jQuery的操作方法来检索和操作数据。本篇博客将主要介绍jsoup技术进行数据爬取,为了提高效率,我们将使用多线程的方式读取数据
爬进入口
我们随便找一个网站来爬取,原理是一样的,比如我们爬取一个国家统计局的数据,首先找到爬取到的网站的页面如下:
比如我爬取天津的数据,找到要爬取的网站页面入口:
http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2018/12.html
爬行的想法
其实爬虫的代码不用太在意。首先我们理清思路,上图:
从上图可以看出我们的基本思路和流程,但是由于网站的可变性,我们不能贸然爬取,造成数据冗余。这个网页的最后一层只有文字信息,其余网页一条短信对应一条短信到一个URL地址,而在最后一层之外,每一层的数字和短信都有相同的URL,所以我们只需要爬取名字,如下:
开始爬行
请注意,我们的以下文档包路径是:
import org.jsoup.nodes.Document;
最终的项目目录结构如下:
1.只需创建一个maven项目
2.在pom.xml文件中添加如下依赖
org.jsoup
jsoup
1.11.3
3.创建主类
public class Main {
//待抓取的Url队列,全局共享
public static final LinkedBlockingQueue UrlQueue = new LinkedBlockingQueue();
public static final WormCore wormCore = new WormCore();
public static void main(String[] args) {
//要抓取的根URL
String rootUrl = "http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2018/12/1201.html";
//先把根URL加入URL队列
UrlQueue.offer(rootUrl);
Runnable runnable = new MyRunnable();
//开启固定大小的线程池,线程数为10
ExecutorService Fixed = Executors.newFixedThreadPool(10);
//开始爬取
for (int i = 0;i 3) {
System.out.println(element.text());
}
Flag++;
}
//普通页面的处理
}else {
for (Element element : elements) {
if (!Number.IsNumber(element.text())) {
Text.add(element.text());
System.out.println(element.text());
Urls.add(Before_Url + element.attr("href"));
}
}
}
//把文本集合和URL集合装到Map中返回
Message.put("text",Text);
Message.put("Url",Urls);
return Message;
}
}
由于最后一页与上一页不同,需要因地制宜地调整措施。我们把前面提到的统计划分码号扔掉了,只要名字是必填的,所以博主通过下面Number类中的方法来判断
8.判断是否为数字
<p>public class Number {
public static boolean IsNumber(String str){
for(int i=0;i=48 && c