`

抓取网页信息

阅读更多
1 我这里只给出关键的部分,使用java程序实现,而不是JSP的代码。移植工作请自行完成。
2 我使用自己的数据库连接,请替换为应用服务器提供的数据源为好
3 代码分三部分,数据库结构,POJO类和应用程序

一、数据库结构 AmazonGoods.sql 使用的是MySQL的数据库
查看复制到剪切板打印
-- ----------------------------   
-- Table structure for amazongoods   
-- ----------------------------   
CREATE TABLE `amazongoods` (   
  `id` int(11) NOT NULL AUTO_INCREMENT,   
  `price` decimal(10,0) NOT NULL,   
  `shipping` decimal(10,0) NOT NULL,   
  `Seller` text NOT NULL,   
  PRIMARY KEY (`id`)   
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;  

二、POJO类 AmazonGoods.java

package com.laozizhu.test.amazon;   
  
import java.math.BigDecimal;   
  
/**  
 * 某一行的商品数据  
 *   
 * @author 老紫竹的家(laozizhu.com)  
 *   
 */  
class AmazonGoods {   
  public long getId() {   
    return id;   
  }   
  
  public void setId(long id) {   
    this.id = id;   
  }   
  
  public BigDecimal getPrice() {   
    return price;   
  }   
  
  public void setPrice(BigDecimal price) {   
    this.price = price;   
  }   
  
  public BigDecimal getShipping() {   
    return shipping;   
  }   
  
  public void setShipping(BigDecimal shipping) {   
    this.shipping = shipping;   
  }   
  
  public String getSeller() {   
    return seller;   
  }   
  
  public void setSeller(String seller) {   
    this.seller = seller;   
  }   
  
  // 序列号,主键   
  private long id;   
  // 价格   
  private BigDecimal price;   
  // 运费   
  private BigDecimal shipping;   
  // 商家信息   
  private String seller;   
}  

三、应用类
查看复制到剪切板打印
package com.laozizhu.test.amazon;   
  
import java.math.BigDecimal;   
import java.sql.Connection;   
import java.sql.DriverManager;   
import java.sql.PreparedStatement;   
import java.util.ArrayList;   
import java.util.List;   
import java.util.Properties;   
import java.util.regex.Matcher;   
import java.util.regex.Pattern;   
  
import com.laozizhu.tools.PageService;   
  
public class AmazonFetch {   
  
  /**  
   * @param args  
   */  
  public static void main(String[] args) {   
    // 我这里需要设置代理,如果你能直接访问互联网,则无需这段代码了   
    initProxy();   
  
    // 读取页面数据   
    String str = PageService.getPage("http://www.amazon.com/gp/offer-listing/B0012J52OC/", "ISO-8859-1");   
    // 解析页面,拿到商品信息   
    List<AmazonGoods> list = parse(str);   
    // 生成HTML表格   
    buildTable(list);   
    // 存入数据库   
    saveToMySQL(list);   
  }   
  
  /**  
   * 简单的代理服务器,无需密码认证  
   */  
  private static void initProxy() {   
    Properties prop = System.getProperties();   
    // prop.put("proxySet", "true");   
    // 设置http访问要使用的代理服务器的地址   
    prop.setProperty("http.proxyHost", "10.60.8.20");   
    // 设置http访问要使用的代理服务器的端口   
    prop.setProperty("http.proxyPort", "8080");   
  }   
  
  // 注意,美元符号要转义   
  // 因为报价都包含小数点,所以用数字+小数点+2位小数即可   
  // 商家信息包含了对应的标签   
  static Pattern pPrice = Pattern.compile(   
      "<span class=\"price\">\\$([\\d]+\\.[\\d]{2})</span>.*?(<ul class=\"sellerInformation\">.+?</ul>)", Pattern.DOTALL);   
  // 运费   
  // <span class="price_shipping">+ $6.04</span>   
  static Pattern pShipping = Pattern   
      .compile("<span class=\"price_shipping\">\\+ \\$([\\d]+\\.[\\d]{2})</span>", Pattern.DOTALL);   
  
  /**  
   * 解析页面,获得商品列表  
   *   
   * @param page  
   *          页面  
   * @return 商品列表  
   */  
  private static List<AmazonGoods> parse(String page) {   
    // 首先,把商品分成多个字符串片段   
    // 分割符就是表格里的内容了。这个得查看HTML源代码才能找到合适的   
    String[] strs = page.split("<tbody class=\"result\">");   
    // 构造结果   
    // 默认长度为片段的长度,呵呵   
    List<AmazonGoods> list = new ArrayList<AmazonGoods>(strs.length);   
    AmazonGoods goods = null;   
    // 循环解析每个商品片段   
    for (String str : strs) {   
      // 注意,不是每个商品都有运费,所以正则最好不要写一个   
      // 当然,你愿意弄复杂了也行,我个人不推荐这么做   
      Matcher m = pPrice.matcher(str);   
      if (m.find()) {   
        goods = new AmazonGoods();   
        goods.setPrice(new BigDecimal(m.group(1)));   
        // 这里面包含了HTML的信息,包括Javascript内容,不过比较难删除   
        // 因为有些页面文字是用js显示的,还是保留的比较好   
        goods.setSeller(m.group(2));   
  
        // 查找运费   
        m = pShipping.matcher(str);   
        if (m.find()) {   
          goods.setShipping(new BigDecimal(m.group(1)));   
        }   
        // 将商品加入列表   
        list.add(goods);   
      } else {   
        // 没有找到价格,则这部分不包含商品信息,无需继续   
        continue;   
      }   
    }   
    return list;   
  }   
  
  private static String buildTable(List<AmazonGoods> list) {   
    StringBuilder b = new StringBuilder("<table>");   
    b.append("<tr><th>价格</th><th>运费</th><th>商家信息</th></tr>");   
    for (AmazonGoods goods : list) {   
      b.append("<tr><th>" + goods.getPrice() + "</th><th>" + goods.getShipping() + "</th><th>" + goods.getSeller()   
          + "</th></tr>");   
    }   
    b.append("</table>");   
    return b.toString();   
  }   
  
  private static void saveToMySQL(List<AmazonGoods> list) {   
    // 这里就用最原始的方法获得数据库连接了。   
    // 数据库结构请参考AmazonGoods.sql   
    // 使用test的数据库   
    Connection con = null;   
    PreparedStatement st = null;   
    String url = "jdbc:mysql://localhost:3306/";   
    String db = "test";   
    String driver = "com.mysql.jdbc.Driver";   
    String user = "test";   
    String pass = "test";   
    BigDecimal ZERO = new BigDecimal("0");   
    try {   
      Class.forName(driver);   
      con = DriverManager.getConnection(url + db, user, pass);   
      st = con.prepareStatement("insert into AmazonGoods (price,shipping,seller) values(?,?,?)");   
      for (AmazonGoods goods : list) {   
        st.setBigDecimal(1, goods.getPrice());   
        st.setBigDecimal(2, goods.getShipping()==null?ZERO:goods.getShipping());   
        st.setString(3, goods.getSeller());   
        if (st.executeUpdate() <= 0) {   
          throw new Exception("保存数据错误!");   
        }   
        st.clearParameters();   
      }   
  
    } catch (Exception ex) {   
      ex.printStackTrace();   
    } finally {   
      if (st != null) {   
        try {   
          st.close();   
        } catch (Exception ex) {   
        }   
      }   
      if (con != null) {   
        try {   
          con.close();   
        } catch (Exception ex) {   
        }   
      }   
    }   
  }   
}  


四、辅助类 PageService.java
查看复制到剪切板打印
package com.laozizhu.tools;   
  
import java.io.BufferedReader;   
import java.io.FileNotFoundException;   
import java.io.InputStream;   
import java.io.InputStreamReader;   
import java.io.OutputStream;   
import java.net.ConnectException;   
import java.net.HttpURLConnection;   
import java.net.URL;   
import java.util.zip.GZIPInputStream;   
  
/**  
 * 读取URL的文本工具  
 *   
 * @author 赵学庆 <A href="www.java2000.net" target=_blank>www.java2000.net</A>  
 */  
public class PageService 
{   
  private static final String BR = "\r\n";   
  
  /**  
   * 读取文本。默认使用UTF-8编码  
   *   
   * @param page  
   *页面的URL,比如 <A href="http://www.java2000.net"    target=_blank>http://www.java2000.net</A>  
   * @return 读取到的文本字符串  
   */  
  public static String getPage(String page) 
  {   
    return getPage(page, "UTF-8");   
  }   
  
  /**  
   * 读取文本  
   *   
   * @param page  
   * 页面的URL,比如 <A href="http://www.java2000.net" target=_blank>http://www.java2000.net</A>  
   * @param charset  
   * 页面的编码  
   * @return 读取到的文本字符串  
   */  
  public static String getPage(String page, String charset) 
{   
    String str = null;   
    int count = 3;   
    do 
    {   
      str = _getPage(page, charset);   
      if (str == null || str.length() == 0) 
     {   
        try 
        {   
          Thread.sleep(1000);   
        } catch (InterruptedException e) {   
          e.printStackTrace();   
        }   
      }   
    } while (str == null && count-- > 0);   
    return str;   
  }   
  
  private static String _getPage(String page, String charset) 
   {   
    try {   
      URL url = new URL(page);   
      HttpURLConnection con = (HttpURLConnection) url.openConnection();   
      // 增加了浏览器的类型,就用Firefox好了,也许   
      con.setRequestProperty(   
              "User-Agent",   
              "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)");   
      int index = page.indexOf("/", 10);   
      con.setRequestProperty("Host", index == -1 ? page.substring(7) : page.substring(7, index));   
      InputStream is = con.getInputStream();   
      if (con.getContentEncoding() != null  
          && con.getContentEncoding().equalsIgnoreCase("gzip")) {   
        is = new GZIPInputStream(con.getInputStream());   
      }   
      BufferedReader reader = new BufferedReader(new InputStreamReader(is,   
          charset));   
      StringBuilder b = new StringBuilder();   
      String line;   
      while ((line = reader.readLine()) != null) {   
        b.append(line);   
        b.append(BR);   
      }   
      reader.close();   
      return b.toString();   
    } catch (FileNotFoundException ex) {   
      System.out.println("NOT FOUND:" + page);   
      return null;   
    } catch (ConnectException ex) {   
      System.out.println("Timeout:" + page);   
      return null;   
    } catch (Exception ex) {   
      ex.printStackTrace();   
      return null;   
    }   
  }   
  
  public static String postPage(String page, String msg) throws Exception {   
    URL url = new URL(page);   
    HttpURLConnection con = (HttpURLConnection) url.openConnection();   
    con.setDoOutput(true); // POST方式   
    con   
        .setRequestProperty(   
            "User-Agent",   
            "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)");   
    int index = page.indexOf("/", 10);   
    con.setRequestProperty("Host", index == -1 ? page.substring(7) : page   
        .substring(7, index));   
    con.setRequestMethod("POST");   
    con.addRequestProperty("Content-Type", "application/x-www-form-urlencoded");   
    OutputStream os = con.getOutputStream(); // 输出流,写数据   
    os.write(msg.getBytes("UTF-8"));   
    InputStream is = con.getInputStream();   
    if (con.getContentEncoding() != null  
        && con.getContentEncoding().equalsIgnoreCase("gzip")) {   
      is = new GZIPInputStream(con.getInputStream());   
    }   
    BufferedReader reader = new BufferedReader(new InputStreamReader(is,   
        "UTF-8")); // 读取结果   
    StringBuilder b = new StringBuilder();   
    String line;   
    while ((line = reader.readLine()) != null) {   
      b.append(line);   
      b.append(BR);   
    }   
    os.close();   
    reader.close();   
    return b.toString();   
  }   
}  
分享到:
评论

相关推荐

    bat获取网页信息

    命令行下调用curl获取网页信息,例如在Java servlet中使用response.getWriter().print("success") curl就可以获取到"success",并保存到check.txt中,再从check.txt中读取数据,并做判断

    bat获取网页信息 命令行下调用curl获取网页信息

    命令行下调用curl获取网页信息,例如在Java servlet中使用response.getWriter().print("success") curl就可以获取到"success",并保存到check.txt中,再从check.txt中读取数据,并做判断

    网页爬虫工具能够抓取网页信息的软件

    网页爬虫工具是用于自动化获取互联网上大量信息的软件,它们可以遍历网页,提取所需的数据,从而帮助用户快速收集和分析网络上的信息。【标题】提到的"网页爬虫工具能够抓取网页信息的软件",正是指的这类工具在IT...

    获取网页并抓取网页信息成图片

    在本文中,我们将深入探讨如何获取网页并抓取网页信息成图片,包括手动方法、自动化工具以及编程实现。 一、手动网页截图 1. 使用浏览器内置功能:大多数现代浏览器(如Chrome、Firefox、Safari等)都内置了截图...

    抓取网页信息程序,并下载下来

    1. **发起HTTP请求**:程序首先发送GET或POST请求到目标网页URL,获取网页源代码。 2. **解析HTML**:收到响应后,程序解析HTML内容,通常使用正则表达式或库如BeautifulSoup(Python)或Jsoup(Java)来定位和提取...

    基于C# 网页信息抓取

    本程序编写了一个从网页中抓取信息(如最新的头条新闻,新闻的来源,标题,内容等)的类,而且本程序文件夹中含有word文件,文件将介绍如何使用这个类来抓取网页中需要的信息。文件将以抓取博客园首页的博客标题和...

    Android Jsoup 爬虫协议抓取网页信息

    `connect()`用于建立HTTP连接,获取网页源代码;`parse()`则用于解析获取到的HTML内容。以下是一个简单的示例: ```java Document doc = Jsoup.connect("http://example.com").get(); Elements links = doc.select...

    演示web 获取网页信息

    在IT行业中,Web获取网页信息是一项基础且至关重要的技能,特别是在大数据分析、网络爬虫以及自动化测试等领域。本文将深入探讨如何演示Web获取网页信息,包括基本原理、常用工具和技术,以及实现步骤。 首先,我们...

    selenium爬虫使用Microsoft Edge浏览器抓取网页信息

    selenium爬虫使用Microsoft Edge浏览器抓取网页信息示例,功能介绍: 1、使用python+selenium; 2、使用Microsoft Edge浏览器; 3、使用XPATH获取网页元素; 4、获取网页的button,并自动点击,刷新下一页,直到获取...

    批量获取网页信息2.0版本

    8. **合规性**:批量获取网页信息必须遵守robots.txt协议,尊重网站的抓取权限,同时注意数据隐私和版权问题。 文件名"web_resource_traverse"可能指的是网页资源遍历,这可能是一个核心模块,负责按照设定的规则...

    Web-Scraping-with-Python_Python网页信息抓取_Python抓取网页_jupyter_Python抓

    首先,我们需要了解的基础库是`requests`,它用于向服务器发送HTTP请求,获取网页HTML内容。在Jupyter中,你可以使用`!pip install requests`命令来安装这个库。一旦安装完成,你可以通过`requests.get(url)`来获取...

    获取网页信息的小工具

    总的来说,这个"获取网页信息的小工具"是一个结合了网络请求、HTML解析、数据判断以及Excel导出的综合解决方案。它的代码简洁,易于理解,用户可以根据自己的需求进行修改,适应不同网页和更复杂的信息抓取任务。...

    python程序:顶级域名获取所有host,获取网页信息 keyword,title,describle等信息

    本项目主要关注如何使用Python来获取顶级域名下的所有Host,并提取网页的关键信息,如Keyword、Title和Description。这里我们将详细讲解相关的Python知识、HTTP协议以及网络爬虫的基本原理。 首先,Python是编写...

    基于STM32开发的使用WiFi模块抓取网页信息

    而通过集成WiFi模块,我们可以使STM32具备无线网络连接能力,从而能够访问互联网并获取网页数据。 1. **STM32基础** STM32系列微控制器由意法半导体(STMicroelectronics)生产,它采用高效的Cortex-M核心,提供...

    matlab爬虫,matlab爬虫获取网页信息,matlab源码.zip

    在这个主题中,我们将深入探讨如何使用MATLAB构建爬虫来获取网页信息。MATLAB虽然以数值计算和科学计算见长,但通过扩展功能,也可以实现网页数据的抓取。 一、MATLAB爬虫基础 1. **Web读取模块**:MATLAB提供了`...

    c#做简单的获取网页上信息

    在C#编程中,获取网页上的信息是一项基本的网络编程任务,主要涉及到HTTP协议和HTML解析。本示例中,我们将探讨如何使用C#来从糗事百科网站抓取评论信息中的注册码。首先,我们需要了解几个关键的概念和技术: 1. *...

    电信设备-网页信息的获取方法和装置.zip

    2. **请求与响应**:在获取网页信息时,电信设备会发送HTTP或HTTPS请求到服务器,然后接收服务器返回的HTML或其他格式的响应。这一过程涉及网络协议的理解和正确使用,确保请求的发起和响应的接收不受干扰。 3. **...

    如何使用XMLSpy抓取网页信息.txt

    如何使用XMLSpy抓取网页信息.txt

    如何使用XMLSpy抓取网页信息.pdf

    如何使用XMLSpy抓取网页信息.pdf

Global site tag (gtag.js) - Google Analytics