整合营销服务商

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

免费咨询热线:

JAVA网络编程模拟浏览器获取html源代码(网络爬

JAVA网络编程模拟浏览器获取html源代码(网络爬虫)

络爬虫基本思路

基本思路:由关键字指定的url把所有相关的html页面全抓下来(html即为字符串),然后解析html文本(通常是正则表达式或者现成工具包如jsoup),提取文本信息,然后把文本信息存储起来。

网络爬虫操作步骤

URL(统一资源定位符)

下载资源

分析下载资源(正则表达式)

抽取、清洗、储存

该文章只会操作两步步骤URL和下载html资源。

网络编程小知识

URI:(Universal Resource Identifier)统一资源标记符,用来标记抽象或物理资源的一个紧凑字符串。

URL:(Universal Resource Locator)统一资源定位符,一种定位资源的主要访问机制的字符串,一个标准的URL必须包括:protocal(协议)、host(主机)、port(端口号)、path(路径)、parameter(参数)、anchor(锚)。

URN:(Universal Resource Name)统一资源名称,通过特定命名空间中的唯一名称或ID来标识资源。

URL和URN都是URI,但是URI不一定是URL或者URN。

SEO搜索引擎优化

SEO是搜索引擎优化(Search Engine Optimization)的英文缩写,中文译为“搜索引擎优化”。在了解搜索引擎自然排名机制的基础上,对网站进行内部及外部的调整优化,改进网站在搜索引擎中的关键词自然排名,获得更多流量,从而达成网站销售及品牌建设的预期目标。

网络爬虫技术是SEO搜索引擎优化的基础(对网络爬虫感兴趣的同学可以深入研究)

JAVA中的JDK已经对URL(资源定位符)封装完毕,使用者只要会用即可。

使用JAVA代码下载网站资源有如下两种情况:


该代码主要是通过URL类的openStream方法来获取网络资源,如果还想了解URL类的信息的同学可以去看看JDK中URL类的源代码。

二、网站不允许外来访问(模仿浏览器使用HTTP协议交流)代码如下


注意事项

JAVA中的控制台储存空间有限,所以有时候HTML源代码会显示不全,但你可以通过IO操作来拷贝到文件中去。

HttpURLConnection类的setRequestProperty方法中的(String key,String value)参数需要到浏览器相应网页中去拷贝。

拷贝如下:

1、进入浏览器相关网页。

2、按住F12进入devtools。

3、拷贝Request包中最后一行数据。

4、冒号前的对应key参数,冒号后的对应value参数。

点击关注私信小编“资源”即可获得

近在工作中遇到一个bug,将word转换成html,转换成功之后在浏览器中打开其中图片不显示,使用img标签,src指定图片相对地址又是能显示的,排除图片问题。

网上能搜索到的demo

打开转码之后的html代码发现,生成的是vml图片标签,这个在IE9以后就不支持了,更别说现在的主流浏览器了。

生成的html中使用的是vml标签

将这个跟大佬分析分析,各种文档一查,咔咔咔大致分析出问题所在。原来jacob使用的是word本身自带的功能,相当于把word打开另存为html,于是手动将word转为html试了一下,果然效果与代码转换一致,这时候注意到word另存为时有一个web选项,里面有个使用vml渲染图片默认是选中的,去掉这个选项,再次生成,图片正常显示。



到这里基本已经确定了问题的解决思路,另存为时不勾选这个选项,那么问题来了,怎么利用jacob操作另存为时去掉这个选项呢,想去搜搜看jacob相关的文档,结果不知道是不是因为这个很老了,网上大多数都是demo,根本没有相关的文档可看,Github上也是只言片语,根本无从查起。

jacob github 地址:https://github.com/joval/jacob

微软官网文档

官方文档连接:https://docs.microsoft.com/zh-cn/office/vba/api/word.weboptions.relyonvml

微软官网查询相关文档,发现其实是可以关闭的,于是代码变成这样

关闭relyOnVml

再次运行程序,这次转出来的html就能在浏览器打开了。

总结,在这次解决问题的过程中,学会了往更深层次去想问题,找对方向,迎难而上。

记录一下这个问题解决的经验,也希望能帮到同样遇到这个问题的人。

.Jsoup介绍

  - 官网文档:https://jsoup.org

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

  2. Jsoup快速入门

  - 获取网页标题

  String url="https://search.jd.com/Search?keyword=手机&wq=手机&page=1";
  Document document=Jsoup.connect(url).get();
  String title=document.select("title").text();
  System.out.println(title);
  ```

  - 运行效果:手机 - 商品搜索 - 京东

  3. 网站数据分析

  3.1 分析网站的访问地址

  - 以京东商城为例,商品分页列表的url地址,需要带如下几个参数,因此,在发送http请求时,需要携带正确的参数。

  - URL:https://search.jd.com/Search?keyword=手机&wq=手机&page=1

  3.2 分析网站的页面结构

  - 通过浏览器的开发者工具,可以分析出页面中我们需要的html结构。

<img src="assets/image-20220717171103097.png" alt="image-20220717171103097" style="zoom:67%;" />

- 可以看出,我们需要的商品数据,封装在一个id=J_goodsList的div标签中,我们可以方便的通过DOM解析出这块数据。

  4. 实战实现过程

  - 获取第1页的商品基本数据

public static void main(String[] args) throws Exception {
    //第1页地址
    String url="https://search.jd.com/Search?keyword=手机&wq=手机&page=1";
    //发送http请求
    Document document=Jsoup.connect(url).get();
    //在id=J_goodsList的div下,获取所有带有data-sku属性的li标签
    Elements lis=document.select("div[id=J_goodsList] li[data-sku]");
    lis.forEach(
            li -> {
                //获取商品sku
                String sku=li.attr("data-sku");
                //获取商品name
                String name=li.select("div[class='p-name p-name-type-2'] a em").text();
                //获取商品图片地址
                String img=li.select("div[class=p-img] a img[data-lazy-img]").attr("data-lazy-img");
               
                System.out.println(String.format("%s, %s, %s", sku, name, img));
            }
    );
}

  - 效果预览

  - 改造为分页获取