Java爬虫,Jsoup 爬取大众点评、美团商家信息电话号码解决方案
今天有群内有同学问怎么爬取大众点评商家信息,尤其是电话号码,我看了下。发现是反爬虫的。
警告:本代码只是一个学习Demo
,不能作为侵权或者违规行为。使用或者间接使用本博客内容做违规违法事情,与本人无关,继续观看表示同意。
分析大众点评Dom信息
从百度快照分析大众点评
使用了一种常见的方式,用自定义字符来解决,你抓取后是乱码的内容。但是我立马想到,这种网站肯定要做 SEO 的,所以从百度搜索了下链接。查看了下快照。
打开百度快照,再看看 HTML 源码。
这个时候最好右键查看源码,然后搜索一下,因为有的内容是异步( JavaScript )输出。这里我就不上图了,因为我知道百度快照不会有这些问题。
Jsoup 从百度快照抓取“大众点评”信息
直接上代码了,采用的是 Jsoup ,这个需要效率,并发等等,请自己解决,这个只是一个栗子。
思路为:先获取百度快照—> 请求百度快照—>获取内容
public static void main(String[] args) throws IOException {
//商家ID
String id = "103615462";
System.out.println(loadInfo(id));
}
public static Map<String,Object> loadInfo(String id)throws IOException{
String ua = "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1 (compatible; Baiduspider-render/2.0; +http://www.baidu.com/search/spider.html)";
String firstURl = "https://www.baidu.com/s?cl=3&wd=http%3A%2F%2Fwww.dianping.com%2Fshop%2F" + id;
Map<String,Object> resultMap = new HashMap<>();
//回去百度快照链接
Document doc = Jsoup.connect(firstURl)
.header("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3")
.header("Accept-Encoding","gzip, deflate")
.header("Accept-Language","zh-CN,zh;q=0.9,en;q=0.8")
.header("Cache-Control","no-cache")
.header("Pragma","no-cache")
.header("Proxy-Connection","keep-alive")
.header("User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36")
.get();
String url = doc.select("#content_left [data-click=\"{'rsv_snapshot':'1'}\"]").attr("href");
//如果没有就是百度没有收录
if(null != url && !"".equals(url.trim())){
//请求百度快照
doc = Jsoup.connect(url)
.header("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3")
.header("Accept-Encoding","gzip, deflate")
.header("Accept-Language","zh-CN,zh;q=0.9,en;q=0.8")
.header("Cache-Control","no-cache")
.header("Pragma","no-cache")
.header("Proxy-Connection","keep-alive")
.header("User-Agent",ua)
.header("Referer",firstURl)
.get();
String shopname = doc.select(".shop-name").text();
String address = doc.select(".expand-info.address").text();
String tel = doc.select("p.expand-info.tel").text();
//店铺名称
resultMap.put("shopname",shopname);
//店铺地址
resultMap.put("address",address);
//店铺电话
resultMap.put("tel",tel);
//TODO 需要其他信息自己取
}
return resultMap;
}
结果:
{
"address": "地址: 湘江北路江滨社区附10号47栋3-4单元1楼门面",
"shopname": "谭记宁乡蛇城(湘江世纪城店)",
"tel": "电话: 15388907298 0731-89913008"
}
有的时候还是有乱码,因为回源了。这个自己测试调优。
缺点:只有百度收录了才能获取的到信息,不过这个应该没关系,大众点评基本是秒收录。
优点:和大众点评完全没关系,它意识不到你再爬取信息,因为你是请求百度,但是百度是没有限制的。
请塑造正确价值观,尊重版权,尊重他人劳动成果。
版权所属:SO JSON在线解析
原文地址:https://www.sojson.com/blog/326.html
转载时必须以链接形式注明原始出处及本声明。
如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。