整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

抓取网页数据工具(java抓取网页内容)

这个信息爆炸的时代,我们每天都会接触到大量的网络数据。有时候我们需要获取一些特定的数据来进行分析或者处理。作为一个程序员,我曾经亲身体验了使用JAVA编程语言来抓取网页数据的过程。下面我将分享我在这个过程中遇到的挑战和解决方案。

一、背景概述

首先,让我们来了解一下什么是抓取网页数据。简单来说,抓取网页数据就是通过编程的方式从互联网上获取网页上的内容。这些内容可以是文本、图片、链接等等。而JAVA是一种广泛应用于开发各种类型应用程序的编程语言,也是我选择用来实现网页数据抓取的工具。

二、选择合适的工具

在开始之前,我首先需要选择一个合适的工具来辅助我完成任务。幸运的是,JAVA提供了许多强大的库和框架,可以帮助我们轻松地实现网页数据抓取功能。其中最常用和流行的工具就是Jsoup。Jsoup是一个开源的JAVA HTML解析器,可以方便地从HTML文档中提取所需内容。

三、分析目标网页结构

在开始编写代码之前,我需要先分析目标网页的结构。这是因为不同的网页结构可能需要使用不同的方法来获取数据。通过查看目标网页的源代码,我可以了解到它的HTML结构和标签使用情况。在分析过程中,我发现目标网页中的数据都被包含在特定的HTML标签中,这对我编写代码来提取数据非常有帮助。

四、编写JAVA代码

接下来,我开始编写JAVA代码来实现网页数据抓取功能。首先,我需要导入Jsoup库,并建立与目标网页的连接。然后,通过选择合适的HTML标签和属性,使用Jsoup提供的API来获取所需数据。例如,如果我需要获取所有标题为

的文本内容,可以使用以下代码:

Document doc = Jsoup.connect("目标网址").get();
Elements titles = doc.select("h1");
for (Element title : titles){
    System.out.println(title.text());
}

通过以上代码,我可以轻松地获取到目标网页中所有

标签内的文本内容,并将其打印输出。

五、处理异常情况

在编写代码的过程中,我也遇到了一些异常情况。例如,有时候目标网页会进行反爬虫处理,限制访问频率或者要求登录验证。为了解决这些问题,我需要添加一些额外的代码来模拟浏览器行为,例如设置User-Agent头和处理Cookie等。此外,还需要注意异常处理,确保代码的稳定性和健壮性。

六、优化性能

为了提高网页数据抓取的效率和性能,我还进行了一些优化工作。首先,我使用多线程技术来并发地抓取多个网页,以减少等待时间。其次,我使用连接池来管理与目标网页的连接,避免频繁地创建和销毁连接。最后,我对代码进行了适当的优化和缓存处理,以减少不必要的资源消耗。

七、总结与展望

通过使用JAVA抓取网页数据的亲身体验,我深刻理解到了编程技术在信息获取和处理中的重要性。通过合理选择工具、分析网页结构、编写代码、处理异常情况和优化性能,我们可以轻松地实现网页数据抓取功能,并为后续的数据分析和应用提供强有力的支持。未来,我将继续探索更多关于JAVA抓取网页数据的技巧和方法,并将其应用到实际项目中。

以上就是我亲身体验使用JAVA抓取网页数据的故事。希望这篇文章能够对想要学习或者应用这方面技术的读者有所帮助。编程的世界充满了无限的可能性,让我们一起努力,不断探索和创新!

DaemonSet和Sidecar模式各有优缺点,目前没有哪种方式可以适用于所有场景。因此我们阿里云日志服务同时支持了DaemonSet以及Sidecar两种方式,并对每种方式进行了一些额外的改进,更加适用于K8S下的动态场景。

Kubernetes(K8S)作为CNCF(cloud native computing foundation)的一个核心项目,背靠Google和Redhat的强大社区,近两年发展十分迅速,在成为容器编排领域中领导者的同时,也正在朝着PAAS底座标配的方向发展。

日志采集方式

日志作为任一系统不可或缺的部分,在K8S的官方文档中也介绍了多种的日志采集形式,总结起来主要有下述3种:原生方式、DaemonSet方式和Sidecar方式。

  1. 原生方式:使用 kubectl logs 直接在查看本地保留的日志,或者通过docker engine的 log driver 把日志重定向到文件、syslog、fluentd等系统中。
  2. DaemonSet方式:在K8S的每个node上部署日志agent,由agent采集所有容器的日志到服务端。
  3. Sidecar方式:一个POD中运行一个sidecar的日志agent容器,用于采集该POD主容器产生的日志。

采集方式对比

每种采集方式都有一定的优劣势,这里我们进行简单的对比:

从上述表格中可以看出:

  1. 原生方式相对功能太弱,一般不建议在生产系统中使用,否则问题调查、数据统计等工作很难完成;
  2. DaemonSet方式在每个节点只允许一个日志agent,相对资源占用要小很多,但扩展性、租户隔离性受限,比较适用于功能单一或业务不是很多的集群;
  3. Sidecar方式为每个POD单独部署日志agent,相对资源占用较多,但灵活性以及多租户隔离性较强,建议大型的K8S集群或作为PAAS平台为多个业务方服务的集群使用该方式。

日志服务K8S采集方式

DaemonSet和Sidecar模式各有优缺点,目前没有哪种方式可以适用于所有场景。因此我们阿里云日志服务同时支持了DaemonSet以及Sidecar两种方式,并对每种方式进行了一些额外的改进,更加适用于K8S下的动态场景。

这两种模式均基于Logtail实现,日志服务客户端Logtail目前已有百万级部署,每天采集上万应用、数PB的数据,历经多次双11、双12考验。相关技术分享可以参见文章:多租户隔离技术+双十一实战效果,Polling + Inotify 组合下的日志保序采集方案。

DaemonSet采集方式

DaemonSet方式下Logtail做了非常多的适配工作,包括:

  • 一条命令一个参数即可实现部署,资源自动初始化
  • 支持CRD方式配置,支持K8S控制台、kubectl、kube api等,与K8S发布、部署无缝集成
  • K8S RBAC鉴权,日志服务STS鉴权管理

详细的介绍文章可以参考:

再次升级!阿里云Kubernetes日志解决方案

LC3视角:Kubernetes下日志采集、存储与处理技术实践

Sidecar采集方式

sidecar方式的配置以及使用相对在虚拟机/物理机上采集数据区别不大,从Logtail容器视角来看:Logtail工作在一个“虚拟机”上,需要采集这个机器上某个/某些日志文件。

但在容器场景下还需解决两个问题:

  1. 配置:使用编排的方式配置agent容器
  2. 动态性:需适应POD的IP地址和hostname的变化
  3. 目前Logtail的容器支持通过环境变量配置相关参数,并支持自定义标识的机器组进行工作,可以完美解决上述两个问题。

Sidecar配置示例

Sidecar模式下日志组件安装、配置方式如下:

步骤一: 部署Logtail容器

  1. 在部署POD时将日志路径挂载到本地,并将对应的volume也挂载到Logtail容器。
  2. Logtail容器需配置 ALIYUN_LOGTAIL_USER_ID 、 ALIYUN_LOGTAIL_CONFIG 、 ALIYUN_LOGTAIL_USER_DEFINED_ID ,参数含义以及值的选取参见:标准Docker日志采集。

tips:

  1. Logtail容器建议配置健康检查,在运行环境、内核等出现异常时可自动恢复。
  2. 示例中使用的Logtail镜像访问的是阿里云hangzhou公网镜像仓库,您可根据需求替换成本Region的镜像,并使用内网方式。
apiVersion: batch/v1
kind: Job
metadata:
 name: nginx-log-sidecar-demo
 namespace: kube-system
spec:
 template:
 metadata:
 name: nginx-log-sidecar-demo
 spec:
 # volumes配置
 volumes:
 - name: nginx-log
 emptyDir: {}
 containers:
 # 主容器配置
 - name: nginx-log-demo
 image: registry.cn-hangzhou.aliyuncs.com/log-service/docker-log-test:latest
 command: ["/bin/mock_log"]
 args: ["--log-type=nginx", "--stdout=false", "--stderr=true", "--path=/var/log/nginx/access.log", "--total-count=1000000000", "--logs-per-sec=100"]
 volumeMounts:
 - name: nginx-log
 mountPath: /var/log/ngin
 # Logtail的Sidecar容器配置
 - name: logtail
 image: registry.cn-hangzhou.aliyuncs.com/log-service/logtail:latest
 env:
 # aliuid
 - name: "ALIYUN_LOGTAIL_USER_ID"
 value: "165421******3050"
 # 自定义标识机器组配置
 - name: "ALIYUN_LOGTAIL_USER_DEFINED_ID"
 value: "nginx-log-sidecar"
 # 启动配置(用于选择Logtail所在Region)
 - name: "ALIYUN_LOGTAIL_CONFIG"
 value: "/etc/ilogtail/conf/cn-hangzhou/ilogtail_config.json"
 # 和主容器共享volume
 volumeMounts:
 - name: nginx-log
 mountPath: /var/log/nginx
 # 健康检查
 livenessProbe:
 exec:
 command:
 - /etc/init.d/ilogtaild
 - status
 initialDelaySeconds: 30
 periodSeconds: 30 
 

步骤二: 配置机器组

如下图所示,在日志服务控制台创建一个Logtail的机器组,机器组选择自定义标识,可以动态适应POD ip地址的改变。具体操作步骤如下:

  1. 开通日志服务并创建Project、Logstore,详细步骤请参考准备流程。
  2. 在日志服务控制台的机器组列表页面单击创建机器组。
  3. 选择用户自定义标识,将您上一步配置的 ALIYUN_LOGTAIL_USER_DEFINED_ID填入用户自定义标识内容框中。

步骤三:配置采集方式

机器组创建完成后,即可配置对应文件的采集配置,目前支持极简、Nginx访问日志、分隔符日志、JSON日志、正则日志等格式,具体可参考:文本日志配置方式。本示例中配置如下:

步骤四:查询日志

采集配置完成并应用到机器组后,1分钟内日志即可采集上来,进入对应logstore的查询页面即可查询到采集上来的日志。

日志进阶

阿里云日志服务针对日志提供了完整的解决方案,日志采集只是其中的第一步,以下相关功能是日志进阶的必备良药:

  1. 日志上下文查询:https://help.aliyun.com/document_detail/48148.html
  2. 快速查询:https://help.aliyun.com/document_detail/88985.html
  3. 实时分析:https://help.aliyun.com/document_detail/53608.html
  4. 快速分析:https://help.aliyun.com/document_detail/66275.html
  5. 基于日志设置告警:https://help.aliyun.com/document_detail/48162.html
  6. 配置大盘:https://help.aliyun.com/document_detail/69313.html
  7. 更多日志进阶内容可以参考:日志服务学习路径。

作者:元乙

近在网上阅读的时候发现一种新型的内容防采集JavaScript代码。大体情况是:如果网站监测到批量采集工具(爬虫)的行为,例如访问频次太高,就会在内容中插入一端提示信息,并隐藏后续的正文,但是点击解除提示就可以消除提示并显示正文,因此这对于正常的页面浏览是没有实质影响的,但是对采集工具(爬虫)来说,就会出现内容截断,导致采集内容不完整。下面是正常的样子:

下面是网站发现异常的情况,部分正文被截断,但是Web浏览时,点击蓝色文字,原本被屏蔽的问题就会出现。如果是爬虫采集,就没有办法了,会丢失被截断的文字


看了一下网页,其实就是一段不复杂的Javascript代码和内容改写:

内容改写

<div id=”content”><p>……..慕容还想稳住下盘,张寻宁已经到了,左右开弓几记直拳打到慕容脸上。</p><p>慕容晃了晃差点没摔倒,此时时间只过了5秒。慌乱间,他挥动斧头出击,却再次走空。张寻宁闪身后跃起,膝盖撞到他肚子。慕容再次踉跄后退几步。张寻宁绝不给对手喘息的机会,猛然逼近,这次是一个下勾拳,打中他的下巴。眼看着一幅假牙从口中飞出。</p><p>“看起来人设还是很还原?来吧,让我看看你的落樱神斧。”</p><p>他奋力用手肘猛击慕容,到目前为止慕容完全没有还手之力。</p><div id=”c1″><a onClick=”getDecode();” style=”color:#ff6600;”>防采集,自动加载失败,点击手动加载,不支持阅读模式!</a><p>禁止转码、禁止阅读模式,下面内容隐藏,请退出阅读模式!</p></div></div>

网页最后的JS代码(应该是生成器产生的):

<script type=”text/javascript”>

init(‘chapter’);

function getDecode(){H=~[];H={___:++H,$$$$:(![]+””)[H],__$:++H,$_$_:(![]+””)[H],_$_:++H,$_$$:({}+””)[H],$$_$:(H[H]+””)[H],_$$:++H,$$$_:(!””+””)[H],$__:++H,$_$:++H,$$__:({}+””)[H],$$_:++H,$$$:++H,$___:++H,$__$:++H};H.$_=(-----略去----+H.$$$+H._$$+”\””)())();$(‘#c1’).remove();}

</script>

<script>universally();</script>

由于飞机上没网络,没法检查网页中某外部JS文件中init(’chapter’)的内容,但是几乎可以肯定是用来判断是否有异常采集行为,从而给出提示并屏蔽内容。

  • 网站在这里:https://www.zhaishuyuan.com/read/37560

相关信息:

  1. 如何判断自己的网页被保存到本地,然后果断跳转呢?(脚本)http://www.brofive.org/?p=6146