java爬虫抓取动态网页(不是学Python的人员才能做的么?我们Java能做呢?)
优采云 发布时间: 2022-02-27 18:25java爬虫抓取动态网页(不是学Python的人员才能做的么?我们Java能做呢?)
由于阿凡经历了上一次大数据杀戮事件,可见目前的平台对用户非常不友好。只要您经常搜索某些 关键词,它通常更具对比性。我在最高峰直接买,就像买股票一样,总觉得每次都能买到底部,却不知道是在天台买的。于是阿芬想了个办法,把所有的数据都拉下来,自己对比了一下,就停止了搜索。省级平台总是根据我的搜索内容推荐。
如何用Java做爬虫
说到爬虫,大家肯定想说,爬虫,这难道不是只有学过Python的人才能做到的吗?我们可以在 Java 中做什么?阿凡想告诉大家的是,是的,Java语言已经存在这么多年了,怎么可能没有这样的内容,于是阿凡开始学习Java的爬虫之路。
汤
在介绍这门课之前,阿凡必须先说说我们平时看到的内容是由什么组成的。现在举个例子,我们都知道,我们在做开发的时候,至少我们在电脑上访问某东某某宝的数据时,他们给我们反馈的数据是通过HTML展示出来的,例如:
参与开发的每个人都必须知道这些是什么意思。这里就不做详细介绍了,说一下这个HTML是什么。阿凡需要介绍的是Jsoup,然后告诉大家怎么用。Jsoup 这个类爬取京东的数据。
正如官方文档向我们建议的那样,如何解析一段 HTML 代码:
String html = "First parse"
+ "<p>Parsed HTML into a doc.";
Document doc = Jsoup.parse(html);
</p>
这个文件是什么?我们可以看看输出,看看源代码解释。毕竟,如果一个开发人员看不到这个类的用途,他就不是一个合格的程序员。
输出:
First parse
<p>Parsed HTML into a doc.
</p>
其实这里可以看出,Document其实是为我们输出了一个新的文档,并且是排序好的,相当于为后续的HTML分析做专业的准备。
当我们看源码的注释时,不难看出Jsoup不仅可以解析我们给的字符串,还可以解析URL或者文件。
它将我们给他的HTML字符串转换成一个对象,也就是我们上面看到的Document,然后我们就可以顺利的使用Document对象中的元素了。
上面是解析字符串,那我们看看是否存在下面的解析URL:
public static void main(String[] args) {
try {
Document doc = Jsoup.connect("https://www.jd.com/?cu=true&utm_source=baidu-pinzhuan&utm_medium=cpc&utm_campaign=t_288551095_baidupinzhuan&utm_term=0f3d30c8dba7459bb52f2eb5eba8ac7d_0_f38cf584e9fb4328a3e0d2bb515e1458").get();
String title = doc.title();
System.out.println(title);
}catch (IOException e){
e.printStackTrace();
}
}
如果你执行以下,你就能看到标题是什么,结果是这样的:
是不是和我们在百度上搜索的时候不一样,因为这是进入后的首页。
元素
我们看源码可以清楚的看到Document是继承了Element的类,所以一定可以调用Element中的方法,例如:
getElementById(String id); //是不是有点眼熟,像不像Js里面的ID选择器
getElementsByTag(String tagName);// 通过标签来选择
getAllElements();//获取所有的Element的元素
至于方法,阿凡就不一一描述了。有兴趣的可以去官方文档,或者去源码,把包名发到包org.jsoup.nodes
有些人一定是生气了。如果你说阿芬,就不要介绍了。那你废话太多了。快速介绍一下京东。好的,让我们开始吧。
爬取之前一定要分析一下京东的网站,比如我搜索硬盘:
下面是一堆数据,我们需要解析的是HTML中最有用的部分,比如:
¥879.00
这里我们写下价格,然后我们寻找我们想要的名字
看,p-name就是我们需要的名字,然后我们就可以写代码了。
//这是京东的搜索网址,我们把这个keyword关键词提取出来,注意中英文,中文要处理一下
String url = "https://search.jd.com/Search?keyword=" + keyword;
url = url + "&enc=utf-8";
Document document = Jsoup.parse(new URL(url), 40000);
//我们先找这个 List,然后一层一层的遍历
Element element = document.getElementById("J_goodsList");
Elements elements = element.getElementsByTag("li");
for (Element el : elements) {
String img = el.getElementsByTag("img").eq(0).attr("source-data-lazy-img");
String price = el.getElementsByClass("p-price").eq(0).text();
String title = el.getElementsByClass("p-name").eq(0).text();
String shop = el.getElementsByClass("p-shop").eq(0).text();
System.out.println("=========================");
System.out.println("标题:" + title);
System.out.println("图片url:" + img);
System.out.println("店铺:" + shop);
System.out.println("价格:" + price);
}
我们看一下实现的效果图:
如果还有兴趣,可以直接在for循环中新建一个对象,得到一个List集合,然后在最后执行插入数据库的方法,这样数据就可以完整保存了。毛呢布?