前言:最近博主买了台Kindle,感觉亚马逊上的图书资源质量挺好,还时不时地会有价格低但质量高的书出售,但限于亚马逊并没有很好的优惠提醒功能,自己天天盯着又很累。于是,我自己写了一个基于Java的亚马逊图书监控的简单爬虫,只要出现特别优惠的书便会自动给指定的邮箱发邮件。

实现思路

简单地说一下实现的思路,本文只说明思路,需要完整项目的童鞋请移步文末

  1. 简单封装JavaMail,使发送邮件更加方便
  2. 读取配置文件,用于配置邮件发送及监控设置
  3. 利用URL类返回的URLConnection对象对网站进行访问,抓取数据。(这里有个小技巧,在访问亚马逊的时候如果没有在请求头上加入Accept-Encoding:gzip, deflate, br这个参数,则不出几次便会被拒绝访问(返回503),加上之后返回的数据是经GZIP压缩过的,此时需要用GZIPInputStream这个流去读取,否则读到的是乱码)
  4. 利用正则表达式分析获取到的数据,提取有用信息。
  5. 发送通知邮件。

基本功能

  • 监控销量排行榜前50名的图书价格,若出现价格低于设定值的图书,则发送邮件通知。
  • 带有数据缓存功能,比如持续几天的优惠只会在一开始时通知一次,并不会在每次抓取时都通知。
  • 可以通过配置文件(setting.conf)动态更改邮件和监控的设置。
  • 报错信息会保存在ErrLog.txt中,一般的日志会保存在Log.txt中。

核心代码

因为只截取了部分代码,内容有所缺失,思路能看明白即可

抓取亚马逊信息

this.url = new URL("https://www.amazon.cn/gp/bestsellers/digital-text");
//打开一个连接
URLConnection connection = this.url.openConnection();
//设置请求头,防止被503
connection.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
connection.setRequestProperty("Accept-Encoding", "gzip, deflate, br");
connection.setRequestProperty("Accept-Language", "zh-CN,zh;q=0.9");
connection.setRequestProperty("Host", "www.amazon.cn");
connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36");
//发起连接
connection.connect();
//获取数据,因为服务器发过来的数据经过GZIP压缩,要用对应的流进行读取
BufferedInputStream bis = new BufferedInputStream(new GZIPInputStream(connection.getInputStream()));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//读数据
while ((len = bis.read(tmp)) != -1) {baos.write(tmp, 0, len);
}
this.rawData = new String(baos.toByteArray(), "utf8");
bis.close();

用正则分析数据

//先用正则表达式去取单个li标签
Pattern p1 = Pattern.compile("<li class=\"zg-item-immersion\"[\\s\\S]+?</li>");
Matcher m1 = p1.matcher(this.rawData == null ? "" : this.rawData);
while (m1.find()) {//取出单个li标签的名字和价格Pattern p2 = Pattern.compile("alt=\"([\\u4E00-\\u9FA5:—,0-9a-zA-Z]+)[\\s\\S]+?¥(\\d{1,2}\\.\\d{2})");Matcher m2 = p2.matcher(m1.group());while (m2.find()) {//先取出名字String name = m2.group(1);//再取出价格double price = Double.parseDouble(m2.group(2));//若有相同名字的书籍只记录价格低的if (this.destData.containsKey(name)) {double oldPrice = this.destData.get(name).getPrice();price = oldPrice > price ? price : oldPrice;}//将数据放入Map中this.destData.put(name, new Price(price, new Date()));}
}

完整项目

我把完整的项目放在了我的Github上,更多详细情况(怎么配置、怎么用),有兴趣的童鞋可以去捧个场!
仓库地址:https://github.com/horvey/Amazon-BookMonitor

转载于:https://www.cnblogs.com/horvey/p/10309660.html

基于Java实现简单亚马逊爬虫相关推荐

  1. JAVA爬取亚马逊的商品信息

    在程序里面输入你想爬取的商品名字,就可以返回这件商品在亚马逊搜索中都所有相关商品的信息,包括名字和价格. 解决了在爬取亚马逊时候,亚马逊可以识别出你的爬虫,并返回503,造成只能爬取几个页面的问题. ...

  2. 基于AM5728 DSP+ARM亚马逊物流机器人的设计和实现,实现自动化分拣投递,AGV

    基于AM5728 DSP+ARM的物流机器人,实现自动化分拣投递 亚马逊物流机器人实物图: 功能概述与应用领域 国内物流业起步较晚,发展水平较低,在信息技术的应用方面与发达国家有很大差距,发达国家已普 ...

  3. [众包]Eclipse 运行简单亚马逊AMT模板

    教程 1.打开esclipe下载AMT 输入 https://aws.amazon.com/eclipse 下载后需要重启 需要自己在亚马逊先注册 填入分配的信息 注册教程 (需要信用卡 激活 创建账 ...

  4. 基于日常工作对亚马逊云计算平台的一点认识

    这两年在业界关于云计算应该是一个很热门的名词,但是国内的云计算一直都在谈论概念却还没有能够提供实质产品给用户使用,而在国外亚马逊的"云"却已经提供服务很久并还在不断的增加可供使用的 ...

  5. 京东,淘宝,苏宁,亚马逊爬虫抓取商品信息并分析数据(完整文件链接在文章最后)

    1.简单说明 京东,淘宝,苏宁,亚马逊中国 抓取数据,存储到database 并进行分析 2.抓取的DIC the_basic_info = {'search_keyword': self.keywo ...

  6. 基于PHP后台请求亚马逊订单列表listOrder接口

    参阅:(接口调试工具) https://mws.amazonservices.com/scratchpad/index.html 参阅2:(API文档) http://docs.developer.a ...

  7. Java邮件发送-亚马逊Simple EMail Service (SES)作SMTP服务器

    AWS SES使用介绍可见:https://docs.aws.amazon.com/zh_cn/ses/latest/DeveloperGuide/Welcome.html 总结为一下两点即可: 1. ...

  8. 亚马逊不仅将弃用 Oracle,还要抢 Java 饭碗!

    冤家易结不易解,电商巨头亚马逊势要和软件大亨 Oracle 一扛到底了. 上个月,我们无意中发现,在 Oracle 最新发布的 Java 11 中,用户使用协议发生了变化,新版 Oracle JDK ...

  9. 【地表最强】亚马逊Amazon高性能爬虫

    亚马逊爬虫经验总结: 1亚马逊对于国外的IP友好,对于国内IP不友好. 小规模采集可以使用香港VPN或者美国IP直接通过 request请求即可.robot几率大概是15% 但是如果你使用国内IP r ...

最新文章

  1. sql语句中 时间数值转换为时间格式函数
  2. oracle数据库可以存图片吗,如何往数据库(Oracle)里存储图片和文件
  3. python电影推荐算法_电影推荐系统python实现
  4. Typescript04---模块、命名空间
  5. eval a string with null_try-with-resources--JAVA成长之路
  6. 注解配置 AOP 详解
  7. 初,中,高级的 ABAPer 应该各自具备什么水准的开发能力
  8. php公众号客服系统,公众号在线客服系统哪个好,主流客服系统评测及推荐
  9. java求圆弧切线_两个圆的公切线
  10. Java讲课笔记26:File类
  11. android登陆的编写
  12. HTTP 错误 403.1 - 禁止访问:执行访问被拒绝
  13. 解决Mac下Parallels Desktop的Host-only网络问题
  14. 卫星图像数据下载地址
  15. 【ElectronJs】基于Electron Forge打包的一些问题汇总
  16. arm mali 天梯图_手机cpu天梯图2019年4月最新排行 手机处理器性能天梯图
  17. 微信公众号运营的七大问题,你遇到了吗?
  18. Linux系列教程虚拟机安装虚拟化开启
  19. 开发想顺利,流程得明确!
  20. 程序员的浪漫--词云kumo

热门文章

  1. 安全面试之MYSQL注入
  2. 乌云下,种因时:vivo的平凡之路
  3. 老婆对不起我错了我爱你
  4. 入手评测 锐龙r5 5600H和酷睿i5 12450h的区别选哪个好
  5. linux 文件b类型b开头,Linux下的文件类型
  6. XGB建模流程化代码—仅作学习笔记
  7. SQL SERVER 日期格式化
  8. 交换机关闭、开启端口命令
  9. The term ‘oh-my-posh‘ is not recognized as a name of a cmdlet, function, script file...
  10. nginx 编译安装