java 抓取网页内容小工具
2015-07-15 14:40
337 查看
之超同志今天问我会不会抓网页的内容,然后把一些表格整理成excel。
好吧,我是不会的,但是我想试试,结果还是可行的。
先说说他的需求吧,他需要把http://www.zjex.com.cn/view/company.php?func=listAll&catalog=0401&page=1这个网站里的所有公司信息都存在一张excel表格里。
我之前没有使用java抓过网页内容,不过用vb.net写过,稍微知道一些。
我搜索到了这篇文章的内容:http://blog.csdn.net/xiaoyu411502/article/details/4500806
然后对其代码删减了点,就可以抓网页的源代码了。
github地址:https://github.com/FieldSoft-HelloClyde/NetGrab
对于其他网址有相应的适配版本
下面是程序执行的第一步,抓取第一页到第22页的内容,把公司子网页的链接存下来。
然后是第二步内容,根据第一步的url,对网页的表格内容进行抓取,保存到txt文档中,每一项都用空格分开。
保存在txt里后,用excel打开这个txt就会出现向导,跟着向导,选择使用分隔符分割,分隔符选择空格,然后把每一列类型都改为文本。
好了,任务完成了
贴一下成果
好吧,我是不会的,但是我想试试,结果还是可行的。
先说说他的需求吧,他需要把http://www.zjex.com.cn/view/company.php?func=listAll&catalog=0401&page=1这个网站里的所有公司信息都存在一张excel表格里。
我之前没有使用java抓过网页内容,不过用vb.net写过,稍微知道一些。
我搜索到了这篇文章的内容:http://blog.csdn.net/xiaoyu411502/article/details/4500806
然后对其代码删减了点,就可以抓网页的源代码了。
github地址:https://github.com/FieldSoft-HelloClyde/NetGrab
对于其他网址有相应的适配版本
下面是程序执行的第一步,抓取第一页到第22页的内容,把公司子网页的链接存下来。
import java.io.BufferedInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.net.HttpURLConnection; import java.net.URL; import java.util.ArrayList; public class Main { /** * 主函数 * @param args */ static public void main(String[] args){ String SrcWebSiteUrl = new String("http://www.zjex.com.cn/view/company.php?func=listAll&catalog=0401&page="); int WebSitePageId = 1; ArrayList<String> WebUrlArrayList = new ArrayList<String>(); for (WebSitePageId = 1;WebSitePageId <= 22;WebSitePageId ++){ //抓取网页内容 String WebSiteString; WebSiteString = GetWebSiteSourceCode("http://www.zjex.com.cn/view/company.php?func=listAll&catalog=0401&page=" + WebSitePageId); //System.out.println(WebSiteString); GetWebUrl(WebSiteString,WebUrlArrayList); } } /** * 从网页源代码中获取需要的网址,存入列表中 * @param WebSiteString * @return */ public static void GetWebUrl(String WebSiteString,ArrayList<String> DesArray){ String KeyString = new String("<div class=\"comimg fl\"><a href=\""); String EndString = new String("\">"); int SearchFromIndex = 0; int SearchIndex; SearchIndex = WebSiteString.indexOf(KeyString, SearchFromIndex); while (SearchIndex != -1){ String TempUrl; int StringEndIndex; StringEndIndex = WebSiteString.indexOf(EndString, SearchIndex + KeyString.length()); TempUrl = WebSiteString.substring(SearchIndex + KeyString.length(), StringEndIndex); System.out.println(TempUrl); DesArray.add(new String(TempUrl)); SearchFromIndex = StringEndIndex + EndString.length(); SearchIndex = WebSiteString.indexOf(KeyString, SearchFromIndex); } } /** * 获取指定网页内容 * @param url * @return */ public static String GetWebSiteSourceCode(String url) { StringBuffer temp = new StringBuffer(); try { HttpURLConnection uc = (HttpURLConnection)new URL(url). openConnection(); uc.setConnectTimeout(10000); uc.setDoOutput(true); uc.setRequestMethod("GET"); uc.setUseCaches(false); InputStream in = new BufferedInputStream(uc.getInputStream()); Reader rd = new InputStreamReader(in, "utf-8"); int c = 0; while ((c = rd.read()) != -1) { temp.append((char) c); } in.close(); } catch (Exception e) { e.printStackTrace(); } return temp.toString(); } }
然后是第二步内容,根据第一步的url,对网页的表格内容进行抓取,保存到txt文档中,每一项都用空格分开。
import java.io.FileNotFoundException; import java.io.FileReader; import java.io.PrintWriter; import java.util.Scanner; public class GetTable { public static void main(String[] args){ try { String UrlTextFileName = new String("d:/url.txt"); Scanner FileScanner = new Scanner(new FileReader(UrlTextFileName)); PrintWriter DesTxt = new PrintWriter("d:/table.txt"); String[] TypeStrArray = {"公司名称","公司简称","企业代码","法人代表","挂牌日期","董秘","董秘电话","董秘QQ","董秘邮箱","注册日期" ,"注册资本","推荐机构","会计师事务所","所属板块","所属行业","所在地","注册地址","办公地址","公司网址","经营范围"}; //输出表头 for (String TempStr:TypeStrArray){ DesTxt.print(TempStr + " "); } DesTxt.println(); while (FileScanner.hasNextLine()){ String WebUrl = FileScanner.nextLine(); String WebSiteString = Main.GetWebSiteSourceCode("http://www.zjex.com.cn" + WebUrl); ReadTable(WebSiteString,DesTxt,TypeStrArray); } DesTxt.close(); } catch (FileNotFoundException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } public static void ReadTable(String WebSiteString,PrintWriter DesPW,String[] TypeArray){ int ArrayIndex = 0; for (ArrayIndex = 0;ArrayIndex < TypeArray.length;ArrayIndex ++){ int SearchIndex = WebSiteString.indexOf(TypeArray[ArrayIndex]); //读取下一行 int StartIndex = WebSiteString.indexOf((char)13, SearchIndex) + 1; int EndIndex = WebSiteString.indexOf((char)13,StartIndex); String TempStr = WebSiteString.substring(StartIndex, EndIndex); //对获取的字符串处理 String DesStr = GetValueString(TempStr); System.out.println(DesStr); DesPW.print(DesStr + " "); } DesPW.println(); } public static String GetValueString(String Src){ StringBuffer DesStr = new StringBuffer(""); boolean IsBlock = false; for (int index = 0;index < Src.length();index ++){ char TempChar = Src.charAt(index); if (IsBlock){ if (TempChar == '>'){ IsBlock = false; } } else{ if (TempChar == '<'){ IsBlock = true; } else{ DesStr.append(TempChar); } } } return DesStr.toString().trim(); } }
保存在txt里后,用excel打开这个txt就会出现向导,跟着向导,选择使用分隔符分割,分隔符选择空格,然后把每一列类型都改为文本。
好了,任务完成了
贴一下成果
相关文章推荐
- Scheme 4 Javaer-3.高阶函数
- 接口interface
- java基本教程之线程休眠 java多线程教程
- java基本教程之java线程等待与java唤醒线程 java多线程教程
- 浅析Java中Map与HashMap,Hashtable,HashSet的区别
- 例子分析java.util.concurrent.ExecutorService
- java 获取当前时间前7天的日期
- Spring3 MVC请求参数获取的几种方法[转]
- final关键字
- java多线程详细总结
- Java中Comparable和Comparator实现对象比较
- JAVA多线程Thread和Runnable的实现
- java向多线程中传递参数的三种方法详细介绍
- java实现文本和文件的压缩和解压缩
- super关键字
- JAVA常用快捷键
- 打开eclipse中文件所在目录
- Java多线程的用法详解
- 方法重写
- java 静态块、非静态块、静态函数、构造函数 执行顺序