Java爬虫之爬取多篇含有关键词的文章标题和内容

本文介绍了一款使用Java编写的爬虫,它能从维科网上抓取含有特定关键词的文章标题和内容。通过理解HTML标签,利用Jsoup库连接网页并解析,根据网页URL的变化规律获取多页内容。最终,爬取的数据被保存到TXT文件中。

实现的功能

该代码针对维科网写的爬虫,具体如果想写其它的可以照着这篇模仿来写!
在这里插入图片描述
输入想要搜索的关键字和输入关键字后的前几页页数(即输入关键字后跳转的网页的页数,如下图)
在这里插入图片描述
将包含关键字的文章标题和内容提取出来保存在一个txt文件里面(如下图,输入关键词为智能,前2页)
在这里插入图片描述
在这里插入图片描述

需要用到的jar包

获取文章信息需要的包:Jsoup
可以到https://jsoup.org/download下载,如果就想着爬虫,选择第一个就够了。
在这里插入图片描述

需要对html一些标签有一定的了解

可以到w3cschool了解html相关知识;
打开维科闻网站输入关键词后,按F12开发者工具,或者右键点击查看源,就可以看到网页的源代码。

代码设计思想

有心者应该知道我用python写过这个爬虫(python爬虫之爬取多篇含有关键词的文章标题和内容),两者有着异曲同工之妙。
1.每个网页通过Jsoup.connect(url).get请求获得网页源代码,再通过getElementsByClass()或者select()等来对源代码进行提取信息;
2.先观察每次输入关键字之后网址的变化,如我输入高新,可以发现关键字在keywords=里面,那这样可以用input后,将关键字字符串和前面的网址连接起来。
在这里插入图片描述
在这里插入图片描述
3.观察每一页的网址变化,如第三页,可以发现页数是存在pagenum=里面的(第一页可能忽略了,你可以尝试的输入http://www.ofweek.com/newquery.action?keywords=高新&pagenum=1,发现会跳转第一页),这样就可以将页数和前面2拼接后的网址再拼接起来。
在这里插入图片描述
4.接下来就是看搜索关键词后网页的源代码(F12),可以发现每个文章都是在类名为zx-tl的div块标签里面,就可以通过select(“div.zx-tl”)提取出里面的文章的标题和链接,也可以用getElementsByClass(“zx-tl”);
在这里插入图片描述
5.再将每页文章的链接访问一遍,提取出文章的内容,而再次打开每篇文章的链接,发现文章的内容都是在类名为artical-content的div块里面,通过select(“div.artical-content”)把文章的内容提取出来,也可以用getElementsByClass(“artical-content”)提取。
在这里插入图片描述
6.把文章的内容和标题写入txt文件。

源代码

package test;
import java.io.*;
import java.util.Scanner;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.util.Vector;
public class Test{
	public static Vector<String> titles=new Vector<String>();//存放文章标题
	public static Vector<String> t_contents=new Vector<String>();//存放文章内容
	public static void getTitleAndUrl(String url) {
		try {
			Vector<String> t_urls=new Vector<String>();
			Document doc = Jsoup.connect(url).get();
			Elements links=doc.getElementsByClass("zx-tl");//由于每篇文章标题都是在类名为zx-tl的div块里面,Java可以直接用getElementsByClass,当然这里也可以用select来写,select("div.zx-tl")
			Elements urls=links.select("a");//再缩短,标题和链接都在a标签里面
	        for (Element link : urls){
	            t_urls.add(link.attr("href"));//将每篇文章链接加入t_urls
	            titles.add(link.text());//将每篇文章标题加入titles
	        }
	        for(String t_url:t_urls) {
	        	Document doc2=Jsoup.connect(t_url).get();
	        	Elements contents=doc2.getElementsByClass("artical-content");
	        	t_contents.add(contents.text());
	        }
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	public static void main(String arg[]) {
		try {
			Scanner input=new Scanner(System.in);
			System.out.println("输入在维科网搜索的关键词:");
			String keyword=input.next();
			System.out.println("输入想要查找的前几页(如果输入2,即找前2页的):");
			String pagenumber=input.next();
			String txt_name="关键词:"+keyword+"前"+pagenumber+"页具体内容.txt";
			File file=new File(txt_name);
			int pagenum=Integer.parseInt(pagenumber);
			for(int i=1;i<=pagenum;i++) {
				String page=Integer.toString(i);
				String url="http://www.ofweek.com/newquery.action?keywords="+keyword+"&type=1&pagenum="+page;
				getTitleAndUrl(url);
			}
			if(!file.exists()){
				file.createNewFile();
			}
			FileWriter fileWriter = new FileWriter(file.getAbsoluteFile());
			BufferedWriter bw = new BufferedWriter(fileWriter);
			for(int i=0;i<titles.size();i++) {
				bw.write(titles.get(i));
				bw.write("\n");
				bw.write(t_contents.get(i));
				bw.write("\n\n");
			}
			bw.close();
			System.out.println("txt文件已经成功记录!");
			}
		catch(IOException e) {
			e.printStackTrace();
		}
	}	
}
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值