本文地址:http://blog.csdn.net/shanglianlm/article/details/70188385

最近由于工作需要,写了一个小的爬虫,主要用于爬取网易汽车车型库(http://product.auto.163.com/)上的不同品牌/车标(共175个车标)下不同车系(共1650个系列)的的图片(各八张)

代码下载

代码如下:
共CarBrand.java,CarCrawer.java,CarCrawerDemo.java三个文件。

实体
CarBrand.java

package com.mingo.crawer;import java.util.ArrayList;public class CarBrand {private String ppName;  private String ppUrl;   private ArrayList<CarBrand> ppList;private String cxName;  private String cxUrl;   private ArrayList<CarBrand> cxList;private String cxTpName;    private String cxTpUrl; private ArrayList<CarBrand> cxTpList;private String tpName;private String tpNameUrl;//getter() 和 setter() 省略}

具体实现
CarCrawer.java

package com.mingo.crawer;import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class CarCrawer {public static String carUrl = "http://product.auto.163.com";public static String SendGet(String url) {  // 定义一个字符串用来存储网页内容  String result = "";  // 定义一个缓冲字符输入流  BufferedReader in = null;  try {  // 将string转成url对象  URL realUrl = new URL(url);  // 初始化一个链接到那个url的连接  URLConnection connection = realUrl.openConnection();  // 开始实际的连接  connection.connect();  // 初始化 BufferedReader输入流来读取URL的响应  in = new BufferedReader(new InputStreamReader(  connection.getInputStream(), "GB2312"));  // 用来临时存储抓取到的每一行的数据  String line;  while ((line = in.readLine()) != null) {  // 遍历抓取到的每一行并将其存储到result里面  result += line;  }  } catch (Exception e) {  System.out.println("发送GET请求出现异常!" + e);  e.printStackTrace();  }  // 使用finally来关闭输入流  finally {  try {  if (in != null) {  in.close();  }  } catch (Exception e2) {  e2.printStackTrace();  }  }  return result;  }  /*** 下载文件到本地** @param urlString*          被下载的文件地址* @param filename*          本地文件名* @throws Exception*           各种异常*/public static void download(String urlString, String filename,String savePath) throws Exception {  // 构造URL  URL url = new URL(urlString);  // 打开连接  URLConnection con = url.openConnection();  //设置请求超时为5s  con.setConnectTimeout(5*1000);  // 输入流  InputStream is = con.getInputStream();  // 1K的数据缓冲  byte[] bs = new byte[1024];  // 读取到的数据长度  int len;  // 输出的文件流  File sf=new File(savePath);  if(!sf.exists()){  sf.mkdirs();  }  OutputStream os = new FileOutputStream(sf.getPath()+"\\"+filename);  // 开始读取  while ((len = is.read(bs)) != -1) {  os.write(bs, 0, len);  }  // 完毕,关闭所有链接  os.close();  is.close();  }   public static void writeTxtFile(String content,String txtfilename)throws Exception{  FileWriter writer = new FileWriter(txtfilename, true);   writer.write(content);   writer.close(); }  public static ArrayList<CarBrand> removeDuplicate(ArrayList<CarBrand> list)  {List<CarBrand> newlist= new ArrayList<CarBrand>();Set<String> set=new HashSet<String>();for (CarBrand car:list) {if (car == null) {continue;}String  str = car.getCxName();if (str != null) {if (!set.contains(str)) { //set中不包含重复的set.add(str);newlist.add(car);} }   }return (ArrayList<CarBrand>) newlist;}/** @param url* 示例 http://product.auto.163.com/brand/a/*/public static ArrayList<CarBrand> getPpUrl(String url) throws Exception {ArrayList<CarBrand> ppList = new ArrayList<CarBrand>();String content = CarCrawer.SendGet(url);Pattern patternName = Pattern.compile("title=\"进入.{1,20}品牌频道");Pattern patternUrl = Pattern.compile("<a href='/brand/[a-z]/.{1,20}' title");Matcher matcherName = patternName.matcher(content); Matcher matcherUrl = patternUrl.matcher(content);while(matcherName.find()&&matcherUrl.find()){CarBrand carBrand = new CarBrand();carBrand.setPpName(matcherName.group(0).substring(9, matcherName.group(0).length()-4));carBrand.setPpUrl(carUrl+matcherUrl.group(0).substring(9, matcherUrl.group(0).length()-7));//System.out.println(carBrand.getPpName()+": "+carBrand.getPpUrl());ppList.add(carBrand);}return ppList;}/** @param url* 示例 http://product.auto.163.com/brand/a/*/public static ArrayList<CarBrand> getCxUrl(String url) throws Exception {ArrayList<CarBrand> cxPicList = new ArrayList<CarBrand>();String content = CarCrawer.SendGet(url);//Pattern pattern = Pattern.compile("class=\"group\">.*<div class=\"gbox gbox2\" >");//Matcher matcher = pattern.matcher(content); int i=0;while(content.indexOf("class=\"group\">",i)>0){int subS = content.indexOf("class=\"group\">",i);int subE = content.indexOf("<div class=\"gbox gbox2\" >",i);String subContent = content.substring(subS, subE);i=subE+10;          //System.out.println("subContent "+subContent);Pattern patternTitle = Pattern.compile("频道\">进入.{1,20}品牌频道</a>]</span>");Matcher matcherTitle = patternTitle.matcher(subContent);String strtitle= null;if(matcherTitle.find()){strtitle = matcherTitle.group(0).substring(6, matcherTitle.group(0).length()-16);}Pattern patternName = Pattern.compile("\"查看.{1,20}图片\">");Pattern patternUrl = Pattern.compile("/series/photo/.{10,20}\"");Matcher matcherName = patternName.matcher(subContent); Matcher matcherUrl = patternUrl.matcher(subContent);while(matcherName.find()&&matcherUrl.find()){CarBrand carBrand = new CarBrand();carBrand.setPpName(strtitle);//System.out.println(carBrand.getPpName());carBrand.setCxName(matcherName.group(0).substring(3, matcherName.group(0).length()-4));carBrand.setCxUrl(carUrl+matcherUrl.group(0).substring(0, matcherUrl.group(0).length()-1));//System.out.println(carBrand.getCxName()+": "+carBrand.getCxUrl());cxPicList.add(carBrand);}}return cxPicList;}/** @param url* 示例 http://product.auto.163.com/series/photo/2350.html#CX001*/public static ArrayList<CarBrand> getCxPic(String url) throws Exception {ArrayList<CarBrand> cxPicList = new ArrayList<CarBrand>();String content = CarCrawer.SendGet(url);Pattern pattern = Pattern.compile("http://product.auto.163.com/picture/photoview.{30,40}.html");Matcher matcher = pattern.matcher(content); int num=1;while(matcher.find()&&num<9){CarBrand carBrand = new CarBrand();if(num==1){ carBrand.setCxTpName("左前");} else if(num==2){ carBrand.setCxTpName("正前");               }else if(num==3){ carBrand.setCxTpName("正侧"); } else if(num==4){ carBrand.setCxTpName("左后");                }else if(num==5){ carBrand.setCxTpName("正后"); } else if(num==6){ carBrand.setCxTpName("车顶");        }else if(num==7){ carBrand.setCxTpName("前大灯局部"); } else if(num==8){ carBrand.setCxTpName("后大灯局部"); }else{ System.out.println("Error: num = "+num); return null;}carBrand.setCxTpUrl(matcher.group(0));//System.out.println(carBrand.getCxTpName()+": "+matcher.group(0));num = num + 1;cxPicList.add(carBrand);}return cxPicList;}public static String getBigPic(String url) throws Exception {String bigPicUrl = null;String content = CarCrawer.SendGet(url);Pattern pattern = Pattern.compile("<img class=\"main_photo hidden\" data-src=\".{60,70}.jpg"); Matcher matcher = pattern.matcher(content); if(matcher.find()){//System.out.println(matcher.group(0).substring(41));bigPicUrl = matcher.group(0).substring(41);}return bigPicUrl;}}

调用
CarCrawerDemo.java

package com.mingo.crawer;import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class CarCrawerDemo {public static String carUrl = "http://product.auto.163.com";public static void main(String[] args) throws Exception {// TODO Auto-generated method stub//保存路径 D:\\CarPic\\String savePath = "D:\\CarTp\\";//文件名 奥迪__奥迪Q5_2017款_左后.jpgString filename = "";//txt文件名String txtfilename=savePath+"output.txt";String url = "http://product.auto.163.com/brand/";System.out.println(url);ArrayList<CarBrand> pplist = CarCrawer.getPpUrl(url);System.out.println(pplist.size());ArrayList<CarBrand> cxUrllistNew = new ArrayList<CarBrand>();Set<String> ppUrlSet=new HashSet<String>();for(CarBrand pp:pplist){    String ppUrlStr= pp.getPpUrl().substring(0, 36);if (!ppUrlSet.contains(ppUrlStr)) { //set中不包含重复的ppUrlSet.add(ppUrlStr);             ArrayList<CarBrand> cxUrllist = CarCrawer.getCxUrl(pp.getPpUrl());          cxUrllistNew.addAll(cxUrllist); }}System.out.println(cxUrllistNew.size());CarCrawer.writeTxtFile("\nCalendar: "+Calendar.getInstance(),txtfilename);for(CarBrand cxUrlNew:cxUrllistNew){//System.out.println(cxUrlNew.getPpName()+" "+cxUrlNew.getCxName()+" "+cxUrlNew.getCxUrl());ArrayList<CarBrand> cxTplist = CarCrawer.getCxPic(cxUrlNew.getCxUrl());for(CarBrand cxTp:cxTplist){    String tpName = cxUrlNew.getPpName()+"_"+cxUrlNew.getCxName()+"_"+cxTp.getCxTpName()+".jpg";String tpNameUrl = CarCrawer.getBigPic(cxTp.getCxTpUrl());//System.out.println(tpName+" "+tpNameUrl);CarCrawer.writeTxtFile("\n"+tpName+" "+tpNameUrl,txtfilename);if(tpName!=null&&tpNameUrl!=null){CarCrawer.download(tpNameUrl, tpName, savePath);}}}System.out.println("finished!");}
}

下载结果:

改进点:
1 没有爬取每个车系的年款;
2 库有点小,车辆主要是小型车,
3 代码速度要进一步优化。

Java爬虫爬取网易汽车车型库相关推荐

  1. python爬网易新闻_爬虫基本介绍 python3 爬虫爬取网易新闻排行榜

    爬虫基本介绍 1. 什么是爬虫? 爬虫是请求⽹网站并提取数据的⾃自动化程序 2. 爬虫的基本流程 发起请求 通过HTTP库向目标站点发起请求,即发送一个Request,请求可以包含额外的headers ...

  2. python java 爬数据_如何用java爬虫爬取网页上的数据

    当我们使用浏览器处理网页的时候,有时候是不需要浏览的,例如使用PhantomJS适用于无头浏览器,进行爬取网页数据操作.最近在进行java爬虫学习的小伙伴们有没有想过如何爬取js生成的网络页面吗?别急 ...

  3. Java爬虫 --- 爬取王者荣耀英雄图片

    Java爬虫 - 爬取王者荣耀英雄图片 import org.jsoup.Connection; import org.jsoup.Jsoup; import org.jsoup.nodes.Docu ...

  4. Java爬虫 爬取某招聘网站招聘信息

    Java爬虫 爬取某招聘网站招聘信息 一.系统介绍 二.功能展示 1.需求爬取的网站内容 2.实现流程 2.1数据采集 2.2页面解析 2.3数据存储 三.获取源码 一.系统介绍 系统主要功能:本项目 ...

  5. java爬虫爬取笔趣阁小说

    java爬虫爬取笔趣阁小说 package novelCrawler;import org.jsoup.Connection; import org.jsoup.HttpStatusException ...

  6. Java爬虫爬取wallhaven的图片

    Java爬虫爬取wallhaven的图片 参考文章:JAVA Jsoup爬取网页图片下载到本地 需要的jar包:jsuop wallhaven网站拒绝java程序访问,所以要伪装报头. 发送请求时 C ...

  7. 我的第一个开源项目:Java爬虫爬取旧版正方教务系统课程表、成绩表

    Java爬虫爬取旧版正方教务系统课程表.成绩表 一.项目展示 1.正方教务系统 首页 2.爬虫系统 首页: 成绩查询: 课表查询: 二.项目实现 1.爬取思路描述 无论是成绩查询或课表查询亦或者其它的 ...

  8. Java爬虫爬取 天猫 淘宝 京东 搜索页和 商品详情

    Java爬虫爬取 天猫 淘宝 京东 搜索页和 商品详情 先识别商品url,区分平台提取商品编号,再根据平台带着商品编号爬取数据. 1.导包 <!-- 爬虫相关Jar包依赖 --><d ...

  9. java爬虫爬取互联网上的各大影视网站---360影视(附源码下载)

    关于爬虫: 万维网上有着无数的网页,包含着海量的信息,无孔不入.森罗万象.但很多时候,无论出于数据分析或产品需求,我们需要从某些网站,提取出我们感兴趣.有价值的内容,但是纵然是进化到21世纪的人类,依 ...

最新文章

  1. 酸吗?28岁程序员财务自由宣布退休!
  2. 联想Y 系列 四面壳展示
  3. Android自定义View 开发流程综合简述 Android自定义View(三)
  4. create显示中文乱码 qt_Ubuntu下Qt串口助手接收中文乱码问题
  5. facebook开源的prophet时间序列预测工具---识别多种周期性、趋势性(线性,logistic)、节假日效应,以及部分异常值
  6. 语义分割模型架构演进与相关论文阅读
  7. linux python测试程序,linux下测试python程序执行时间
  8. 线性系统的矫正方法——PID控制理论学习笔记
  9. 求解不定方程 (扩展欧几里得算法)
  10. 数据结构——“双向循环链表“ 易懂刨析双向循环链表(图解+代码)
  11. 怎样在html里加入cms的标签,动易Cms:如何在自定义字段中插入html代码和标签-动易Cms教程...
  12. win10 企业版激活
  13. html关于点击radio触发事件
  14. 微信公共号如何本地调试
  15. WMS 怎么搞定库内拣选与分拣?
  16. compatible version of org.springframework.boot.actuate.health.CompositeHealthIndicator
  17. intel opcode
  18. Javaweb安全——Fastjson反序列化利用
  19. 【CISSP备考】AIO综合错题集
  20. Java进阶篇设计模式之十二 ---- 备忘录模式和状态模式

热门文章

  1. Revit2016 外部工具添加 ---win10
  2. OpenCV3.2 Java图像处理视频学习教程-贾志刚-专题视频课程
  3. ubuntu下解决zip解压缩后乱码
  4. 华北科技学院计算机期末考试,华北科技学院计算机等级考试报名
  5. 计算机组装所需要的部件,组装一台电脑需要哪些配件【详细列举】
  6. 计算机外围设计原理,CPLD无刷直流电机的驱动设计及原理分析
  7. 我的电磁学讲义11:安培环路定理
  8. 药品区块链溯源:解决溯源痛点 实现药品风控管理
  9. java如何避免死锁
  10. JAVA的四类八种基本数据类型