java爬虫异步取数据_教您使用java爬虫gecco抓取JD全部商品信息(三)
##详情页抓取 商品的基本信息抓取完成后,就要针对每个商品的详情页进行抓取,可以看到详情页的地址格式一般如下:http://item.jd.com/1861098.html。我们建立商品详情页的Bean:
@Gecco(matchUrl="http://item.jd.com/{code}.html", pipelines="consolePipeline")
public class ProductDetail implements HtmlBean {
private static final long serialVersionUID = -377053120283382723L;
/**
* 商品代码
*/
@RequestParameter
private String code;
/**
* 标题
*/
@Text
@HtmlField(cssPath="#name > h1")
private String title;
/**
* ajax获取商品价格
*/
@Ajax(url="http://p.3.cn/prices/get?skuIds=J_[code]")
private JDPrice price;
/**
* 商品的推广语
*/
@Ajax(url="http://cd.jd.com/promotion/v2?skuId={code}&area=1_2805_2855_0&cat=737%2C794%2C798")
private JDad jdAd;
/*
* 商品规格参数
*/
@HtmlField(cssPath="#product-detail-2")
private String detail;
public JDPrice getPrice() {
return price;
}
public void setPrice(JDPrice price) {
this.price = price;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public JDad getJdAd() {
return jdAd;
}
public void setJdAd(JDad jdAd) {
this.jdAd = jdAd;
}
public String getDetail() {
return detail;
}
public void setDetail(String detail) {
this.detail = detail;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
}
@RequestParameter可以获取@Gecco里定义的url变量{code}。
@Ajax是页面中的ajax请求,JD的商品价格和推广语都是通过ajax请求异步获取的,gecco支持异步ajax请求,指定ajax请求的url地址,url中的变量可以通过两种方式指定。
一种是花括号{},可以获取request的参数类似@RequestParameter,例子中获取推广语的{code}是matchUrl="http://item.jd.com/{code}.html"中的code;
一种是中括号[],可以获取bean中的任意属性。例子中获取价格的[code]是变量private String code;。
##json数据的元素抽取 商品的价格是通过ajax获取的,ajax一般返回的都是json格式的数据,这里需要将json格式的数据抽取出来。我们先定义价格的Bean:
public class JDPrice implements JsonBean {
private static final long serialVersionUID = -5696033709028657709L;
@JSONPath("$.id[0]")
private String code;
@JSONPath("$.p[0]")
private float price;
@JSONPath("$.m[0]")
private float srcPrice;
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public float getSrcPrice() {
return srcPrice;
}
public void setSrcPrice(float srcPrice) {
this.srcPrice = srcPrice;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
}
我们获取的商品价格信息的json数据格式为:[{"id":"J_1861098","p":"6488.00","m":"7488.00"}]。可以看到是一个数组,因为这个接口其实可以批量获取商品的价格。json数据的数据抽取使用@JSONPath注解,语法是使用的fastjson的JSONPath语法。
JDad的抓取类似,下面是Bean的代码:
public class JDad implements JsonBean {
private static final long serialVersionUID = 2250225801616402995L;
@JSONPath("$.ads[0].ad")
private String ad;
@JSONPath("$.ads")
private List ads;
public String getAd() {
return ad;
}
public void setAd(String ad) {
this.ad = ad;
}
public List getAds() {
return ads;
}
public void setAds(List ads) {
this.ads = ads;
}
}
##学会分析ajax请求 目前爬虫抓取页面内容针对ajax请求有两种主流方式:
一种是模拟浏览器将页面完全绘制出来,比如可以利用htmlunit。这种方式存在一个问题就是效率低,因为页面中的所有ajax都会被请求,而且需要解析所有的js代码。gecco可以通过自定义downloader来实现这种方式
还一种就是需要哪些ajax就执行哪些,这就要开发人员分析网页中的ajax请求,获得请求的地址,比如抓取JD的商品价格的地址@Ajax(url="http://p.3.cn/prices/mgets?skuIds=J_[code]")。而且这个地址之后可能会变。
这两种方式都有各自的优缺点,gecco通过扩展都支持,本人还是更倾向于使用第二种方式。
下面说说怎么分析页面中的ajax请求,还是要利用chrome的开发者模式,network选项可以看到页面中的所有请求:
##gecco的其他一些有用的特性
gecco支持页面中的定义的全局javascript变量的提取,如页面中定义的var变量。
gecco支持分布式抓取,通过redis管理startRequest实现分布式抓取。
##源码 全部源代码可以在gecco的github上下载,代码位于src/test/java/com/geccocrawler/gecco/demo/jd包下。如果使用过程中发现任何bug欢迎Pull request,或者通过Issue提问,当然也可以在博客中留言。
java爬虫异步取数据_教您使用java爬虫gecco抓取JD全部商品信息(三)相关推荐
- python可抓取数据包括什么_Python对JS型数据抓取有什么特别好的方法吗,pythonjs型抓取,想写一个爬虫,但是需要抓...
Python对JS型数据抓取有什么特别好的方法吗,pythonjs型抓取,想写一个爬虫,但是需要抓 想写一个爬虫,但是需要抓去的的数据是js生成的,在源代码里看不到,要怎么才能抓到呢? 最好是用pyt ...
- python数据抓取工具_【重磅开源】Hawk-数据抓取工具:简明教程
Hawk: Advanced Crawler& ETL tool written in C#/WPF 1.软件介绍 Hawk3已经发布,本文的很多信息已经不完整或过期,所有更新信息和下载地址都 ...
- java获取mysql的数据_【助教】Java获取数据库数据展示
本文将给出一个最简单的Java查询数据库中一张表的数据并将查询结果展示在页面的例子. 实际上,我们要解决以下两个问题: Java与数据库交互(以JDBC为例) 数据展示在前台页面(以Servlet+J ...
- java使用xml存储数据_用存储过程和 JAVA 写报表数据源有什么弊端?
用存储过程和 JAVA 写报表数据源有什么弊端?跟着小编一起来一看一下吧! 我们在报表开发中经常会使用存储过程准备数据,存储过程支持分步计算,可以实现非常复杂的计算逻辑,为报表开发带来便利.所以,报表 ...
- python抓取股票竞价数据_【整理】用Python+beautifulsoup抓取股票数据
[刚开始写总结,读者如果对我的内容有任何建议欢迎留言反馈,或直接加QQ1172617666,期待交流] 先贴上代码,再详细的写一下在写这些代码的过程中遇到的问题,解决的方法. 这些代码完成的任务是:访 ...
- python爬取抖音用户数据_一篇文章教会你用Python抓取抖音app热点数据
今天给大家分享一篇简单的安卓app数据分析及抓取方法.以抖音为例,我们想要抓取抖音的热点榜数据. 要知道,这个数据是没有网页版的,只能从手机端下手. 首先我们要安装charles抓包APP数据,它是一 ...
- 网站爬取工具_浅析阻碍网站内容被蜘蛛抓取的原因有哪些?
众所周知,在搜索引擎中存在的蜘蛛其实就是一段代码,这段代码通过在各个网站爬取,以便于网站内容能够被搜索引擎收录.不过一般蜘蛛爬取是按照一定规则进行的,如果网站中出现了一些爬取障碍,那么蜘蛛爬取就会被打 ...
- java监听路由器数据_求如何用java读取路由器上的数据,介绍点资料
展开全部 import java.io.*; import java.util.*; public class GetRoutInfo { public static void main(String ...
- java爬虫 京东_教您使用java爬虫gecco抓取JD全部商品信息(一)
#教您使用java爬虫gecco抓取JD全部商品信息(一) ##gecco爬虫 如果对gecco还没有了解可以参看一下gecco的github首页.gecco爬虫十分的简单易用,JD全部商品信息的抓取 ...
最新文章
- WPF中splashScreen启动程序之前出现一个过程动画的效果
- 数据一致性-分区可用性-性能—多副本强同步数据库系统实现之我见
- js 递归编程要注意的:return
- oracle consistent gets,oracle构建一致性读
- OkHttp上传文件,服务器端请求解析找不到文件信息的问题
- python文件读写及形式转化和CGI的简单应用
- java多线程实现卖票小程序
- Word没有到一行自动换行如何解决
- 2022-2028年中国飞机电子飞行包(EFB)行业市场竞争状况及发展趋向分析报告
- Nero8完整版下载地址
- 通俗理解逻辑删除和物理删除的区别
- 英国高中A-Level和IB课程介绍
- 如何比对excel表格两列数据中的相同部分或重复部分
- linux命令 - tail:查看文件最后几行的命令
- 多线程编译与运行linux,Linux系统下多线程程序编译makefile文件
- JVM 内存分哪几个区,每个区的作用是什么
- Android-通讯录
- Oracle 查询临时表空间
- LeetCode2029. 石子游戏 IX
- 基于流计算 Oceanus(Flink) CDC 做好数据集成场景
热门文章
- 节流函数-throttle
- Visual C++ MFC编程 绘制直线、圆、自行车
- kurento代码分析(二)rtp流的处理
- 利用Arduino Mega的Analog端口无法驱动L298N电机芯片的解释
- 学计算机的气质,大学生“气质大比拼”!闷骚型计算机,直男癌土木工程,你躺枪没...
- java同步接口和异步接口_同步接口和异步接口
- 【创意代码】以程序员的方式撒狗粮,专业浪漫,值得拥有
- 2020年北邮计算机专业分数线,2020北京邮电大学研究生分数线一览表(含2018-2019历年复试)...
- 从chatGPT到语音回答雏形的python实现
- 将FTP虚拟成磁盘的软件——NetDrive