Java数据采集-7.Ajax无刷新请求(翻页-3)

告别JeasyOPC!用Eclipse Milo搭建Java OPC UA客户端,实测性能碾压传统方案 本文深入探讨了Eclipse Milo OPC UA在Java工业数据采集中的应用与性能优势。通过对比传统JeasyOPC方案,Milo在并发处理、内存管理和错误恢复等方面表现卓越,实测性能显著提升。文章还提供了详细的实战指南和迁移建议,帮助开发者高效构建稳定的OPC UA客户端。 阅读详情

本次抓取地址:http://www.iconfont.cn/
项目源码:https://github.com/geekfly2016/Spider
代码目录:Spider/src/xyz/geekfly/get_list/IconFont.Java

本篇继上述博客,介绍Ajax无刷新加载数据的方式,抓取阿里巴巴矢量图库。
技术重点:

  • HttpClient 模拟请求
  • FastJson 处理Json格式的数据

(由于此处需要模拟Post请求,并且包含请求头信息和参数,Jsoup已经无法满足需求,其主要适用于数据解析,故此代码使用HttpClient模拟请求)
上述技术请自行学习,此处指包括使用。
本代码以来多个Jar包,已更新在Lib中。
这里写图片描述

1.分析请求

打开目标网页,输入Java关键字,打开Chrome的开发者工具,点击页码,看到如下请求:
这里写图片描述


General中数据如下:

Request URL:http://www.iconfont.cn/api/icon/search.json
Request Method:POST
Status Code:200 OK
Remote Address:140.205.34.99:80
Referrer Policy:no-referrer-when-downgrade

分析:
加载数据的Url为:http://www.iconfont.cn/api/icon/search.json
请求方式:Post


请求头(Request Header)中数据如下(Cookie数据过长,有删减):

Accept:application/json, text/javascript, */*; q=0.01
Accept-Encoding:gzip, deflate
Accept-Language:zh-CN,en-US;q=0.8,en;q=0.6,zh;q=0.4
Connection:keep-alive
Content-Length:98
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
Cookie:UM_distinctoDITj
Host:www.iconfont.cn
Origin:http://www.iconfont.cn
Referer:http://www.iconfont.cn/search/index?q=java&page=1
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36
X-Requested-With:XMLHttpRequest

在模拟请求中,一般使用到的参数有:
Cookie,Host,Referer。
User-Agent就不用说了,这个是必须的。
所以下文代码中使用的参数,就是在浏览器里面直接拷贝的上述值。

  • 并不是所有的请求都需要加上述参数
  • 不同的网站也会有不同的参数
  • 有些动态的数据需要动态生成

和网站的安全机制有关,若发现请求获取不到数据,或返回错误的数据时,需考虑参数问题,先尝试把必须添加的参数加上,如果不行再继续添加其他参数,不断尝试可以获取正常的数据为止。
(个人比较懒,最开始不加参数,不能获取数据在添加,或者你也可以每个网站都加上所有的参数)


请求参数:

q:java
sortType:updated_at
page:1
pageSize:54
t:1502713725794
ctoken:bL67K02mQl16IlJizxgeicon-font

请求参数一般需要全部添加

  • 注意区分和请求头(Request Header)的区别
  • 注意请求参数是Json类型还是字典类型

2.编写请求函数

  • 创建HttpClient和HttpPost

    HttpClient httpClient = new DefaultHttpClient();
    HttpPost post = new HttpPost(url);

  • 设置Request header

    ```
    //以下参数因不同网站安全监测机制不同,所要求带的参数也不尽相同
    post.setHeader("Content-Type", "application/json;charset=UTF-8");
    post.setHeader("Host", "www.iconfont.cn");
    post.setHeader("Cookie", "UM_distinctid=15d5d87f8534ugkekhk9Vw");
    post.setHeader("Referer","http://www.iconfont.cn/search/index?q=java&page=2");
    post.setHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
    ```
    

  • 设置Data

    ```
    List<NameValuePair> params = new ArrayList<NameValuePair>();  
        //变化参数
        params.add(new BasicNameValuePair("page", String.valueOf(page_number))); //传入页码
        params.add(new BasicNameValuePair("q", "java")); //检索关键字
        //固定参数
        params.add(new BasicNameValuePair("cityEname", "henan")); 
        params.add(new BasicNameValuePair("sortType", "updated_at"));
        params.add(new BasicNameValuePair("pageSize", "54")); //每页条数 54
        params.add(new BasicNameValuePair("t", String.valueOf(new Date().getTime()))); //当前时间戳 1502713082550
        params.add(new BasicNameValuePair("ctoken", "bL67K02mQl16IlJizxgeicon-font"));
    
        post.setEntity(new UrlEncodedFormEntity(params,Consts.UTF_8)); 
    ```
    

  • 获取Entity

    HttpResponse response = httpClient.execute(post);
    int statusCode = response.getStatusLine().getStatusCode();
    if(statusCode != 200){
        System.out.print(statusCode);
        return null;
    }
    HttpEntity entity = response.getEntity();
    String result = null;
    if (entity != null) {
        result = EntityUtils.toString(entity, "utf-8");
    }
    EntityUtils.consume(entity);
    return result;

3.调度函数

  • 初始化参数和构造循环体

    String url = "http://www.iconfont.cn/api/icon/search.json";
    String keyword = "java"; //查询条件
    Integer page_number = 1; //起始页数
    
    while(true){
        String json = Post(url, page_number);
        Map<String, Object> data = JsonUtil.JsonToMap(json);
        //解析数据
    }

  • 返回数据格式
    这里写图片描述

  • 解析返回数据

    • 查看是否出错

      if(data.isEmpty() || Integer.parseInt(data.get("code").toString()) != 200){
                      System.out.println("获取第" + page_number + "页数据出错!!");
                      break;
                  }
    • 获取键值对

      //上述结构的一个data键所对应的值
                  Map<String, Object> data_key = (Map<String, Object>) data.get("data");
                  //data中的icons键所对应的值
                  List<Map<String, Object>> icons = (List<Map<String, Object>>) data_key.get("icons"); 
    • 处理数据

      //{data={"count":103,"icons":[]}, code=200}
      if(icons.isEmpty()){
              System.out.println("结束,共计:" + data_key.get("count")); 
              break;
      }else{
          for(Map<String, Object> icon: icons){
              //可以在此处进行数据解析
              System.out.println(icon); 
              //可根据icon.get("")方式获取各个值
          }
          System.out.println("第" + page_number + "页,数据:" + icons.size() + "条数据");
      
          page_number++; //继续下一页
      }
    • 输出

      第1页,数据:54条数据
      第2页,数据:49条数据
      结束,共计:103
      

翻页系列到此结束,接下来更新模拟登录。

PC数据采集三支柱:API调用、网页解析与自动化模拟实战 数据采集是现代数据分析和AI应用的基础能力,其本质是通过标准化接口(API)、结构化文档(HTML/XML)或交互式行为(浏览器自动化)从目标系统中可靠获取原始数据。理解HTTP协议、DOM树解析原理与前端渲染机制,是构建稳定采集链路的前提;掌握认证鉴权、反爬适配与错误重试等工程实践,才能保障数据入口的可持续性。技术价值不仅在于‘能拿到’,更在于‘拿得稳、可维护、合规范’。典型应用场景包括市场竞品监控、学术文献追踪、本地生活数据聚合等。本文聚焦普通PC环境下的轻量级、高可控性方案,深度融合requests、 阅读详情

相关推荐

Python Selenium自动化网页浏览实战:从环境搭建到数据采集

网页自动化技术是现代软件工程和数据分析领域的基础能力,它通过程序模拟真实用户操作浏览器,实现任务的自动化执行。其核心原理基于浏览器控制协议,允许外部程序发送指令来驱动浏览器进行导航、点击、输入等交互。这项技术的价值在于将重复性的人工操作转化为可编程、可调度、可复用的数字流程,显著提升工作效率和准确性。在应用场景上,它广泛覆盖了自动化测试、数据采集、业务流程自动化等多个领域。本文聚焦于Python Selenium这一经典组合,深入解析其工具链构成,并通过实战项目演示如何构建健壮的自动化数据采集任务,其中涉及

weixin_30635053的博客 368

AJAX,无需刷新获取数据

在学AJAX、nodejs、es6这些知识都会互相嵌套,如果想要速成的话我觉得应该先把一个东西学好,嵌套的先记下笔记,然后再学下一个,再把嵌套的记下,以此类推。当你学完所有的东西,综合来看嵌套的内容,就会更好理解。

SnowTT_的博客 1477

Web Scraping底层思维框架:用5W1H重构数据采集决策体系

Web Scraping(网络爬虫)本质是面向目标网站的数据工程实践,其核心不在代码实现,而在系统性问题界定——即Who(网站技术画像)、What(数据语义定义)、Why(业务与合规动因)、Where(数据落点架构)、When(时间维度建模)和How(风险可控的技术选型)。掌握这六大元问题,才能穿透反爬表象、规避法律风险、保障数据可持续性,并支撑从单机解析到分布式实时采集的演进。本文聚焦真实项目中的决策逻辑,详解如何基于网站类型识别(如SPA、静态站、内容社区)匹配采集策略,结合Playwright动态渲染

记录技术点点之路 603

java ajax无刷分页_简单实现Ajax无刷新分页效果

Ajax无刷新分页效果,如下代码实现Ajax无刷新分页效果function showpage(url) {var xhr = new XMLHttpRequest();xhr.onreadystatechange = function () {if (xhr.readyState == 4) {document.getElementById("result").innerHTML = xhr.re...

weixin_30666313的博客 979

Selenium实战:高效采集动态新闻网站数据的完整方案

在数据采集与网络爬虫领域,动态网页内容的获取是一个常见的技术挑战。其核心原理在于,现代网站普遍采用JavaScript进行异步数据加载和页面渲染,传统的基于HTTP请求和HTML解析的静态爬虫技术难以直接获取完整的页面内容。这催生了对浏览器自动化工具的需求,其技术价值在于能够模拟真实用户操作,执行页面中的JavaScript代码,从而获取完全渲染后的DOM结构,实现数据的准确抓取。在舆情监控、内容聚合、市场分析等应用场景中,稳定、高效地采集新闻、商品、社交媒体等动态内容至关重要。本文聚焦于使用Seleniu

weixin_34162228的博客 370

Playwright与Selenium组合拳:破解电商反爬虫的实战细节

在数据采集和自动化测试领域,反爬虫机制是开发者必须面对的核心挑战。其基本原理是通过检测请求特征、浏览器指纹和用户行为模式来区分机器人与真实用户。为了有效应对,工程师需要掌握浏览器自动化、网络协议分析和行为模拟等技术。这些技术的核心价值在于实现稳定、高效且不易被封锁的数据获取与测试流程,广泛应用于市场分析、价格监控和UI自动化等场景。本文聚焦于如何巧妙结合Playwright的低检测特性与Selenium的成熟生态,通过精细化伪装浏览器上下文、模拟人性化网络请求与页面行为等关键细节,构建出能够绕过常见电商反爬

z466459262的专栏 442

JavaWeb开发之Ajax省市联动&无刷新分页

我们在上一节课已经和大家讲解过Ajax的使用,大家可以去看下该篇文章,今天也主要是一个拓展延伸,使用Ajax去完成无刷新省市联动和无刷新分页。 案列:使用Ajax完成无刷新分页 数据库数据 create sequence seq_goods; create table bs_GOODS ( ID NUMBER not null primary key, NAME VARCHAR2(20.

m0_65725031的博客 382

51job与前程无忧招聘数据采集、清洗及多维度可视化分析实战包

直接可用的招聘数据分析实践资源,包含从51job和前程无忧批量抓取的真实岗位数据(CSV格式),字段涵盖岗位名称、公司名、薪资区间、学历要求、工作经验年限等;提供完整Python处理链:前程无忧爬虫脚本(前程无忧.py)、Jupyter Notebook清洗流程(数据清洗.ipynb)、统计分析逻辑(数据分析.ipynb)以及多种可视化成果——工作经验分布饼图、学历需求柱状图、福利关键词词云、岗位高频词云,还内置基于ECharts的交互式总览页(index.html),所有HTML和Notebook均无需部

go5gopher的博客 263

java ajax无刷分页_利用AJAX实现无刷新数据分页

以前在使用Asp.Net的时候用过GridView这个控件,这个控件自带分页的功能,虽然很丑,但是功能还是很强大的。这里呢,给大家展示一下更加给力的方式——利用AJAX无刷新直接从服务器获取数据分页。一、实现过程注意:一下的内容都是在服务器内使用的。首先要在服务器的路径下建立几个文件,比如,page1.txt,page2.txt,page3.txt。每个文件中放入数组,如下:[{user:'blu...

weixin_31755771的博客 272

Selenium实战:金融数据采集与反爬策略全解析

网络爬虫是自动化获取网页数据的关键技术,其核心原理在于模拟浏览器请求并解析响应内容。在动态网页和反爬机制日益复杂的场景下,传统请求库难以应对JavaScript渲染和自动化检测。Selenium作为浏览器自动化工具,通过驱动真实浏览器执行操作,能有效绕过反爬策略,确保数据采集的稳定性和准确性。这一技术对于金融数据分析、市场研究等领域具有重要价值,能够为Data2Text模型等下游任务提供高质量的结构化数据源。本文以同花顺财报采集为例,详细解析了Selenium在动态页面处理和反反爬实践中的应用,涵盖了浏览器

weixin_33874713的博客 375

Java Ajax 无刷新分页实例(完整版)

使用ajax 实现无刷新分页,指定页码跳转等……内置sql!适合练习参考……

Java数据采集-4.分析常见的翻页(加载数据)方式

本篇文章主要分析当下常见的几种翻页(加载数据)的方式,并结合实际例子和截图介绍。在后续博客中针对这些网站,写代码完成数据抓取。 1. 根据页码进行翻页 如优快云的个人博客列表,我们可以轻松的分析出总页数和列表页地址。 共两页,列表页地址为:http://blog.csdn.net/TMaskBoy/article/list/2 对于此类型的网页,我们只需要根据总页数,遍历所有的列表页即可,

geekfly的Blog 2021

ajax请求后台数据实现分页功能

ajax请求后台数据实现分页功能

Java数据采集-Jsoup抓取开源中国

使用JSoup 解析网页,语法使用 JS,css,Jquery 选择器语法,方便易懂  1.导入Jsoup所依赖的jar包。官网下载地址如下:  http://jsoup.org/packages/jsoup-1.8.1.jar  2.在main函数中使用Jsoup获取网页源码  String url = "http://www.oschina.net/news/list";

蓝星花 1743

MATLAB实战:用ARMAX模型搞定电力系统惯量评估(附完整代码)

本文详细介绍了如何利用MATLAB中的ARMAX模型进行电力系统惯量评估,解决新能源占比提高带来的系统惯量下降问题。通过系统辨识技术,从电网运行数据中准确提取惯量参数,并提供完整的代码实现,帮助工程师快速应用于实际工程。

peach的博客 637

K-近邻算法: k-nearest neighbor classification (kNN) 详细介绍

@创建于:2020.04.09 @修改于:2020.04.09,2024.06.22 文章目录1、kNN介绍2、k近邻法的三要素详解2.1 距离度量2.2 k值的选择2.3 分类决策规则3、k近邻法的实现:kd树4、Python实现过程5、优缺点6、常见问题 1、kNN介绍 kNN是一个基本而简单的分类算法,作为监督学习,那么KNN模型需要的是有标签的训练数据,对于新样本的类别由与新样本距离最近的k个训练样本点按照分类...

chenhepg的博客 9万+

Java与Selenium自动化实战:从Web测试到数据采集的完整指南

Web自动化是提升软件质量和开发效率的关键技术,其核心原理是通过程序模拟用户操作,实现对浏览器行为的精准控制。在众多技术方案中,Selenium因其对W3C WebDriver协议的支持和跨浏览器兼容性,成为行业标准。结合Java这一企业级编程语言,能够构建出稳定、可维护的自动化解决方案,其技术价值在于既能执行端到端(E2E)的UI自动化测试,确保应用功能稳定,又能作为强大的动态网页数据采集工具,处理传统HTTP客户端难以应对的JavaScript渲染和复杂交互场景。本文聚焦于Java与Selenium的组

weixin_30873847的博客 696

Simpack实战:5分钟搞定轨道车辆车轮不圆的3种定义方法(附详细参数设置)

本文详细介绍了在Simpack中定义轨道车辆车轮不圆的3种高效方法:Radius deviations、Fourier coefficients和Harmonic function,并提供了详细的参数设置指南。通过实战案例和参数优化技巧,帮助工程师快速掌握车轮不圆度的定义与仿真,提升轨道车辆动力学分析的准确性和效率。

weixin_29292535的博客 202

python获取单选框的值_Python功能太强大,我劝你最好别学

上篇推文我们介绍了一下Python的特点和功能,看完的小伙伴都知道Python貌似很强大,却不知道该如何去用,那我们今天来做个案例吧,沙发准备好,我要开始了哦。基于Requests和Ajax分析法的新浪微博内容及用户信息爬取1 项目介绍新浪微博:新浪微博是一个由新浪网推出,提供微型博客服务类的社交网站。用户可以通过网页、WAP页面、手机客户端、手机短信、彩信发布消息或上传图片。新浪可以把...

weixin_39612720的博客 423

STM32 ST-LINK Utility 无法烧录程序的解决方法

当你打开STM32 ST-LINK Utility,硬件连接好st-link V2,打开了要烧写的文件,点那个Program verify烧录时, 如果出错了: Programming error @ 0x08000000! 我的方法是: 点你想要烧录那个HEX文件的小格,复制 然后去到你前面的文件的格子里,点粘贴: 成功! ...

wocute的博客 9521

远心F-theta镜ZEMAX设计

根据给出的F-theta镜的设计指标,对F-theta镜进行了具体的光学设计。从对F-theta镜设计思想的介绍出发,对选取的初始结构进行了优化设计,优化完成后,对所设计的F-theta镜进行了像质评价,通过点列图、场曲与畸变图、相对照度、能量集中度对所设计的F-theta镜进行了分析,最终,对F-theta镜的设计效果进行了验证。

hitliuyi17的博客 9428

Python爬虫实战:破解企查查反爬的三种核心方法与工程实践

网络爬虫是自动化获取互联网公开数据的关键技术,其核心原理是通过模拟HTTP请求与解析响应来提取结构化信息。在数据驱动决策的背景下,高效、稳定地获取企业工商信息等商业数据具有重要价值,广泛应用于市场分析、风险控制等场景。然而,以企查查为代表的商业数据平台部署了复杂的反爬机制,如请求头校验、IP频率限制和动态参数加密,对传统爬虫构成了严峻挑战。为应对这些挑战,本文聚焦于三种经过实战检验的工程化解决方案:一是通过逆向分析JavaScript进行请求模拟与参数复现,直接构建有效请求;二是利用无头浏览器自动化工具(如

weixin_30832405的博客 385

绝缘检测是什么? 绝缘检测原理 绝缘检测检测的是什么?那个量?电压?电流?电阻?

绝缘电阻是电气设备和电气线路最基本的绝缘指标。对于低压电气装置的交接试验,常温下电动机、配电设备和配电线路的绝缘电阻不应低于0.5MΩ(对于运行中的设备和线路,绝缘电阻不应低于1MΩ/kV)。 绝缘电阻的正确测量方法 现代生活日新月异,人们一刻也离不开电。在用电过程中就存在着用电安全问题,在电器设备中,例如电机、电缆、家用电器等。 影响因素 环境温湿度 一般材料的绝缘电阻值随环境温湿度的升高而减小。相对而言,表面电阻(率)对环境湿度比较敏感,而体电阻(率)则对温度较为敏感。 湿度增加,表面泄漏增大,导体电导

dianqicyuyan的博客 2万+

【万字文档+源码】基于springboot+vue国内旅游景点数据爬虫与可视化分析项目-可用于毕设-课程设计-练手学习-学习资料分享

基于大数据技术的旅游景点智能分析系统项目。项目通过Scrapy爬虫框架采集去哪儿网景点数据,包括景点信息、评分、评论等内容,并使用Python进行数据清洗和预处理。系统采用Hadoop生态构建,将数据存储在HDFS分布式文件系统中,利用Hive进行数据仓库管理和SQL查询分析。在数据分析层面,使用Jupyter Notebook结合Matplotlib/Seaborn进行可视化挖掘。最终开发了基于Vue和Echarts的可视化大屏,为游客、景区运营方和旅游管理部门提供数据支持。文章详细说明了从

专业的计算机毕业设计指南 310

清洁机器人之屏幕(中,大LCD)方案--ITE 联阳986x系列 soc显控芯片介绍

清洁机器人之屏幕(中,大LCD)方案--ITE 联阳986x系列 soc显控芯片介绍

AIoT深度探索者 | 嵌入式系统架构师 深耕物联网(IoT)与人工智能(AI)融合技术,聚焦​​边缘计算、图像开发、低功耗通信协议​​,致力于智能硬件,关注我获取最新技术文章信息与海量资源~ 2665

PCB_Project.PrjPcb 4 Not in version control

Altium Designer中PCB项目出现"NOT in version control"错误的解决方法:1. 禁用不需要的版本控制集成(DXP→Preferences→Version Control);2. 清理项目缓存(Projects面板右键→Clean Project);3. 检查文件读写权限;4. 如无效可新建项目重新添加文件。如需使用SVN版本控制,需正确配置SVN客户端路径,创建或连接SVN仓库,并将项目文件提交至版本控制系统。注意新建SVN仓库必须使用空目录,建议使用

whm128的博客 1597
上一篇: Java数据采集-6.获取开源中国新闻列表(翻页-2)
下一篇: 传智播客_Springmvc+Mybatis由浅入深全套视频教程+文档
geekfly
博客等级 码龄12年 149粉丝 101原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值