网络爬虫
网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
爬虫的实质,就是获取静态数据,并对此进行分析从而获取对我们有价值的数据或者做保存展示所用。数据的格式有json,xml,html等等,在此我们就分析某东的html数据!
爬取的任务
操作流程
首先我们根据某东的分类首页1.获取全部的三级分类菜单的url--2.获取每个商品每个页面的url--3.获取每个商品的信息
1.我们分析分类首页会发现所有的分类菜单的url都在 .items dl dd a 标签中
利用jsoup跨域请求获取url加载的Document对象.使用选择器语法来选择页面元素(其实和jquery选择器规则相同)
//1.获取全部三级分类菜单
public static List <String> getItemCat3List(String url) {
List <String> itemCat3List = new ArrayList <String>();
try {
//获取页面对象和数据
Elements elements = Jsoup.connect(url).get().select(".items dl dd a");
for (Element element : elements) {
String href = element.attr("href");
if (href.startsWith("//list.jd.com/list.html?cat=")) { //该链接才满足个数
String item3Url = "https:" + href;
itemCat3List.add(item3Url); //https://list.jd.com/list.html?cat=
logger.info("获取的数据为" + item3Url);
}
}
} catch (Exception e) {
//目的放爬虫程序正常的执行
e.printStackTrace();
logger.info(e.getMessage() + url);
}
logger.info("获取有效连接数为:" + itemCat3List.size());
return itemCat3List;
}
//测试代码
public static void main(String[] args) {
String url = "https://www.jd.com/allSort.aspx"; //某东分类首页
//获取全部的三级分类菜单
List <String> itemCat3List = getItemCat3List(url);
}
2.我们得拿到每个商品的页数,分析发现在 #J_topPage span i 标签中有页数,拼接上页数就是每页的具体的url
//2.获取每个分类商品每一页商品的url
//先获取每页的总数
//https://list.jd.com/list.html?cat=1319,6313,11235
//https://list.jd.com/list.html?cat=1713,4855,4859&page=3
public static List <String> itemCat3ListByPage(List <String> itemCat3List) {
List <String> itemCat3ListByPage = new ArrayList <String>();
//获取每一个三级商品分类的url
for (String itemCat3Url : itemCat3List) {
try {
Element element = Jsoup.connect(itemCat3Url).get().select("#J_topPage span i").get(0);
//表示获取每个连接下的总页面
int pageCount = Integer.parseInt(element.text());
for (int i = 1; i <= pageCount; i++) {
String pageUrl = itemCat3Url + "&page=" + i;
logger.info("获取每页url:" + pageUrl);
itemCat3ListByPage.add(pageUrl);
}
} catch (Exception e) {
logger.info(e.getMessage());
logger.info("有问题的链接为:" + itemCat3Url);
}
}
logger.info("总记录数:" + itemCat3ListByPage.size());
return itemCat3ListByPage;
}
3.根据每个页面的url获取每个商品的URL
//3.获取每页中全部商品的url
public static List <String> getItemUrl(List <String> itemCat3ListByPage) {
ArrayList <String> itemListUrl = new ArrayList <String>();
for (int i = 0; i < itemCat3ListByPage.size(); i++) {
try {
Elements elements = Jsoup.connect(itemCat3ListByPage.get(i)).get().select("#plist ul li .p-img a");
//循环遍历每一个商品信息
for (Element element : elements) {
String itemHref = "https:" + element.attr("href"); //获取url
logger.info("商品的url:" + itemHref);
itemListUrl.add(itemHref);
}
} catch (Exception e) {
logger.info(e.getMessage());
logger.info("错误的url为:" + itemCat3ListByPage.get(i));
}
}
logger.info("商品的总数为:" + itemListUrl.size());
return itemListUrl;
}
4.拿到具体商品的url 继续同上面的操作即可拿到价格,卖点,库存,图片等商品具体信息.具体代码文后链接有提供.当然你也可以截取ajax请求拿到价格,商品id等相关信息.
//获取商品的价格信息
public static Long getItemPrice(String url) {
Long itemId = getItemId(url); //url:https://item.jd.com/12324671522.html
String priceUrl = "https://p.3.cn/prices/mgets?callback=jQuery6661675&type=1&area=1_72_2799_0&pdtk=&pduid=1476773839&pdpin=&pin=null&pdbp=0&skuIds=J_" + itemId + "&ext=11000000&source=item-pc";
try {
String JSON = Jsoup.connect(url).ignoreContentType(true).execute().body();
String jsonTemp = JSON.substring(JSON.indexOf("{"), JSON.lastIndexOf("}") + 1);
JsonNode jsonNode = objectMapper.readTree(jsonTemp);
Long price = jsonNode.get("op").asLong();
return price;
} catch (Exception e) {
logger.info(e.getMessage());
return 0L;
}
}
好啦,到此大功告成,来看看我们的成果吧!代码中还附加某电影平台的爬取哦!