Java爬虫实现爬取京东上的手机搜索页面 HttpCliient+Jsoup

1、需求及配置

需求:爬取京东手机搜索页面的信息,记录各手机的名称,价格,评论数等,形成一个可用于实际分析的数据表格。

使用Maven项目,log4j记录日志,日志仅导出到控制台。

Maven依赖如下(pom.xml)

<dependencies>
 <dependency>
 <groupId>org.apache.httpcomponents</groupId>
 <artifactId>httpclient</artifactId>
 <version>4.5.3</version>
 </dependency>

 <dependency>
 <!-- jsoup HTML parser library @ https://jsoup.org/ -->
 <groupId>org.jsoup</groupId>
 <artifactId>jsoup</artifactId>
 <version>1.11.2</version>
 </dependency>

 <!-- https://mvnrepository.com/artifact/log4j/log4j -->
 <dependency>
 <groupId>log4j</groupId>
 <artifactId>log4j</artifactId>
 <version>1.2.17</version>
 </dependency>
 </dependencies>

log4j配置(log4j.properties),将INFO及以上等级信息输出到控制台,不单独设置输出文档。

log4j.rootLogger=INFO, Console 

#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n

2、需求分析与代码

2.1需求分析

第一步,建立客户端与服务端的连接,并通过URL获得网页上的HTML内容。

第二步,解析HTML内容,获取需要的元素。

第三步,将HTML内容输出到本地的文本文档中,可直接通过其他数据分析软件进行分析。

根据以上分析,建立4个类,GetHTML(用于获取网站HTML), ParseHTML(用于解析HTML), WriteTo(用于输出文档), Maincontrol(主控).下面分别对四个类进行说明。为使代码尽量简洁,所有的异常均从方法上直接抛出,不catch。

2.2代码

2.2.1GetHTML类

该类包含两个方法:getH(String url), urlControl(String baseurl, int page),分别用于获取网页HTML及控制URL。由于此次爬取的网页内容只是京东上某一类商品的搜索结果,所以不需要对页面上所有的URL进行遍历,只需要观察翻页时URL的变化,推出规律即可。只向外暴露urlControl方法,类中设置一个private的log属性:private static Logger log = Logger.getLogger(getHTML.class); 用于记录日志。

getH(String url),对单个URL的HTML内容进行获取。

urlControl(String baseurl, int page),设置循环,访问多个页面的数据。通过审查元素可以看到京东上搜索页page的变化实际是奇数顺序的变化。

再看一下点击后网址的变化,可以发现实际变化的是page属性的值。通过拼接的方式就可以很的容易的获得下一个网页的地址。

https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&cid2=653&cid3=655&page=3&s=47&click=0
https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&cid2=653&cid3=655&page=5&s=111&click=0
https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&cid2=653&cid3=655&page=7&s=162&click=0

整体代码:

import java.io.IOException;
import org.apache.http.HttpEntity;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.apache.log4j.Logger;

public class getHTML {
 //建立日志
 private static Logger log = Logger.getLogger(getHTML.class);
 private static String getH(String url) throws ClientProtocolException, IOException {
 //控制台输出日志,这样每条访问的URL都可以在控制台上看到访问情况
 log.info("正在解析" + url);

 /*
  * 以下内容为HttpClient建立连接的一般用法
  * 使用HttpClient建立客户端
  * 使用get方法访问指定URL
  * 获得应答
  * */

 CloseableHttpClient client = HttpClients.createDefault();
 HttpGet get = new HttpGet(url);
 CloseableHttpResponse response = client.execute(get);

 /*
  * 以下内容为将HTML内容转化为String
  * 获得应答体
  * 将应答体转为String格式,此处使用了EntityUtils中的toString方法,编码格式设置为"utf-8"
  * 完成后关闭客户端与应答
  * */
 HttpEntity entity = response.getEntity();
 String content;
 if (entity != null) {
  content = EntityUtils.toString(entity, "utf-8");
  client.close();
  response.close();
  return content;
 } else
  return null;
 }
 public static void urlControl(String baseurl, int page) throws ClientProtocolException, IOException {
 //设置当前页count
 int count = 1;
 //如果当前页小于想要爬取的页数则执行
 while (count < page) {
  //实际访问的URL为不变的URL值拼接上URL变化的值
  String u = baseurl + (2 * count - 1) + "&click=0";
  //此处调用ParseHTML类中的方法对URL中的HTML页面进行处理,后面详细介绍该类
  String content = ParseHTML.parse(getH(u)).toString();
  //此处调用WriteTo类中的方法对解析出来的内容写入到本地,后面详细介绍该类
  WriteTo.writeto(content);
  count++;
 }
 }
}

2.2.2ParseHTML类

该步骤需要通过审查元素对需要爬取内容的标签进行确定,再通过Jsoup中的CSS选择器进行获取。

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class ParseHTML {

 public static StringBuilder parse(String content)
 {
 //使用Jsoup中的parse方法对已经转换为String的HTML内容进行分析,返回值为Document类
 Document doc = Jsoup.parse(content);
 //使用选择器select对需要找的元素进行抓取,例如第一个select中选择的是ul标签中class属性等于gl-warp clearfix的内容
 Elements ele = doc.select("ul[class = gl-warp clearfix]").select("li[class=gl-item]");
 //设置一个容器,用于装各个属性
 StringBuilder sb = new StringBuilder();
 //通过上一个选择器可以获得整个页面中所有符合要求的元素,也即各款手机,下面则需要对每款手机进行遍历,获取其属性
 for (Element e : ele) {
  //此处对各个属性的获取参考了网上一篇爬取京东上内容的文章,应该有其他不同的写法
  String id = e.attr("data-pid");
  String mingzi = e.select("div[class = p-name p-name-type-2]").select("a").select("em").text();
  String jiage = e.select("div[class=p-price]").select("strong").select("i").text();
  String pinglun = e.select("div[class=p-commit]").select("strong").select("a").text();
  //向容器中添加属性
  sb.append(id+"\t");
  sb.append(mingzi+"\t");
  sb.append(jiage+"\t");
  sb.append(pinglun+"\t");
  sb.append("\r\n");
 }
 return sb;
 }
}

2.2.3WriteTo类

此类中的方法将解析完成的内容写入到一个本地文件中。只是简单的IO。

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class WriteTo {
 // 设置文件存放的位置
 private static File f = new File("C:\\jingdong.txt");
 public static void writeto(String content) throws IOException {
 //使用续写的方式,以免覆盖前面写入的内容
 BufferedWriter bw = new BufferedWriter(new FileWriter(f, true));
 bw.append(content);
 bw.flush();
 bw.close();
 }
}

2.2.4MainControl类

主控程序,写入基地址与想要获取的页面数。调用getHTML类中的urlControl方法对页面进行抓取。

import java.io.IOException;
import org.apache.http.client.ClientProtocolException;

public class MainControl {
 public static void main(String[] args) throws ClientProtocolException, IOException {
 // TODO Auto-generated method stub
 String baseurl = "https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&enc="
  + "utf-8&qrst=1&rt=1&stop=1&vt=2&cid2=653&cid3=655&page=";
 int page = 5;//设置爬取页数
 getHTML.urlControl(baseurl, page);
 }
}

3、爬取结果

爬取20页。

3.1控制台输出

3.2文档输出

可以直接使用Excel打开,分隔符为制表符。列分别为商品编号,名称,价格与评论数。

4、小结

此次爬取使用了HttpClient与Jsoup,可以看到对于简单的需求,这些工具还是非常高效的。实际上也可以把所有类写到一个类当中,写多个类的方式思路比较清晰。

以上这篇Java爬虫实现爬取京东上的手机搜索页面 HttpCliient+Jsoup就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

您可能感兴趣的文章:

  • 零基础写Java知乎爬虫之抓取知乎答案
  • Java爬虫实战抓取一个网站上的全部链接
  • java实现简单的爬虫之今日头条
  • Java爬虫Jsoup+httpclient获取动态生成的数据
  • java实现网页爬虫的示例讲解
时间: 2017-11-27

java实现网页爬虫的示例讲解

这一篇目的就是在于网页爬虫的实现,对数据的获取,以便分析. 目录: 1.爬虫原理 2.本地文件数据提取及分析 3.单网页数据的读取 4.运用正则表达式完成超连接的连接匹配和提取 5.广度优先遍历,多网页的数据爬取 6.多线程的网页爬取 7.总结 爬虫实现原理 网络爬虫基本技术处理 网络爬虫是数据采集的一种方法,实际项目开发中,通过爬虫做数据采集一般只有以下几种情况: 1) 搜索引擎 2) 竞品调研 3) 舆情监控 4) 市场分析 网络爬虫的整体执行流程: 1) 确定一个(多个)种子网页 2) 进

零基础写Java知乎爬虫之抓取知乎答案

前期我们抓取标题是在该链接下: http://www.zhihu.com/explore/recommendations 但是显然这个页面是无法获取答案的. 一个完整问题的页面应该是这样的链接: http://www.zhihu.com/question/22355264 仔细一看,啊哈我们的封装类还需要进一步包装下,至少需要个questionDescription来存储问题描述: import java.util.ArrayList;public class Zhihu { public St

Java爬虫Jsoup+httpclient获取动态生成的数据

Java爬虫Jsoup+httpclient获取动态生成的数据 前面我们详细讲了一下Jsoup发现这玩意其实也就那样,只要是可以访问到的静态资源页面都可以直接用他来获取你所需要的数据,详情情跳转-Jsoup爬虫详解,但是很多时候网站为了防止数据被恶意爬取做了很多遮掩,比如说加密啊动态加载啊,这无形中给我们写的爬虫程序造成了很大的困扰,那么我们如何来突破这个梗获取我们急需的数据呢, 下面我们来详细讲解一下如何获取 String startPage="https://item.jd.com/1147

java实现简单的爬虫之今日头条

前言 需要提前说下的是,由于今日头条的文章的特殊性,所以无法直接获取文章的地址,需要获取文章的id然后在拼接成url再访问.下面话不多说了,直接上代码. 示例代码如下 public class Demo2 { public static void main(String[] args) { // 需要爬的网页的文章列表 String url = "http://www.toutiao.com/news_finance/"; //文章详情页的前缀(由于今日头条的文章都是在group这个目

Java爬虫实战抓取一个网站上的全部链接

前言:写这篇文章之前,主要是我看了几篇类似的爬虫写法,有的是用的队列来写,感觉不是很直观,还有的只有一个请求然后进行页面解析,根本就没有自动爬起来这也叫爬虫?因此我结合自己的思路写了一下简单的爬虫. 一 算法简介 程序在思路上采用了广度优先算法,对未遍历过的链接逐次发起GET请求,然后对返回来的页面用正则表达式进行解析,取出其中未被发现的新链接,加入集合中,待下一次循环时遍历. 具体实现上使用了Map<String, Boolean>,键值对分别是链接和是否被遍历标志.程序中使用了两个Map集

Java爬虫 信息抓取的实现

今天公司有个需求,需要做一些指定网站查询后的数据的抓取,于是花了点时间写了个demo供演示使用. 思想很简单:就是通过Java访问的链接,然后拿到html字符串,然后就是解析链接等需要的数据.技术上使用Jsoup方便页面的解析,当然Jsoup很方便,也很简单,一行代码就能知道怎么用了: Document doc = Jsoup.connect("http://www.oschina.net/") .data("query", "Java") //

Java爬虫抓取视频网站下载链接

本篇文章抓取目标网站的链接的基础上,进一步提高难度,抓取目标页面上我们所需要的内容并保存在数据库中.这里的测试案例选用了一个我常用的电影下载网站(http://www.80s.la/).本来是想抓取网站上的所有电影的下载链接,后来感觉需要的时间太长,因此改成了抓取2015年电影的下载链接. 一 原理简介 其实原理都跟第一篇文章差不多,不同的是鉴于这个网站的分类列表实在太多,如果不对这些标签加以取舍的话,需要花费的时间难以想象. 分类链接和标签链接都不要,不通过这些链接去爬取其他页面,只通过页底的

Python爬虫爬取一个网页上的图片地址实例代码

本文实例主要是实现爬取一个网页上的图片地址,具体如下. 读取一个网页的源代码: import urllib.request def getHtml(url): html=urllib.request.urlopen(url).read() return html print(getHtml(http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%E5%A3%81%E7%BA%B8&ct=201326592&am

Google 爬虫如何抓取 JavaScript 的内容

我们测试了谷歌爬虫是如何抓取 JavaScript,下面就是我们从中学习到的知识. 认为 Google 不能处理 JavaScript ?再想想吧.Audette Audette 分享了一系列测试结果,他和他同事测试了什么类型的 JavaScript 功能会被 Google 抓取和收录. 长话短说 1. 我们进行了一系列测试,已证实 Google 能以多种方式执行和收录 JavaScript.我们也确认 Google 能渲染整个页面并读取 DOM,由此能收录动态生成的内容. 2. DOM 中的

java简单网页抓取的实现方法

本文实例讲述了java简单网页抓取的实现方法.分享给大家供大家参考.具体分析如下: 背景介绍 一 tcp简介 1 tcp 实现网络中点对点的传输 2 传输是通过ports和sockets ports提供了不同类型的传输(例如 http的port是80) 1)sockets可以绑定在特定端口上,并且提供传输功能 2)一个port可以连接多个socket 二 URL简介 URL 是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址. 互联网上的每个文件都有一个唯一的

Python多进程方式抓取基金网站内容的方法分析

本文实例讲述了Python多进程方式抓取基金网站内容的方法.分享给大家供大家参考,具体如下: 在前面这篇//www.jb51.net/article/162418.htm我们已经简单了解了"python的多进程",现在我们需要把抓取基金网站(28页)内容写成多进程的方式. 因为进程也不是越多越好,我们计划分3个进程执行.意思就是 :把总共要抓取的28页分成三部分. 怎么分呢? # 初始range r = range(1,29) # 步长 step = 10 myList = [r[x:

Python爬虫实现抓取京东店铺信息及下载图片功能示例

本文实例讲述了Python爬虫实现抓取京东店铺信息及下载图片功能.分享给大家供大家参考,具体如下: 这个是抓取信息的 from bs4 import BeautifulSoup import requests url = 'https://list.tmall.com/search_product.htm?q=%CB%AE%BA%F8+%C9%D5%CB%AE&type=p&vmarket=&spm=875.7931836%2FA.a2227oh.d100&from=mal

用vbs 实现从剪贴板中抓取一个 URL 然后在浏览器中打开该 Web 站点

问: 嗨,Scripting Guy!我如何从剪贴板中抓取一个 URL 然后在浏览器中打开该 Web 站点? -- CL 答: 您好,CL.这是很有趣的问题,或者我们应当说,这是两个很有趣的问题.因为您实际上问了两个问题.第一个问题很简单:我可以使用脚本打开特定的 Web 站点吗?您大概已经知道答案了,我可以大声地回答您,可以!下面是一个示例脚本,它将"脚本中心"的 URL 存储在一个名为 strURL 的变量中.然后,此脚本会创建 WSH Shell 对象的一个实例,并使用 Run