`
newleague
  • 浏览: 1505306 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

抓取canobd2网站数据

    博客分类:
  • http
阅读更多

/* 
 * Created on 2009-10-12 
 * Copyright 2009 by www.xfok.net. All Rights Reserved 
 * 
 */
package test;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;

/**
 * @author YangHua 转载请注明出处:http://www.xfok.net/2009/10/124488.html
 */
public class MyClient {
 /**
  * 的到Http请求结果
  *
  * @param url请求地址
  * @param parms请求参数
  * @return
  */
 public byte[] getBody(String url, Map parms) {
  byte[] body = null;
  // 构造HttpClient的实例
  HttpClient httpClient = new HttpClient();
  // 创建post方法的实例
  PostMethod postMethod = new PostMethod(url);
  // 填入各个表单域的值
  NameValuePair[] data = new NameValuePair[parms.keySet().size()];
  Iterator it = parms.entrySet().iterator();
  int i = 0;
  while (it.hasNext()) {
   Map.Entry entry = (Map.Entry) it.next();
   Object key = entry.getKey();
   Object value = entry.getValue();
   data[i] = new NameValuePair(key.toString(), value.toString());
   i++;
  }

  // 将表单的值放入postMethod中
  postMethod.setRequestBody(data);
  try {
   // 执行postMethod
   int statusCode = httpClient.executeMethod(postMethod); // HttpClient对于要求接受后继服务的请求,象POST和PUT等不能自动处理转发
   // 301或者302
   if (statusCode == HttpStatus.SC_MOVED_PERMANENTLY
     || statusCode == HttpStatus.SC_MOVED_TEMPORARILY) {
    // 从头中取出转向的地址
    Header locationHeader = postMethod
      .getResponseHeader("location");
    String location = null;
    if (locationHeader != null) {
     location = locationHeader.getValue();
     System.out
       .println("The page was redirected to:" + location);
    } else {
     System.err.println("Location field value is null.");
    }
   }
   body = postMethod.getResponseBody();

  } catch (Exception e) {
   e.printStackTrace();
  }
  return body;
 }

 public static void main(String[] args) {

  String url = "http://www.canobd2.com/TechInfo/DlcLocator.aspx";
  // 数组:所有车系
  String[] makes = { "Acura", "Audi", "BMW", "Buick", "Cadillac",
    "Chevrolet", "Chrysler", "Daewoo", "Dodge", "Eagle", "Ford",
    "Geo", "GMC", "Honda", "Hummer", "Hyundai", "Infiniti",
    "Isuzu", "Jaguar", "Jeep", "Kia", "Land Rover", "Lexus",
    "Lincoln", "Mazda", "Mercedes-Benz", "Mercury", "MINI",
    "Mitsubishi", "Nissan", "Oldsmobile", "Plymouth", "Pontiac",
    "Porsche", "Saab", "Saturn", "Scion", "Smart", "Subaru",
    "Suzuki", "Toyota", "Volkswagen", "Volvo" };
  // 数组:所有年款
  String[] years = { "2010", "2009", "2008", "2007", "2006", "2005",
    "2004", "2003", "2002", "2001", "2000", "1999", "1998", "1997",
    "1996" };

  Map parms1 = new HashMap();
  MyClient client = new MyClient();
  parms1.put("submitButton", "Submit");
  parms1.put("__EVENTARGUMENT", "");
  parms1.put("__sx", "0");
  parms1
    .put(
      "__VIEWSTATE",
      "/wEPDwUKMTQzMzU1MTQxOA8WBB4OX19QcmV2aW91c1BhZ2VlHgtfX1JldHVyblVybAUZL1RlY2hJbmZvL0RsY0xvY2F0b3IuYXNweBYCAgEPZBYIZg9kFgZmDxYCHgVzdHlsZQUNZGlzcGxheTpub25lO2QCAg8WAh4HVmlzaWJsZWdkAgMPFgIfA2hkAgIPFCsAAWRkAgMPFCsAAWRkAgQPFCsAAWRkZLivoIUw0bAn8SSzCNO/mKrSXsQ/");
  parms1.put("__sy", "167");
  FileOutputStream fos = null;
  PrintWriter pw = null;
  // 将拼装的数据写到文件中去,方便批量插入数据库
  try {
   try {
    File file = new File("D://dlc.txt");
    fos = new FileOutputStream(file);
    pw = new PrintWriter(fos);
    Date startTime = new Date();
    for (int i = 0; i < makes.length; i++) {
     parms1.put("dlcMake", makes[i]);
     for (int j = 0; j < years.length; j++) {
      parms1.put("dlcYear", years[j]);
      parms1.put("__EVENTTARGET", "dlcYear");
      // 根据车系、年款查出车型
      String result2 = new String(client.getBody(url, parms1));
      // 处理result2数据,提炼出车型数组
      // 数据格式形如:1window['dlcModel_jsobject'].UpdateOptions(new
      // Array({Value:'',Text:'Select...',Selected:'true'}));
      // 取Value:''里的值
      //System.out.println("result2: " + result2);
      String[] result2split = result2.split("\\{");// 以“{”分割
      // 以“{”分割的字符串的个数
      int length = result2split.length;
      int firstIndex = 0;
      int secondIndex = 0;
      int thirdIndex = 0;
      // 根据数据格式,以”{“分割后,第二个Value为空,从分割后的第三个字符串开始
      if (length > 2) {
       String[] models = new String[length - 2];
       for (int k = 2; k < length; k++) {
        firstIndex = result2split[k].indexOf("Value:'");
        secondIndex = firstIndex + 7;
        thirdIndex = result2split[k].indexOf("'",
          secondIndex);
        models[k - 2] = result2split[k].substring(
          secondIndex, thirdIndex);
//        System.out.println("make1: " + makes[i]
//          + ", year1: " + years[j] + ", model1: "
//          + models[k - 2]);
       }
       parms1.put("__EVENTTARGET", "ajaxSubmitButton");
       parms1.put("__sy", "204");
       for (int m = 0; m < models.length; m++) {
        parms1.put("dlcModel", models[m]);
        // 根据车系、年款、车型查汽车诊断座位置
        String result3 = new String(client.getBody(url,
          parms1));
//        System.out.println("make: " + makes[i]
//          + ", year: " + years[j] + ", model: "
//          + models[m]);
        //System.out.println("result3: " + result3);
        String result3split[] = result3.split("\"");
        // for(String str:result3split)
        // System.out.println(str);
//        System.out.println(makes[i] + "@" + years[j]
//          + "@" + models[m] + "@"
//          + result3split[5] + "@"
//          + result3split[7] + "@"
//          + result3split[9] + "@"
//          + result3split[11]);// 6 8 10 12
        String ret =  models[m] + "@" + models[m] + "@" +"15" + "@"
          + makes[i] + "@" +years[j]
          + "@" + result3split[7] + "@"
          + result3split[9] + "@"
          + result3split[11]+"@!";
        pw.println(ret);
        pw.flush();
       }
      }
     }
    }
    Date endTime = new Date();
    long time = endTime.getTime() -startTime.getTime();
    
    System.out.println("------------------get data over--------------used time:"+time);
   } finally {
    if (fos != null) {
     fos.close();
    }
    if (pw != null) {
     pw.close();
    }
   }
  } catch (Exception e) {
   // TODO: handle exception
  }
 }
}

分享到:
评论

相关推荐

    java抓取网站数据

    ### Java抓取网站数据知识点详解 #### 一、概述 在现代互联网开发中,抓取网站数据是一项重要的技能。无论是进行市场调研、竞品分析还是数据挖掘,掌握如何使用Java来抓取数据都是十分必要的。本篇文章将详细介绍...

    机器人视觉抓取数据集Jacquard V2-代码

    机器人视觉抓取数据集Jacquard V2是一个广泛用于机器人学习和计算机视觉研究的重要资源,尤其在物体识别、抓取规划以及深度学习算法的训练中起到关键作用。这个数据集包含了大量的图像和相应的标注信息,旨在帮助...

    网站的数据抓取步骤

    ### 网站的数据抓取步骤 在当前互联网时代,数据抓取技术变得越来越重要,尤其是在需要自动收集网络上的信息时。本篇文章将基于提供的标题、描述、标签以及部分内容,详细解析网站数据抓取的基本步骤及其相关的技术...

    抓取中国招标网数据源码

    标题中的“抓取中国招标网数据源码”指的是一个C#编程项目,目的是自动化地从中国招标网这个网站上获取相关的招标信息。这样的程序通常利用网络爬虫技术,通过解析HTML网页来提取需要的数据。 首先,我们要理解数据...

    c#,asp.net网站数据抓取程序

    2. **SQL.CONFIG**:这可能是用于存储数据库连接信息的文件,数据抓取程序可能将抓取到的数据存储在SQL数据库中,以便后续分析。 3. **Form1.cs**:这是Windows Forms应用程序的主要界面类,可能包含用户界面的设计...

    C#抓取网页数据,彩票数据查询

    在本文中,我们将深入探讨如何使用C#语言来抓取网页数据,特别是在彩票数据查询方面的应用。C#是一种广泛用于开发Windows应用程序、Web服务以及游戏的面向对象的编程语言,其丰富的类库和强大的功能使其成为数据抓取...

    web程序抓取各个网站的数据

    在IT行业中,Web程序抓取是一项常见的任务,用于自动化地从网站上收集和处理数据。这个过程涉及到多个技术环节,包括网络请求、HTML解析、数据提取以及数据存储。以下是对这些知识点的详细解释: 1. **网络请求**:...

    亚马逊爬虫抓取商品信息并数据分析.zip

    亚马逊爬虫抓取商品信息并数据分析.zip亚马逊爬虫抓取商品信息并数据分析.zip亚马逊爬虫抓取商品信息并数据分析.zip亚马逊爬虫抓取商品信息并数据分析.zip亚马逊爬虫抓取商品信息并数据分析.zip亚马逊爬虫抓取商品...

    C#抓取网页股票年报数据程序源代码

    标题中的"C#抓取网页股票年报数据程序源代码"指的是一个使用C#编程语言开发的软件应用程序,其主要功能是从互联网上的网页中抓取股票年报的相关数据。在信息技术领域,这种程序通常被称为网络爬虫或者网页抓取工具,...

    matlab爬虫抓取高铁信息数据

    抓取G529数据中...完成! 抓取G1204数据中...完成! 抓取G279数据中...完成! 抓取G276数据中...完成! 抓取G1022数据中...完成! 抓取G280数据中...完成! 抓取G1206数据中...完成! 抓取G1224数据中...完成! 抓取G818数据...

    AMF抓取flex页面数据

    例如,测试人员可能需要抓取数据以验证服务功能,数据分析师则可能希望获取特定的网站数据进行研究。 9. **学习资源** - 要深入学习AMF和Flex抓取,可以参考Adobe官方文档,以及各种在线教程和论坛,如Stack ...

    智能抓取沙箱的抓取数据集

    智能抓取沙箱的抓取数据集 数据说明: 在Shadow Robot,我们是机器人抓取和操作的领导者。作为智能抓取系统开发的一部分,我们正在使用机器学习开发不同的算法。 这个第一个公共数据集的创建是为了研究使用机器学习...

    网页数据比分抓取源码

    值得注意的是,虽然网页抓取提供了获取大量公开数据的途径,但必须遵守网站的Robots协议,尊重网站的版权,避免对服务器造成过大的访问压力,否则可能会导致IP被封禁。此外,随着网站动态加载和反爬虫技术的发展,...

    抓取进程的网络数据工具

    2. **Cap.exe**:可执行文件,可能是一个命令行工具或者图形用户界面的应用程序,用于启动和控制网络数据的抓取过程。它可以调用 `Hook.dll` 中的函数来实现实际的网络监控功能。 综上所述,这个工具可能的工作流程...

    指定网站数据抓取

    本项目名为“指定网站数据抓取”,其主要目标是通过编程方式从指定的网站上获取所需的数据。这里我们将深入探讨这个项目涉及到的知识点,包括数据抓取的基本原理、ASP.Net框架的应用以及C#语言的使用。 首先,我们...

    Java网页抓取数据

    以上是Java网页抓取数据的基本知识框架,实践中还需要根据具体需求和目标网站的特点进行灵活调整。`WebpageCaptureDemo`可能是一个示例项目,包含了上述部分或全部技术的应用,通过阅读和学习这个示例,可以更好地...

    自动抓取yahoo股票数据软件

    "自动抓取yahoo股票数据软件"是这样一个工具,它能够高效地从Yahoo Finance和MSN Money这样的金融网站获取实时或历史的股票数据,以及公司的财务报告如资产负债表等关键信息。 首先,我们来了解一下"抓取股票数据...

    抓取网站神器工具

    2. **深度抓取**:通过设置抓取深度,Teleport Pro 可以追踪链接到的页面,不仅限于首页,而是深入到网站的各个层级,确保抓取到所有相关的内容。 3. **定制抓取规则**:用户可以根据需要设定过滤规则,比如只抓取...

    网络抓扒手 抓取别人网站的数据(源码 实例)

    ### 网络抓扒手:抓取别人网站的数据(源码实例) #### 1. 网络抓取技术 网络抓取,也被称为网页爬虫或Web Scraping,是一种自动化地从互联网上获取信息的技术。通常用于大规模地收集公开的网页数据,如新闻、商品...

    kettle数据抓取操作手册

    kettle数据抓取操作手册 kettle是一款功能强大的数据抓取和ETL(Extract, Transform, Load)工具,广泛应用于数据仓库、数据挖掘和数据分析领域。本手册将指导用户如何使用kettle进行数据抓取操作,包括连接数据库...

Global site tag (gtag.js) - Google Analytics