- 浏览: 419680 次
- 性别:
- 来自: 济南
文章分类
最新评论
-
pmh905001:
写的很详尽,感谢!
解析jvm.dll和java.exe -
Bll:
插得真深啊,我的是(eclipse_j2ee_juno):F: ...
在eclipse里jsp编译后的java和class文件的位置 -
heming_way:
谢谢,对我很有用,解答了我对多值依赖的疑问
关于多值依赖--范式! -
JavaStudy2011:
java语言解析xml文件 -
vrussell:
Thanks man, it helps me a lot!
获得IEditorPart和IDocument
1 我这里只给出关键的部分,使用java程序实现,而不是JSP的代码。移植工作请自行完成。
2 我使用自己的数据库连接,请替换为应用服务器提供的数据源为好
3 代码分三部分,数据库结构,POJO类和应用程序
一、数据库结构 AmazonGoods.sql 使用的是MySQL的数据库
查看复制到剪切板打印
二、POJO类 AmazonGoods.java
三、应用类
查看复制到剪切板打印
四、辅助类 PageService.java
查看复制到剪切板打印
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(); } }
发表评论
-
IE中的条件编译
2011-10-30 18:53 2080引用条件编译介绍 在IE有一个几乎没人知道的特性--“条件编 ... -
ClientAbortException: java.net.SocketException: Connection reset by peer: socke
2011-10-13 14:25 1描述下问题 tomcat报错 ClientAbortExc ... -
(转)实现Ajax请求队列按顺序执行
2011-10-07 10:23 5504摘自http://www.ilovejs.net/archiv ... -
关于无法delete文件
2011-09-26 17:12 1421File f=new File(targetDir+&qu ... -
firefox上传文件
2011-09-23 15:19 2184先看一个实例: jsp <tr class=" ... -
HTML标签的<button>导致数据在firefox自动提交和在firefox里面弹出div窗口失败
2011-09-07 15:22 1793项目中遇到这么个问题 项目中想利用div制造弹出窗口的操作 c ... -
转:Div自适应高度
2011-08-04 14:49 1515由于设计页面需要,要把两个并排显示的div实现一样高的效果,n ... -
在eclipse里jsp编译后的java和class文件的位置
2011-08-03 14:08 10266eclipse版本不一样,位置也不一样 第一种:(网上搜到的) ... -
iframe的属性:document和Document以及Document的属性和iframe在各个浏览器获得内部文档的写法
2011-08-03 11:37 2113.document引用到是的 iframe所在页面对象, .D ... -
浏览器加载显示html的顺序
2011-08-02 15:36 2316其实浏览器加载显示html的顺序是按下面的顺序进行的: 1、I ... -
PreparedStatement setString 特殊字符乱码
2011-07-29 13:27 2250PreparedStatement setString 特殊字 ... -
符编码笔记:ASCII,Unicode和UTF-8
2011-07-29 10:37 931阮一峰 日期: 2007年10月28日 1. ASCII码 ... -
自己写的多表单插入数据和几个form同时提交
2011-07-28 18:40 3136<%@ page language="ja ... -
获得IEditorPart和IDocument
2011-04-18 13:08 2044IWorkbench workbench=Platform ... -
黑客利用js--alert(1)
2011-03-14 12:51 2887Javascript代码 ($=[$=[]][(__=!$+ ... -
Tomcat的Classloader
2010-08-27 17:48 4250Tomcat的启动是从解析bat文件开始,bat文件最终调用o ... -
Tomcat启动过程
2010-08-11 15:03 1172今天在独立的Tomcat中部署LifeRay Portal , ... -
Spring中bean的作用域
2010-08-10 13:44 1818如何使用spring的作用域 ... -
@SuppressWarnings("*****")
2010-08-07 16:25 1081解释一: 屏蔽某些编译时的警告信息 ... -
各种类型文件中java的形式
2010-08-06 17:35 1328.a' : 'application/octet-s ...
相关推荐
命令行下调用curl获取网页信息,例如在Java servlet中使用response.getWriter().print("success") curl就可以获取到"success",并保存到check.txt中,再从check.txt中读取数据,并做判断
命令行下调用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)来定位和提取...
本程序编写了一个从网页中抓取信息(如最新的头条新闻,新闻的来源,标题,内容等)的类,而且本程序文件夹中含有word文件,文件将介绍如何使用这个类来抓取网页中需要的信息。文件将以抓取博客园首页的博客标题和...
`connect()`用于建立HTTP连接,获取网页源代码;`parse()`则用于解析获取到的HTML内容。以下是一个简单的示例: ```java Document doc = Jsoup.connect("http://example.com").get(); Elements links = doc.select...
在IT行业中,Web获取网页信息是一项基础且至关重要的技能,特别是在大数据分析、网络爬虫以及自动化测试等领域。本文将深入探讨如何演示Web获取网页信息,包括基本原理、常用工具和技术,以及实现步骤。 首先,我们...
selenium爬虫使用Microsoft Edge浏览器抓取网页信息示例,功能介绍: 1、使用python+selenium; 2、使用Microsoft Edge浏览器; 3、使用XPATH获取网页元素; 4、获取网页的button,并自动点击,刷新下一页,直到获取...
8. **合规性**:批量获取网页信息必须遵守robots.txt协议,尊重网站的抓取权限,同时注意数据隐私和版权问题。 文件名"web_resource_traverse"可能指的是网页资源遍历,这可能是一个核心模块,负责按照设定的规则...
首先,我们需要了解的基础库是`requests`,它用于向服务器发送HTTP请求,获取网页HTML内容。在Jupyter中,你可以使用`!pip install requests`命令来安装这个库。一旦安装完成,你可以通过`requests.get(url)`来获取...
总的来说,这个"获取网页信息的小工具"是一个结合了网络请求、HTML解析、数据判断以及Excel导出的综合解决方案。它的代码简洁,易于理解,用户可以根据自己的需求进行修改,适应不同网页和更复杂的信息抓取任务。...
本项目主要关注如何使用Python来获取顶级域名下的所有Host,并提取网页的关键信息,如Keyword、Title和Description。这里我们将详细讲解相关的Python知识、HTTP协议以及网络爬虫的基本原理。 首先,Python是编写...
而通过集成WiFi模块,我们可以使STM32具备无线网络连接能力,从而能够访问互联网并获取网页数据。 1. **STM32基础** STM32系列微控制器由意法半导体(STMicroelectronics)生产,它采用高效的Cortex-M核心,提供...
在这个主题中,我们将深入探讨如何使用MATLAB构建爬虫来获取网页信息。MATLAB虽然以数值计算和科学计算见长,但通过扩展功能,也可以实现网页数据的抓取。 一、MATLAB爬虫基础 1. **Web读取模块**:MATLAB提供了`...
在C#编程中,获取网页上的信息是一项基本的网络编程任务,主要涉及到HTTP协议和HTML解析。本示例中,我们将探讨如何使用C#来从糗事百科网站抓取评论信息中的注册码。首先,我们需要了解几个关键的概念和技术: 1. *...
2. **请求与响应**:在获取网页信息时,电信设备会发送HTTP或HTTPS请求到服务器,然后接收服务器返回的HTML或其他格式的响应。这一过程涉及网络协议的理解和正确使用,确保请求的发起和响应的接收不受干扰。 3. **...
如何使用XMLSpy抓取网页信息.txt
如何使用XMLSpy抓取网页信息.pdf