java 爬虫之使用jsoup爬取页面

爬虫其实很简单!——网络爬虫快速实现(一) 今天我来带领大家一起学习编写一个网络爬虫!其实爬虫很简单,没有想象中那么难,也许所有学问都是这样,恐惧源自于无知。废话不多说,现在开始我们的爬虫之旅吧。爬虫是什么?我们时常听说编程大牛嘴边一直念叨着“网络爬虫“,那网络爬虫究竟是何方神圣呢? 网络爬虫能够模仿用户浏览网页,并将所想要的页面中的信息保存下来。有些同学不禁要问:“我自己浏览网页,可以手动将数据保存下来啊,为何要写个程序去爬取数据呢?“道 阅读详情

需求:

爬取出所有号段,并找到他们对应的运营商和所属地。

添加依赖:

       <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.9.2</version>
        </dependency>

        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.3</version>
        </dependency>

实现代码:

package com.deeplinkJavaSpider.MainPageSpider;

import org.apache.commons.lang.StringUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.*;

public class numberRegex {
    public static String outputPath="C:\\Users\\lenovo\\Desktop\\a1.txt";

    /**
     *
     * @param urlString
     * @return
     * @throws IOException
     */
    public static StringBuilder openUrl(String urlString) throws IOException {
        URL url = new URL(urlString);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        BufferedReader in = null;
        String userAgent = getUserAgent(); //随机获取ua
        StringBuilder result = new StringBuilder();

        try {
            // 设置通用的请求属性
            connection.setRequestProperty("accept", "*/*");
            connection.setRequestProperty("connection", "Keep-Alive");
            connection.setRequestProperty("user-agent", userAgent);
            // 建立实际的连接
            connection.connect();

            // 定义 BufferedReader输入流来读取URL的响应
            in = new BufferedReader(new InputStreamReader(
                    connection.getInputStream(), "gbk")); //设置编码,如果不设置应该是utf8
            String line;
            while ((line = in.readLine()) != null) {
                result.append(line);
            }
        } finally {        // 使用finally块来关闭输入流
            try {
                if (in != null) {
                    in.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
      return result;
    }

    /**
     *
     * @return  获得随机选择的UA
     * @throws IOException
     */
    public static String getUserAgent() throws IOException {
        List<String> list = new ArrayList<>();
        InputStreamReader reader = new InputStreamReader(new FileInputStream("src//main//resources//user-Agent.txt"));
        BufferedReader bufferedReader = new BufferedReader(reader);
        String lineTxt = null;
        while ((lineTxt = bufferedReader.readLine()) != null) {
            list.add(lineTxt);
        }
        reader.close();
        Random random = new Random();
        String userAgent = list.get(random.nextInt(list.size()));
        return userAgent;
    }
    /**
     *
     * @param urlString  url字符串
     * @throws Exception
     */
    public static void doFetchPage(String urlString) throws Exception {
        StringBuilder result=openUrl(urlString);
        spiderMainPage(result.toString());
    }

    /**
     *
     * @param html   爬取到的主页面信息
     * @throws Exception
     */
    public static void spiderMainPage(String html) throws Exception {
        Map<String, String> map = new HashMap<>();
        Document doc = Jsoup.parse(html);
        Elements elements1 = doc.select("div.fkce");
        Elements elements2 = elements1.select("div.fkt");
        for (Element e : elements2) {
            String province = e.select("div.fkbj").text();
            Elements elements3 = e.select("div.fklk").select("a");
            for (Element c : elements3) {
                String city = c.text();
                String href = c.attr("href"); //爬取到div.fklk下的所有链接
                map.put(province + "-" + city, href);
            }
        }
        doFetchNextPage(map);

    }

    /**
     *
     * @param map   以省份-城市为key  对应的链接为value
     * @throws Exception
     */
    public static void doFetchNextPage(Map<String, String> map) throws Exception {
        for (Map.Entry<String, String> entry : map.entrySet()) {
            StringBuilder result=openUrl(entry.getValue());
            spiderDeepLinkPage(result.toString(), entry.getKey());
        }

    }

    /**
     *
     * @param html 针对链接爬取到的所有信息
     * @param province  省份-城市 信息
     * @throws Exception
     */
    public static void spiderDeepLinkPage(String html, String province) throws Exception {
        Map<String, String> map = new HashMap<>();
        List<String> listKey = new ArrayList<>();
        List<String> listValue = new ArrayList<>();
        Document doc = Jsoup.parse(html);
        Elements elements1 = doc.select("body > div.all>ul");
        Elements elements2 = doc.select("body > div.all >div>div.num_bg ");
        for (Element element : elements1) {
            listKey.add(element.text());
        }
        for (Element element : elements2) {
            listValue.add(element.text().substring(3, 5) + "-" + province);
        }
        for(int i=0;i<listKey.size();i++){   //合并两个list称为一个map ,使用Java8的lambda 表达式更好
            map.put(listKey.get(i),listValue.get(i));
        }
       writeInfo(map);
    }

    /**
     *
     * @param map  key为号段组成的字符串 value 为 运营商-省份-城市
     * @throws Exception
     */
    public static void writeInfo(Map<String,String> map) throws Exception {
        StringBuffer sb = new StringBuffer();
        File outputFile = new File(outputPath);
        BufferedWriter bufferedWriter=null;
        if(outputFile.exists()) {
            bufferedWriter = new BufferedWriter(new FileWriter(outputFile,true));
        }else {
            bufferedWriter = new BufferedWriter(new FileWriter(outputFile));
        }
        for(Map.Entry<String,String> entry:map.entrySet()){
            String[] str=entry.getKey().split(" ");
            for(String s:str){
                if(StringUtils.isNotBlank(s)) {
                    bufferedWriter.write(s+":"+entry.getValue()+"\n");
                }
            }

        }
        bufferedWriter.close();
    }



    public static void main(String[] args) throws Exception {
        doFetchPage("http://www.51hao.cc/");
    }


}

结果截图:

 

本代码中建立连接时采用的是   HttpURLConnection connection = (HttpURLConnection) url.openConnection();

除了HttpIURLConnection ,还可以采用HttpClient.

HttpClient建立连接代码:

 public static HttpResponse doPostConnect(HttpClient httpClient, String url, String params, String encoding) throws Exception {
        // 建立HTTP Post连线
        HttpPost httpPost = new HttpPost(url);
        // 设置post请求的参数
        //post.setHeader("MaxRTB­version", "1.0");
        //  设置post中的参数
        StringEntity paramsEntity = new StringEntity(params,encoding);
        paramsEntity.setContentType("application/x-www-form-urlencoded");
        httpPost.setEntity(paramsEntity);
        HttpResponse res = httpClient.execute(httpPost);
        return res;//HttpResponse 类型
    }

 

 

jsoup分页爬取网页 jsoup分页爬取网页,jsoup分页爬取网页jsoup分页爬取网页内置jsoup所需要的jar包 立即下载

相关推荐

jsoup爬取分页文章信息

通过jsoup抓取分页的文章信息,通过循环访问下一页的url来进行获取,详细描述见博文http://blog.youkuaiyun.com/bbs_baibisen/article/details/78789118

jsoup的Document类

随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666) 一、简介 Document是一个装载html的文档类,它是jsoup一个非常重要的类。类声明:public class Documentextends Element 。Document是Node间接子类,而N...

孤云博客 4981

jsoup实现爬取一个完整的网站,并保存到本地

用jsoup实现爬取一个完整的网站,包含网站里的所有链接内容,会另存为html到本地,js和css文件也会保存到本地,可以直接在本地打开查看一个完整的网站。 eclipse项目,可以直接导入修改。 提供一个链接和保存爬取后的网页保存位置即可。

爬虫自动滚动下一页JS控制

在写爬虫程序的时候,会遇到一些特殊情况,比如,爬取某些网页的时候,网页当前页面是不存在下一页的按钮,当你将下拉框拉到底部时,JS会自动加载下一页的内容,这种情况下,调用爬虫的话,无法通过获取下一页的按钮标签点击下一页来进入下一页,例如:推特。所以这篇博文就是解决此问题的。 需要jar包:selenium static { System.setProperty("webdriver.chrome...

weixin_43923436的博客 1万+

fpga进阶--时序约束

1、基础概念 1.1 建立(setup)/保持(hold)时间 上述的锁存沿会将数据保存下来,但是必须要满足一定的条件: 建立时间Tsu:在时钟有效沿之前,数据必须保持稳定的最小时间; 保持时间Th:在时钟有效沿之后,数据必须保持稳定的最小时间; 1.2 亚稳态(Metastability) 亚稳态是由于违背了触发器的建立和保持时间而产生的,设计中任何一个触发器都有特定的建立和保持时间,在时钟上升沿前后的这段时间窗口内,数据输入信号必须保持稳定。如果信号在这段时间内发生了变化,那么输...

HHH的博客 2443

STorM BGC V1.31硬件+SimpleBGC固件:从零搭建三轴云台开发环境(Keil+JLink避坑指南)

本文详细介绍了如何从零搭建STorM BGC V1.31硬件+SimpleBGC固件的三轴云台开发环境,涵盖硬件连接、Keil+JLink开发工具配置、固件编译与烧录等关键步骤,并提供了常见问题的解决方案和调试技巧,帮助开发者快速上手三轴云台开发。

weixin_28693683的博客 380

Java使用Jsoup实现一个网页爬虫

Jsoup是一个开源的Java HTML解析库,用于从网页中提取和操作数据。4. 支持HTML5:Jsoup对HTML5的解析和处理支持良好,能够处理复杂的HTML结构。3. 支持CSS选择器:可以使用像jQuery一样的CSS选择器来定位和操作HTML元素。1. 简单易用:Jsoup提供了简单的API,使得从HTML中提取数据变得十分容易。2. 高效:Jsoup内部使用了优化的算法,可以快速解析和处理HTML文档。5. 可靠稳定:Jsoup经过多年的开发和测试,已被广泛使用和验证。

xiaocxyczh的博客 852

激光SLAM总结——Fast LIO / Fast LIO2 / Faster LIO

激光SLAM总结——Fast LIO / Fast LIO2 / Faster LIO 在之前的工作中有接触过LOAM,最近在工作中又接触到Faster LIO相关的工作,于是想着对Fast LIO / Fast LIO2 / Faster LIO这一系列工作进行一个简单的总结,以加深自己对激光SLAM算法的理解,之前总结过的一些和激光SLAM算法相关的博客还有,感兴趣的同学可以一起学习讨论: 激光SLAM总结——VLOAM / LIMO算法解析 激光SLAM总结——LIO-Mapping / LIOM /

weixin_44580210的博客 1万+

使用 Jsoup 构建你的第一个 Java 爬虫

Jsoup是一个非常流行的 Java HTML 解析库,它能让我们从网页中抓取和解析数据。Jsoup 提供了许多简单易用的 API,用来处理 HTML 文档中的各种元素,比如表单、链接、图片、表格等等。简单易用:只需要几行代码就能完成网页的抓取和解析。功能强大:支持 CSS 选择器、DOM 操作、数据提取等。高效稳定:处理大型 HTML 文档时表现出色。

一碗黄焖鸡三碗米饭的博客 2186

如何利用VS2017创建一个简单的窗口

#如何利用VS2017创建一个简单的窗口 1、新建->Windows桌面向导 2、应用程序类型->桌面应用程序,点击确定 3、点击调试->开始调试 可建立如下图的窗口 4、可以在生成的项目文件的中找到windows17_2的应用程序,打开界面如下: 注:新建空白项目也可以,注意在解决方案资源器中添加.cpp文件,如源.cpp文件,下载代码见博文 ...

weixin_46894139的博客 2914

Chrome红页误报?手把手教你通过Search Console快速解除安全警告

本文详细解析了Chrome红页误报的常见原因及解决方案,重点介绍如何通过Google Search Console快速解除安全警告。内容涵盖误报诊断、技术修复、申诉技巧及长效预防措施,帮助网站管理员有效应对Google Safe Browsing的误判问题,确保网站安全状态快速恢复。

a1b2c的博客 993

Java爬虫——使用HttpClient+jsoup实现

jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

qq_51386003的博客 671

【PCL 特征】积分图法线估计

本文介绍了基于积分图的有序点云法线估计方法。通过利用点云数据的行列式结构特性,该方法避免了传统KD树搜索,采用积分图将邻域统计运算复杂度从O(k²)降至O(1)。详细阐述了四种法线估计算法:协方差矩阵法(精度最高)、平均3D梯度法(实时性好)、平均深度变化法(适合SLAM)和简单3D梯度法(速度最快)。重点分析了积分图构建、动态窗口平滑处理、法线方向调整等关键技术,并提供了PCL实现代码示例。实验表明,不同方法在精度和速度上存在显著差异,可根据具体应用场景选择合适算法。

yijiujiusan的博客 276

java jsoup爬取动态网页_java网络爬虫-利用phantomjs和jsoup爬取动态ajax加载页面

java基于windows爬取ajax加载的动态页面需要一定的辅助工具支持,本文爬取ajax加载的动态页面所使用的工具是phantomJS(关于phantomJS的介绍百度一大堆)下载之后解压文件,为了后面方便使用建议单独放在一个文件夹里面,例如我这边是放在F盘下面单独的文件夹phantomjs,然后进入phantomjs--bin点击运行phantomjs.exe,出现一下界面: 即表示可以正常...

weixin_42347629的博客 1247

【K8S系列】Kubernetes 中 Pod 无法通过 Service 名称访问服务的 DNS 解析失败问题【已解决】

在 Kubernetes 中,Service 提供了一种稳定的方式,通过名称访问一组 Pod。当其他 Pod 无法通过 Service 名称访问服务,并且出现 DNS 解析失败时,通常会导致应用无法正常工作。本文将详细分析此问题的常见原因及其解决方案。

颜淡慕潇 1万+

【DaVinci Developer工具实战】03 -导入xml文件

本文档描述了 DaVinci Developer 导入数据的的具体功能 ,它适用于导入AUTOSAR SWC 模板【AUTOSAR XML 文件】 文件。

1991

phantomjs java 爬虫_java网络爬虫-利用phantomjs和jsoup爬取动态ajax加载页面

java基于windows爬取ajax加载的动态页面需要一定的辅助工具支持,本文爬取ajax加载的动态页面所使用的工具是phantomJS(关于phantomJS的介绍百度一大堆)下载之后解压文件,为了后面方便使用建议单独放在一个文件夹里面,例如我这边是放在F盘下面单独的文件夹phantomjs,然后进入phantomjs--bin点击运行phantomjs.exe,出现一下界面:即表示可以正常运...

weixin_39654245的博客 455

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

java jsoup爬动态网页_java网络爬虫-利用phantomjs和jsoup爬取动态ajax加载页面

java基于windows爬取ajax加载的动态页面需要一定的辅助工具支持,本文爬取ajax加载的动态页面所使用的工具是phantomJS(关于phantomJS的介绍百度一大堆)下载之后解压文件,为了后面方便使用建议单独放在一个文件夹里面,例如我这边是放在F盘下面单独的文件夹phantomjs,然后进入phantomjs--bin点击运行phantomjs.exe,出现一下界面:即表示可以正常运...

weixin_34907135的博客 610

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Java爬虫之学习篇 Jsoup爬取页面

写一篇有关jsoup的总结: jsoup官方的文档:https://www.open-open.com/jsoup/ 这是一篇中文的文档,非常值得看 jsoup抓取页面的3种方法; 二、parse 三、Jsoup.connect(url),用的比较多 分析一下抓取的页面,页面的请求的方式。一般为两种 get,post请求. get请求直接将参数直接放在url中 : Document doc ...

qq_42082278的博客 826

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

java爬虫京东商品,Java爬虫实现爬取京东上的手机搜索页面 HttpCliient+Jsoup

1、需求及配置需求:爬取京东手机搜索页面的信息,记录各手机的名称,价格,评论数等,形成一个可用于实际分析的数据表格。使用maven项目,log4j记录日志,日志仅导出到控制台。maven依赖如下(pom.xml)?log4j配置(log4j.properties),将info及以上等级信息输出到控制台,不单独设置输出文档。?2、需求分析与代码2.1需求分析第一步,建立客户端与服务端的连接,并通过u...

weixin_39558391的博客 393

Java爬虫,调用Chrome、Firefox获取页面信息使用Jsoup解析,以及Jsoup爬取简单页面

** Java爬虫,调用Chrome、Firefox获取页面信息,以及Jsoup解析 ** 前言: 有一些网站有反爬机制,这样的情况下我们需要使用模拟真实的浏览器去访问页面,在linux环境下,需要设置浏览器无头模式。但是有一些网站反爬做的比较好,会判断谷歌浏览器的无头模式,因此可以换火狐浏览器试试。 一、java 调用Chrome(谷歌浏览器)爬取页面 1.本地装有谷歌浏览器和ChromeDriver chromedriver地址:http://npm.taobao.org/mirrors/chromed

weixin_43025522的博客 2980

Java网络爬虫,了解一哈?

最近在面试,发现Java爬虫对于小数据量数据的爬取的应用还是比较广,抽空周末学习一手,留下学习笔记 Java网络爬虫 简单介绍 爬虫我相信大家都应该知道什么,有什么用,主要的用途就是通过程序自动的去获取获取网上的信息数据,写爬出比较出色的就是PY,但是对于小排量的数据而言,java也是可以满足要求的; HttpClient发起请求 爬虫爬取网页上的数据和我们单独点击链接访问网页...

weixin_30600503的博客 228

13-网络爬虫

13 网络爬虫、爬取策略、http协议、爬虫京东案例

m0_59939643的博客 629

java 手机网页_Java爬虫: 爬取京东上的手机搜索页面 HttpClient+Jsoup

1.需求及配置需求:爬取京东手机搜索页面的信息,记录各手机的名称,价格,评论数等,形成一个可用于实际分析的数据表格。使用Maven项目,log4j记录日志,日志仅导出到控制台。Maven依赖如下(pom.xml)1 2 3 org.apache.httpcomponents4 httpclient5 4.5...

weixin_35044945的博客 247

谈谈Java爬虫

说起网络爬虫,大家想起的估计都是 Python ,我在没有接触Java爬虫之前也是只听过python是为爬虫而生。于是我就在网上查询有关于Java爬虫的资料,不查不知道一查吓一跳,其实 Java 也能做网络爬虫并且还有专门的库,并且Java在某些复杂页面做爬虫还能做的非常好,在开源社区中有不少优秀的 Java 网络爬虫框架,例如 webmagic。

qq_43649799的博客 1212

java 爬虫_Java爬虫(1)-Jsoup入门_技术交流

1.网络爬虫概述.什么是爬虫简单的说,网络爬虫就是使用程序模拟人浏览网页的行为,并把看到的数据采集并整理下来。 从功能上讲,爬虫程序一般分为三个步骤,采集,处理,存储。爬虫从一个或若干初始网页的URL开始,获得原始页面数据;针对页面内容进行分析并筛选页面的有效数据;把数据整理并持久化。.爬虫的作用搜索引擎:爬虫自动地采集互联网中的信息,采集回来后进行相应的存储或处理,在需要检索某些信息的时候...

weixin_39613824的博客 97
上一篇: Java 线程学习
下一篇: Java json 字符串处理
date-date
博客等级 码龄9年 6粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值