java实现爬虫利用httpclient获取页面数据,再用jsoup解析获取数据,在此页面的分析不作过多赘述,读者自行分析.

1.首页输入手机,观察url参数,将其中"&page="提取到最后,便于拼接页码参数;

2.查看网页源代码,观看到商品列表标签,所以第一步,获取商品列表,Elements spuEles = doc.select( "div#J_goodsList>ul>li" );第二步,获取spu,long spu = Long.parseLong( spuEle.attr( "data-spu" ) );第三步,获取sku列表,Elements skuEles = spuEle.select( "li.ps-item" );第四步,获取单个sku,long sku = Long.parseLong( skuEle.select( "[data-sku]" ).attr( "data-sku" ) );之后的操作就都是通过这个sku来操作的;

3.代码:

(1)添加依赖

<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient --><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId></dependency><!-- https://mvnrepository.com/artifact/org.jsoup/jsoup --><dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.11.3</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.4</version></dependency>
<!-- jpa --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency>

数据库等其他依赖就不贴了;

(2)工具类封装

@Component
public class HttpUtils {private PoolingHttpClientConnectionManager cm;public HttpUtils() {this.cm = new PoolingHttpClientConnectionManager();// 设置最大连接数this.cm.setMaxTotal( 100 );// 设置每个主机的最大连接数this.cm.setDefaultMaxPerRoute( 10 );}// 根据请求地址下载页面数据public String doGetHtml( String url ) {// 获取httpclient对象CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager( this.cm ).build();// 设置httpGet请求对象,设置url地址HttpGet httpGet = new HttpGet( url );httpGet.addHeader( "user-agent", "Mozilla/5.0" );// 设置请求信息httpGet.setConfig( this.getConfig() );CloseableHttpResponse response = null;try {// 使用httpclient发起请求,回去响应response = httpClient.execute( httpGet );// 解析响应.返回结果if ( response.getStatusLine().getStatusCode() == 200 ) {// 判断响应体Entity是否不为空,如果不为空就可以使用EntityUtilsif ( response.getEntity() != null ) {String content = EntityUtils.toString( response.getEntity(), "utf-8" );return content;}}} catch( Exception e ) {e.printStackTrace();} finally {try {// 关闭responseif ( response != null ) {response.close();}} catch( IOException e ) {e.printStackTrace();}}// 返回空字符串return "";}/*** //下载图片名称* * @param url* @return*/public String doGetImage( String url ) {// 获取httpclient对象CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager( this.cm ).build();// 设置httpGet请求对象,设置url地址HttpGet httpGet = new HttpGet( url );httpGet.addHeader( "user-agent", "Mozilla/5.0" );// 设置请求信息httpGet.setConfig( this.getConfig() );CloseableHttpResponse response = null;try {// 使用httpclient发起请求,回去响应response = httpClient.execute( httpGet );// 解析响应.返回结果if ( response.getStatusLine().getStatusCode() == 200 ) {// 判断响应体Entity是否不为空,如果不为空就可以使用EntityUtilsif ( response.getEntity() != null ) {// 下载图片// 获取图片的后缀String extName = url.substring( url.lastIndexOf( "." ) );// 创建图片名,重命名图片String picName = UUID.randomUUID().toString() +extName;// 下载图片// 声明OutPutStreamOutputStream outPutStream = new FileOutputStream( new File( "D:\\driver\\images\\" + picName ) );response.getEntity().writeTo( outPutStream );// 返回图片名称return picName;}}} catch( Exception e ) {e.printStackTrace();} finally {try {// 关闭responseif ( response != null ) {response.close();}} catch( IOException e ) {e.printStackTrace();}}// 如果下载失败,返回空字符串return "";}// 设置请求信息private RequestConfig getConfig() {RequestConfig config = RequestConfig.custom().setConnectTimeout( 1000 ) // 创建连接的最长时间.setConnectionRequestTimeout( 500 ) // 获取连接的最长时间.setSocketTimeout( 10000 ) // 数据传输最长时间.build();return config;}
}

(3)dao层,service层以及实体类

public interface ItemDao extends JpaRepository<Item, Long> {}@Service
public class ItemService {@Autowiredprivate ItemDao itemDao;@Transactionalpublic void save( Item item ) {this.itemDao.save( item );}public List<Item> findAll( Item item ) {// 声明查询条件Example<Item> example = Example.of( item );// 根据查询条件进行查询数据List<Item> list = this.itemDao.findAll( example );return list;}
}@Entity
@Table( name = "jd_item" )
@Data
public class Item {@Id@GeneratedValue( strategy = GenerationType.IDENTITY )private Long   id;private Long   spu;private Long   sku;private String title;private Double price;private String pic;private String url;private Date   created;private Date   updated;
}

(4)定时任务

@Component
public class ItemTask {@Autowiredprivate HttpUtils                 httpUtils;@Autowiredprivate ItemService               itemService;@Autowiredprivate static final ObjectMapper MAPPER = new ObjectMapper();// 当下载任务完成后,间隔多长时间进行下一次的任务@Scheduled( fixedDelay = 100 * 1000 )public void itemTask() throws Exception {// 声明需要解析的初始地址String url = "https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&suggest=1.def.0.V13--12%2C20%2C&wq=shouji&cid2=653&cid3=655&s=59&click=0&page=";// 遍历页面for( int i = 1; i < 10; i = i + 2 ) {String html = httpUtils.doGetHtml( url + i );// 解析页面,获取商品数据并存储this.parse( html );}System.out.println( "手机数据抓取完成!" );}// 解析页面,获取商品数据并存储private void parse( String html ) throws Exception {// 解析html,获取dom对象Document doc = Jsoup.parse( html );// 获取商品列表Elements spuEles = doc.select( "div#J_goodsList>ul>li" );for( Element spuEle : spuEles ) {// 获取spulong spu = Long.parseLong( spuEle.attr( "data-spu" ) );// 获取sku列表Elements skuEles = spuEle.select( "li.ps-item" );for( Element skuEle : skuEles ) {// 获取skulong sku = Long.parseLong( skuEle.select( "[data-sku]" ).attr( "data-sku" ) );// 根据sku查询商品数据Item item = new Item();item.setSku( sku );List<Item> list = this.itemService.findAll( item );if ( list.size() > 0 ) {// 如果商品存在,就进行下一个循环,该商品不保存,因为已存在continue;}// 设置商品的spuitem.setSpu( spu );// 获取商品详情的urlString itemUrl = "https://item.jd.com/" + sku + ".html";item.setUrl( itemUrl );// 获取商品的图片String picUrl = "https:" + skuEle.select( "img[data-sku]" ).first().attr( "data-lazy-img" );picUrl = picUrl.replace( "/n9", "/n1" );String picName = this.httpUtils.doGetImage( picUrl );item.setPic( picName );// 获取商品的价格String priceJson = this.httpUtils.doGetHtml( "https://p.3.cn/prices/mgets?skuIds=J_" + sku );double price = MAPPER.readTree( priceJson ).get( 0 ).get( "p" ).asDouble();item.setPrice( price );// 获取商品的标题String itemInfo = this.httpUtils.doGetHtml( item.getUrl() );String title = Jsoup.parse( itemInfo ).select( "div.sku-name" ).text();item.setTitle( title );item.setCreated( new Date() );item.setUpdated( item.getCreated() );// 保存商品数据到数据库this.itemService.save( item );}}}
}

注意事项,一开始我httpclient没有添加header,导致获取到的html都是跳转到登录页面,后面模拟浏览器之后OK了

java实现爬虫爬取京东手机页面相关推荐

  1. python爬虫实例手机_Python爬虫实现爬取京东手机页面的图片(实例代码)

    实例如下所示: __author__ = 'Fred Zhao' import requests from bs4 import BeautifulSoup import os from urllib ...

  2. Java实现爬取京东手机数据

    Java实现爬取京东手机数据 最近看了某马的Java爬虫视频,看完后自己上手操作了下,基本达到了爬数据的要求,HTML页面源码也刚好复习了下,之前发布两篇关于简单爬虫的文章,也刚好用得上.项目没什么太 ...

  3. Python动态爬虫爬取京东商品评论

    Python 动态爬虫爬取京东商品评论 1. 概述 京东商城是Python爬虫初学者试手的经典平台,反爬虫程度较低,但评论采取了动态加载的方式,爬取京东商品评论是学习动态爬虫的一个极佳方法. 动态爬虫 ...

  4. python制作爬虫爬取京东商品评论教程

    python制作爬虫爬取京东商品评论教程 作者:蓝鲸 类型:转载 本文是继前2篇Python爬虫系列文章的后续篇,给大家介绍的是如何使用Python爬取京东商品评论信息的方法,并根据数据绘制成各种统计 ...

  5. python爬取京东手机数据_实例解析Python如何实现爬取京东手机图片

    本文主要为大家分享一篇Python如何实现爬取京东手机图片的方法,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧,希望能帮助到大家. 运行环境Python3.6.4#爬取京东手机图片i ...

  6. selenium/requess爬取京东手机商品的详细信息1~selenium练习版

    selenium/requess爬取京东手机商品的详细信息1~selenium!! 前言 因为我也是个学生,所以代码可能会有点繁琐,我们都是超能100,一点点积累进步,其实有很多的地方可以简化,因为我 ...

  7. Python Scrapy 爬虫 - 爬取多级别的页面

    Python Scrapy 爬虫 - 爬取多级别的页面 互联网中众多的 scrapy 教程模板,都是爬取 下一页 → \rightarrow →下一页形式的,很少有 父级 → \rightarrow ...

  8. python爬取京东手机参数_python爬取京东手机价格

    这里我爬取京东手机价格作为事例 timg.jpg 最近刚出了iPhone X,1W元的价格有点实(guo)惠(fen),刘海也很"漂(chou)亮(lou),所以我还是看看国产手机吧,正好闲 ...

  9. 网络爬虫爬取淘宝页面商品信息

    网络爬虫爬取淘宝页面商品信息 最近在MOOC上看嵩老师的网络爬虫课程,按照老师的写法并不能进行爬取,遇到了一个问题,就是关于如何"绕开"淘宝登录界面,正确的爬取相关信息.通过百度找 ...

最新文章

  1. access无法 dolby_如何解决windows 8无法开启杜比音效的问题
  2. java校验邮箱_Java正则表达式校验邮箱和手机号 | 学步园
  3. 坐标轨迹计算_机器人的轨迹规划与自动导引
  4. 一个全球主要城市天气预报的WebService.
  5. 腾讯云首发智能网关流控,公有云进入网络精细管控时代
  6. 【HighCharts系列教程】一、认识Highcharts
  7. WPS删除表格后的空白页
  8. 极简教程!教你快速将K3s与Cloud Controller集成
  9. 3DMax中的快捷键整理
  10. [iOS]ARC下循环引用的问题
  11. 2012计算机科学排名,2012USNews美国大学计算机科学专业排名
  12. IE 10浏览器使用心得:界面简洁、功能很强大
  13. 阿里面试真题:Spring容器启动流程
  14. 曾经我创办了个公司,然后被投资人踢出去了......
  15. 如果更有效预防应力作用?PCB设计如何考虑应力作用? 应力对元器件失效问题的讨论
  16. Ubuntu安装时卡在安装界面怎么办
  17. 高并发下的服务器架构演变
  18. C语言自动识别文本编码
  19. 小班关于计算机运用的教案,实用的小班教案四篇
  20. Matlab,C/C++语言读取RAW图和保存RAW图

热门文章

  1. 洛谷P1823 [COI2007] Patrik 音乐会的等待
  2. scrapy-redis中的指纹,去重的方式
  3. 顶顶通呼叫中心中间件(mod_cti基于FreeSWITCH)-webrtc(浏览器直接拨打电话)
  4. 显卡测试(具体步骤)
  5. ⭐❤️zigbee无线通信模块的深入浅出❤️⭐
  6. 伺服电机选型计算pdf_机器设计中伺服电机及驱动器的选型(PDF),文末附下载地址...
  7. 关于win10笔记本创建无外网热点的方法探讨1
  8. IC公司认可的数字IC_FPGA设计课程
  9. 1.跳槽找工作避坑指南(2019版)
  10. 8.1SQL概述与数据库定义