络爬虫基本思路
基本思路:由关键字指定的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));
}
);
}
- 效果预览
- 改造为分页获取
*请认真填写需求信息,我们会在24小时内与您取得联系。