java原生爬虫(jsoup)

原生爬虫运用的技术主要是文本(document)节点(element)的选择

这次我爬虫的是政府采购网的采购公告(直接上代码)

采购公告列表地址:http://www.hngp.gov.cn/henan/ggcx?appCode=H60&channelCode=0101&pageSize=20


在图片上我们看到采购公告以列表的形式展示,这时按 F12 我们打开开发者工具
在这里插入图片描述
我们找到列表大概所在的布局div,我们进一步找到class='List2’的div,这个更接近列表,我们发现列表是以 ul li 的形式展示
在这里插入图片描述
== 咱们可以看到第一个li表示的图标,第二个li才是我们需要的,里面包含a标签:公告详情的链接 和公告的标题==

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 全新的界面设计 ,将会带来全新的写作体验;
  2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
  3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
  4. 全新的 KaTeX数学公式 语法;
  5. 增加了支持甘特图的mermaid语法1 功能;
  6. 增加了 多屏幕编辑 Markdown文章功能;
  7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
  8. 增加了 检查列表 功能。

上代码

== 这是个实体类的封装,把需要展示的数据提前写好==
package zhdq.pachong;
public class Caigou {
private String title;//标题
private String publishingBody;//发布机构
private String publisher;//发布人
private String publishingDate;//发布日期
private String visitsNumber;//访问次数
private String content;//内容详情路径
public void setTitle(String title) {
this.title = title;
}
public void setPublishingBody(String publishingBody) {
this.publishingBody = publishingBody;
}
public void setPublisher(String publisher) {
this.publisher = publisher;
}
public void setPublishingDate(String publishingDate) {
this.publishingDate = publishingDate;
}
public void setVisitsNumber(String visitsNumber) {
this.visitsNumber = visitsNumber;
}
public void setContent(String content) {
this.content = content;
}
public Caigou() {
super();
}
public Caigou(String title, String publishingBody, String publisher, String publishingDate, String visitsNumber,
String content) {
super();
this.title = title;
this.publishingBody = publishingBody;
this.publisher = publisher;
this.publishingDate = publishingDate;
this.visitsNumber = visitsNumber;
this.content = content;
}
@Override
public String toString() {
return “Caigou [标题:” + title + “, 发布机构:” + publishingBody + “, 发布人:” + publisher
+ “, 发布日期:” + publishingDate + “, 访问次数:” + visitsNumber + “, 链接地址:” + content
+ “]”;
}
}
== 下面是具体操作class==

package zhdq.pachong;
import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class Cg
{
public static void main( String[] args )
{
System.out.println( “Hello 采购!” );
try {
pachong3();
}catch (IOException e) {
// TODO: handle exception
e.printStackTrace();
}
}
//支持分页爬虫
public static void pachong3()throws IOException {
//设置需要下载多少页
int page = 10;//先爬取10的内容
int result = 0;
for(int i = 1; i <= page; i++) {
result = pachong_page(“http://www.hngp.gov.cn/henan/ggcx?appCode=H60&channelCode=0101&bz=0&pageSize=20&pageNo=”+i);
}
System.out.println(“爬取结束!一共爬取内容为:”+result*page+“条”);
}
private static int pachong_page(String url) throws IOException {
// TODO Auto-generated method stub
Document doc = null;
try {
doc = Jsoup.connect(url).userAgent(“Mozilla”).get();//模拟火狐浏览器
}catch (IOException e) {
// TODO: handle exception
e.printStackTrace();
}
//这里根据在网页中分析的类选择器来获取电影列表所在的节点
// Elements div = doc.getElementsByClass(“NoBorderTop”);
Elements div = doc.getElementsByClass(“List2”);
//获取电影列表
Elements lis = div.select(“li”);//查找li标签 一个li就是一条采购信息
//获取电影列表总数
int result = lis.size();
System.out.println(“采购信息列表数为:”+result);
//轮询查找每一条电影
for(Element li:lis) {
try {
Thread.sleep(1000);//让线程操作不要太快 1秒一次 时间 主要是模拟人在点击
}catch (InterruptedException e) {
// TODO: handle exception
e.printStackTrace();
}
//获取所有电影详情的连接所在的节点
// Elements tr = li.select(“tr”);
// System.out.println(“电影详情的连接所在的节点数为:”+tr.size());
//获取电影列表链接和标题
String articleUrl = li.select(“a”).attr(“abs:href”);//获取绝对路径
String title = li.select(“a”).text();//标题
if(!title.contains(“电”)) {
continue;
}
System.out.println(“文章详情链接和标题:”+articleUrl+"\t"+title);
//这里要跳过这个首页页面 否则会抛出异常
if(“http://www.hngp.gov.cn/henan/ggcx?appCode=H60&channelCode=0101&pageSize=20”.equals(articleUrl)) {
continue;
}
//进入电影列表详情页面
doc = Jsoup.connect(articleUrl).userAgent(“Mozilla”).get();//模拟火狐浏览器
//获取到文章详情页面所在的节点
Elements div1 = doc.getElementsByClass(“BorderRedTop”);
//获取文章描述
String des_title = div1.get(0).select(“h1”).text();
System.out.println(“详情文章的标题:”+des_title);
//获取文章详细信息
Elements span = div1.get(0).select(“span”);
String publishingBody = span.get(0).text();//发布机构
String publisher = span.get(1).text();//发布人
String publishingDate = span.get(2).text();//发布日期
String visitsNumber = span.get(3).text();//访问次数
Element content = doc.getElementById(“content”);//文章内容所在的节点
Elements contents = doc.getElementsByClass(“MsoNormal”);
Caigou cg = new Caigou(des_title,
publishingBody,
publisher,
publishingDate,
visitsNumber,
articleUrl);
System.out.println(cg.toString());
}
return result;
}
}
代码可以直接拷贝使用,但还需要jar,我使用的是maven项目,在pom.xml中添加这样的依赖
<dependency
<groupId org.jsoup
<artifactId jsoup
<version 1.8.3
</dependency
后面的需要自己扩展:比如把公告下载下来 ,如果需要把这些数据存到数据库可以看下面我给的链接,另外我也把自己的demo上传到资源库可以下载,如需可以加我q:1213183178咱们可以互相探讨

https://blog.csdn.net/sone94/article/details/82705467


  1. mermaid语法说明 ↩︎

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于使用Java编写网络爬虫,我们可以使用Jsoup库来进行HTML解析和数据抓取。 首先,您需要在项目中引入Jsoup库。您可以在Maven或Gradle构建工具中添加以下依赖项: Maven: ```xml <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.13.1</version> </dependency> ``` Gradle: ```groovy implementation 'org.jsoup:jsoup:1.13.1' ``` 接下来,您可以使用Jsoup来获取和解析网页内容。以下是一个简单的示例代码,演示如何使用Jsoup来爬取网页并提取所需的数据: ```java import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.IOException; public class WebCrawler { public static void main(String[] args) { try { // 使用Jsoup连接到目标网页 Document document = Jsoup.connect("http://example.com").get(); // 使用CSS选择器提取所需的元素 Elements links = document.select("a[href]"); // 遍历并打印提取到的元素 for (Element link : links) { System.out.println("Link: " + link.attr("href")); System.out.println("Text: " + link.text()); } } catch (IOException e) { e.printStackTrace(); } } } ``` 在上面的示例中,我们使用`Jsoup.connect()`方法连接到目标网页,并使用`document.select()`方法使用CSS选择器提取所有带有`href`属性的链接元素。然后,我们遍历这些链接元素,并打印出链接的URL和文本。 您可以根据自己的需求进一步扩展和修改代码来满足特定的爬虫需求。请注意,在编写爬虫时,请遵守相关网站的使用条款和政策,以避免违反规定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值