前言
本文是大学时候写的,时隔多年,建议大家简单看下代码就好了,移步到另一个博客
基于Java的网页爬虫实践
其中包含了
本文项目san-spider源码地址
https://github.com/lufei222/san-spider.git
简介
作为一个计算机出身的羊毛党,经常因为刷不到标而烦恼,正好之前有过做校园新闻移动版app的经验,这个号的第一条博客。心里有点小激动,mark下如果嫌我说的太多可以直接看标记的和源码和部分。欢迎指出我的不足和交流你的看法
核心方法(在线程run方法中调用
上面一堆乱序的排版估计是csdn博客被弄过什么修改结构,我的两张截图都没了,因为是半年前些的现在也不记得是什么图,最近才发现排版乱了,我也不修改上面了,下面才是重点嘛
代码示例
public static void runn(int lday, int lprice) throws IOException {
Document doc = null;
// System.out.println(getHtmlContent("http://list.lufax.com/list/piaoju","utf-8"))
// ;
try {
doc = (Document) Jsoup
.parse(new URL(
"http://www.solarbao.com/index.php?m=Home&c=zhuangrang&a=index"),
5000);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
//这里抛的异常无法处理声音和文本输出
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
text.setText("访问超时");
FileInputStream fileau = new FileInputStream("a.wav");
AudioStream as = new AudioStream(fileau);
AudioPlayer.player.start(as);
e.printStackTrace();
}
//System.out.println("++++++"+doc);//输出网站源代码
int count = 1;
Elements es = doc.getElementsByClass(".transfer-product-style");
Elements es1 = doc.select(".number");
System.out.println();
Elements es2 = doc.select(".hhem");
int num=0;
List<Map<String, String>> list = new ArrayList<Map<String, String>>();
for (Element e : es1) {
Map<String, String> map = new HashMap<String, String>();
num++;
//map.put("投资标" + String.valueOf(count),e.getElementsByTag("p[span]").text());
//map.put("投资标" + String.valueOf(count),e.select("p").text());
map.put(String.valueOf("1"),e.select("p").text());
if(num%3==0&&num>=3)
list.add(map);
count++;
}
String lowprice, lowday;
// 遍历list集合。
for (int i = 0; i < list.size(); i++) {
String str = list.get(i) + "";
str = str.trim();
str=splitnewjune(str);
// System.out.println(str);
if (str.equals(lowpricefield.getText())||str.equals(lowdayfield.getText())) {
try {
System.out.println("输出后"+str);
text.setText(str);
FileInputStream fileau = new FileInputStream("a.wav");
Class<?> classtype = Class.forName("java.lang.Object");
Class<?> classType = String.class;
Object obj = classType.newInstance();
InputStream fileau1 =baobao.class.getResourceAsStream("a.wav");
AudioStream as = new AudioStream(fileau1);
AudioPlayer.player.start(as);
} catch (Exception e) {
}
}
}
}
字符串处理函数
//六月份最新改版
private static String splitnewjune(String str) {
if(str.contains("元/块"))
str=str.replace(".00元/块","");
str=str.replace("1=","");
str=str.replace("{","");
str=str.replace("}","");
return str;
}
public static String split(String str) {
if (str.contains("成交"))
return "1000";
String str2 = str;
// System.out.println(str2);
if (str2.contains(","))
str2=str2.replace(",","");
int i = str.indexOf("=");
int j = str.indexOf(" ");
str2 = str.substring(i+1, j);
if (str2.contains(","))
str2=str2.replace(",","");
System.out.println("输出后"+str2);
return str2;
}
public static String split2(String str) {
if (str.contains("成交"))
return "1000";
int j = str.indexOf("天");
String str2 = str.substring(j - 3, j);
// System.out.println(str2);
return str2;
}
flag = true;
text.setText("刷新中,我们将以消息声音提示你,请留意");
thread = new MyThread();
thread.start();
}
run方法
public void run() {
while (flag) {
try {
Thread.sleep(Integer.parseInt(timefield.getText() + "000"));
lday = Integer.parseInt(lowdayfield.getText());
lprice = Integer.parseInt(lowpricefield.getText());
ltime = Integer.parseInt(timefield.getText());
runn(lday, lprice);
System.out.println("刷新中");
} catch (InterruptedException | IOException e) {
e.printStackTrace();
}
}
if(!flag){
}
尾声
接着是希望做成安卓版的,但是jsoup在安卓项目中解析出来的数据出问题,到现在我也无法理解为啥我做的安卓新闻可以而这个不行,百度出的原因说是我的安卓项目adt版本库之类的不对,所以解析出现问题,反正安卓开发挺坑的,写着xml也经常出问题。环境安卓各种武林版本我也是醉了,所以这相关的一系列问题弄了我差不多一天半也没有解决完。日后有时间应该还会搞,不过本人想从事苹果移动开发,所以也不希望在安卓这些库和版本环境带来的问题上花太多心思。现在google又又宣布终止对于eclipse的adt的更新,eclipse的末日很快到了应该,我比较考虑未来,所以我觉得我的选择是正确的。但是android studio听爱折腾的舍友说很难使用,怕很多开发者接受不了啊。欢迎大家留下评论和交流告诉我更好更新的技术。