[0403]学习一个——苟(简单Java开发)
学习一个——苟
1. 开发目的
- 拜读了某神犇的blog,感到了自身深深的不足。蒟蒻如我,决定提高一蛤自身的姿势水平,学习一个,使用Java重写用GreatestLanguage写的某小说网站的抓取器。
2. 分析&实现
2.1 Gui
- 因为有之前帮国外小老板写java作业的经验:
- 他object的PDF上实现效果是这样:
- 我实现的弱鸡效果是这样:
- 使用GridLayout实现的代码:
- 他object的PDF上实现效果是这样:
guiFrame =new JFrame("龙弟弟");
guiFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
guiFrame.setLocation(400, 200);
JPanel panel=new JPanel(new GridLayout(0,8));
for(int i=0;i<64;++i) {
Color tmp=new Color((int)(1+Math.random()*255),(int)(1+Math.random()*255),(int)(1+Math.random()*255));
arrayLabels[i]=new ColorLabel(40,40,tmp);
panel.add(arrayLabels[i]);
}
GridBagLayout gridbag = new GridBagLayout();
GridBagConstraints c = new GridBagConstraints();
guiFrame.setLayout(gridbag);
c.weightx = 1.0;
c.weighty = 1.0;
c.gridwidth = GridBagConstraints.REMAINDER;
c.gridheight = 1;
gridbag.setConstraints(panel, c);
guiFrame.add(panel);
JButton b = new JButton("Press me to refresh labels");
Dimension preferredSize = new Dimension(320,40);
b.setPreferredSize(preferredSize);
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
for(int i=0;i<64;++i) {
Color tmp=new Color((int)(1+Math.random()*255),(int)(1+Math.random()*255),(int)(1+Math.random()*255));
arrayLabels[i].SetDrawColor(tmp);
}
guiFrame.setTitle("LDD");
guiFrame.repaint();
}
});
guiFrame.add(b);
guiFrame.setVisible(true);
guiFrame.setSize(guiFrame.getPreferredSize());
+ emmm这也算是用GridLayout完成了
- 所以这次我熟练了!GridLayout垃圾!EmptyBorder最高!
- 我设想的是这样:
- 最后做出来是这样:
- Code:
- 我设想的是这样:
public Gui() {
setTitle("苟");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(350,400);
Font f = new Font("微软雅黑", Font.BOLD, 18);
UIManager uiManager=new UIManager();
uiManager.put("Label.font", f);
uiManager.put("TextField.font", f);
uiManager.put("TextField.setColumns", 1);
uiManager.put("TextArea.font", f);
uiManager.put("Button.font", f);
uiManager.put("RadioButton.font", f);
JPanel content;
content = new JPanel();
content.setBackground(SystemColor.controlHighlight);
content.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(content);
content.setLayout(null);
JLabel label1=new JLabel("网址:");
label1.setBounds(15, 10, 100, 30);
content.add(label1);
JTextField textField1 = new JTextField();
textField1.setColumns(1);
textField1.setBounds(115, 10, 180, 30);
content.add(textField1);
JLabel label2=new JLabel("保存地址:");
label2.setBounds(15, 45, 100, 30);
content.add(label2);
JTextField textField2 = new JTextField("E://");
textField2.setBounds(115, 45, 180, 30);
content.add(textField2);
JLabel label3=new JLabel("线程数:");
label3.setBounds(15, 80, 100, 30);
content.add(label3);
JTextField textField3 = new JTextField("20");
textField3.setBounds(115, 80, 30, 30);
content.add(textField3);
textField3.addKeyListener(new KeyAdapter() {
public void keyTyped(KeyEvent e) {
int keyChar = e.getKeyChar();
if(keyChar >= KeyEvent.VK_0 && keyChar <= KeyEvent.VK_9){
}else{
e.consume();
}
}
});
JLabel label4=new JLabel("检查间隔/s:");
label4.setBounds(150, 80, 130, 30);
content.add(label4);
JTextField textField4 = new JTextField("1");
textField4.setBounds(265, 80, 30, 30);
content.add(textField4);
JLabel label5=new JLabel("过滤规则:");
label5.setBounds(15, 115, 130, 30);
content.add(label5);
JTextArea textArea1 = new JTextArea();
JScrollPane scrollPane=new JScrollPane(textArea1);
scrollPane.setBounds(15, 150, 120, 180);
scrollPane.setHorizontalScrollBarPolicy(
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scrollPane.setVerticalScrollBarPolicy(
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
content.add(scrollPane);
JRadioButton radiobutton1=new JRadioButton("完成时打开",true);
radiobutton1.setBounds(160, 115, 130, 30);
content.add(radiobutton1);
JTextArea textArea2 = new JTextArea();
textArea2.setBounds(160, 150, 130, 130);
content.add(textArea2);
JButton button1 = new JButton("Do it!");
button1.setBounds(160, 300, 130, 30);
button1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(Gui.this,"开始抓取!");
}
});
content.add(button1);
}
+ 所以Java跟GreatestLanguage对像素的定义居然不一样???
+ 抄(划)用到的姿势:
* [文本框添加滚动条](https://blog.csdn.net/xueerfei008/article/details/36006961)
* [批量设置控件属性](https://blog.csdn.net/yjqyyjw/article/details/52301963)
* [文本框只允许输入数字](https://blog.csdn.net/lanjianhun/article/details/8273453)
+ 未实现的:
* 文本框加上调节器,Java似乎没有这个控件,需要手动实现
2.2 HTTP读文本&正则取出文本中间内容
- Java没有封装HTTP读文本类肿么办!不怕!抄(划掉)学习一个!不会正则肿么办,emmmmm,只有学习一个了。
- 一开始抄的HTTP读文本蜜汁不支持读网页端的笔趣阁,只能读wap端口的
- wap端口的目录一个网页只有20章
- 要翻页获取
- 每次下一页所在的标签都不是用一个位置
- 第一页和最后一页要特殊定义
- 然后我都实现了!
String bookurl="http://m.b5200.net"+UrlList.get(2);
List<String> allurl = new ArrayList();
List<String> allna = new ArrayList();
List<String> NameList;
//获取正序目录
content = getHtmlContent(bookurl);
regex = "<a[^>]*href=\"/wapbook-[^>]*>.*?</a>";
link = getContentByRegex(content,regex);
UrlList = match(link.toString(), "a", "href");
bookurl="http://m.b5200.net"+UrlList.get(0);
String endurl="http://m.b5200.net"+UrlList.get(2);
//访问正序目录
//boolean first=true;
/*while(bookurl!=endurl) {
System.out.println(bookurl);
content = getHtmlContent(bookurl);
regex = "<a[^>]*href=\"/wapbook-[^>]*>.*?</a>";
link = getContentByRegex(content,regex);
UrlList = match(link.toString(), "a", "href");
//System.out.println(UrlList);
if(first){first=false;bookurl="http://m.b5200.net"+UrlList.get(2);}
else {bookurl="http://m.b5200.net"+UrlList.get(4);}
regex = "<a[^>]*href='/wapbook-[^>]*>.*?</a>";
link = getContentByRegex(content,regex);
UrlList = match(link.toString(), "a", "href");
NameList = getLabelValues(link.toString(),regex);
allurl.addAll(UrlList);
allna.addAll(NameList);
+ 最后发现wap端容易崩,单线程读5次目录就502了……Orz,只能重写
- 重写之后,可以完美读PC端内容了!
- Java的格式化代码总是出现奇奇怪怪的排版
public static List<Map<String, String>> getbook(String urlNameString) {
List<Map<String, String>> reqMap = new ArrayList<Map<String, String>>();
try {
String content = getHtmlContent(urlNameString);
System.out.println(getTitle(content));
// 获取小说信息的结果
String regex = "<a[^>]*href=\"" + urlNameString + "[^>]*>.*?</a>";
List<String> link = getContentByRegex(content, regex);// 包含标签的地址
List<String> UrlList = match(link.toString(), "a", "href"); // 每章Url地址
List<String> NameList = getLabelValues(link.toString(), regex); // 每章标题
//System.out.println("NameList:" + NameList.get(0));
//getchapter(UrlList.get(0));
} catch (Exception e) {
e.printStackTrace();
}
return reqMap;
}
private static String getchapter(String Url) {
StringBuilder chapter = new StringBuilder();
try {
String content = getHtmlContent(Url);
String regex = "<div id=\"content\">[^>]*>.*?</div>";
List<String> tmp = getContentByRegex(content, regex);
List<String> tmp2 = getLabelValues(tmp.toString(), regex);
String tmp3 = tmp2.get(0);
System.out.println(tmp3);
String[] array = tmp3.split(" ");
for (String str : array) {
chapter.append(str).append("\n");
}
// System.out.println(chapter.toString());
} catch (Exception e) {
e.printStackTrace();
}
return chapter.toString();
}
+ 美丽的测试输出:
2.3 天国的多线程
- 由于我太弱,研究一晚上仍未找到跨类调用的方法,比如说在Thread类中调用GUI类中定义的Re类中的某个项-、-
- 还比如如何在Thread类中修改GUI类中定义的JFrame中的参数,比如说
Thread extends Gui{
……
super.setTitle();
super.TextArea1.setFront();
- 都是不合法的…战略性放弃,改日再战。
- 本来写的检查间隔是用来设置一个clock来监控操作是否完成强行结束线程防止溢出的,现在成了摆设=、=
- 还是易语言写多线程&图形化编程简单啊…
2.4 获取章节内容并输出
- 速度极慢的还得等待防止502的单线程:
FileWriter fw = new FileWriter(SaveAddress, true);
BufferedWriter bw = new BufferedWriter(fw);
bw.append(getTitle()+"\r\n");
for(int i=0;i<a.num;++i) {
bw.append(a.NameList.get(i)+"\r\n");
textArea2.append(a.NameList.get(i)+"\r\n");
bw.append(a.getchapter(i));
System.out.println(a.NameList.get(i));
Thread.currentThread().sleep(1000);
}
bw.close();
fw.close();
- 最终效果:
,也算是基本实现了功能
2.5 完成时打开文件夹
- 似乎有
runtime.exec("explorer /select, " + yourFileOrFolderLocation);
这种神奇的操作,但我没有实现。 - code:
if(radiobutton1.isSelected())
try {
java.awt.Desktop.getDesktop().open(new File(SaveAddress));
} catch (IOException e2) {
e2.printStackTrace();
}
3. 后记
- 也算是Java写的第一个具有一定应用价值的桌面化程序,已发布在Github。
- 代码书写格式仍有许多不足,大抵是平时练习过少导致的,也有少部分是因为OI带来的历史遗留问题,只考虑完成算法-》完美运行,没有考虑到后续维护。
- 懒,没写纯字符串的文本_取出中间文本,文本_去中间_批量,大概会比正则快上那么一点?主要是Java调用不了易语言写的DLL,太遗憾了。
- 最后跟我念:”E is the Greatest Language!"
[0403]学习一个——苟(简单Java开发)的更多相关文章
- 搭建一个完整的Java开发环境
搭建一个完整的Java开发环境 作为一个Java程序员,配置一个java开发环境是必备的技能,今天给广大菜鸟初学者补上一课.环境的配置,大概就分三个1,JDK 2,Tomcat(或者其他的)3,ecl ...
- 10步成为一个优秀的Java开发!
1.拥有坚实的基础并理解面向对象原则 Java开发人员必须深刻理解面向对象编程.如果没有面向对象编程的坚实基础,就无法感受到像Java这样的面向对象编程语言的美感. 如果你不太了解现象对象编程是什么, ...
- 菜鸟从零学编程(七)——搭建一个完整的Java开发环境
作为一个Java程序员,配置一个java开发环境是必备的技能,今天给广大菜鸟初学者补上一课.环境的配置,大概就分三个1,JDK 2,Tomcat(或者其他的)3,eclipse(或者myeclipse ...
- 菜鸟学Java(十二)——搭建一个完整的Java开发环境
作为一个Java程序员,配置一个java开发环境是必备的技能,今天给广大菜鸟初学者补上一课.环境的配置,大概就分三个1,JDK 2,Tomcat(或者其他的)3,eclipse(或者myeclipse ...
- 来认识一下venus-init——一个让你仅需一个命令开始Java开发的命令行工具
源代码地址: Github仓库地址 个人网站:个人网站地址 前言 不知道你是否有过这样的经历.不管你是什么岗位,前端也好,后端也罢,想去了解一下Java开发到底是什么样的,它是不是真的跟传说中的一样. ...
- Selenium2学习-001-Selenium2 WebUI自动化Java开发 Windows 环境配置
此文主要介绍 Selenium2 WebUI自动化Java开发 Windows 环境配置,供各位亲们参考,若有不足之处,敬请各位大神指正,非常感谢! 所需软件列表如下所示: 所属分类 具体名称 备注 ...
- JUC学习笔记--从阿里Java开发手册学习线程池的正确创建方法
前言 最近看阿里的 Java开发手册,上面有线程池的一个建议: [强制]线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式, 这样的处理方式让写的同学 ...
- Ubuntu学习总结-04 搭建JAVA开发环境
JAVA开发环境是一种跨平台的程序设计语言,可以在windows.LINUX等操作系统上进行开发. 1 下载JDK 从以下地址下所需的jdk安装包 . http://www.oracle.com/te ...
- 一个四五年的Java开发程序员,该准备哪些去面试?
上周面试了一周,感触颇深,总结一下. 面试了公司大概有阿里,携程,爱奇艺,唯品会,途牛,bilibili,大众点评,阿里和爱奇艺是电话面试,其他现场面试. 首先,五年左右,应该算高级开发工程师,大部分 ...
随机推荐
- python 创建二维数组的方法
废话不多说,直接上代码: #coding=utf-8 def two_di_demo1(): a=[] for i in range(10): a.append([]) for j in range( ...
- 使用github管理Eclipse分布式项目开发
使用github管理Eclipse分布式项目开发 老关我在前面的博文(github管理iOS分布式项目开发)中介绍了github管理iOS分布式开发,今天老关将向大家介绍使用github管 理Ecli ...
- <转>jmeter(九)逻辑控制器
本博客转载自:http://www.cnblogs.com/imyalost/category/846346.html 个人感觉不错,对jmeter讲解非常详细,担心以后找不到了,所以转发出来,留着慢 ...
- Django框架----Ajax
一.Ajax准备知识:json 说起json,我们大家都了解,就是python中的json模块,那么json模块具体是什么呢?那我们现在详细的来说明一下 1.json(Javascript Obie ...
- codevs——1003——电话连线
题目描述 Description 一个国家有n个城市.若干个城市之间有电话线连接,现在要增加m条电话线(电话线当然是双向的了),使得任意两个城市之间都直接或间接经过其他城市有电话线连接,你的程序应该能 ...
- ES6知识整理(5)--对象的扩展
个人开这个公众号的初心是为了积累知识,因此并没有做什么推广,再说自己也不知道怎么推广,推广之后又能干些什么.已经将近10天没发文章了,虽然每天都加班,但也不会一点时间都没有,有时还是会懒癌发作不想学习 ...
- 第五章 CSS常用属性笔记
1. span标签 突显,强调局部文字的作用. 2.字体样式 font-size: 字体大小 font-style:normal,italic(倾斜) font-weight:normal,bold( ...
- oracle审计例子
1.数据库开启审计alter system set audit_trail=db,extended scope=spfile;shutdown immediatestartup 2.对某个表进行审计c ...
- libopencv_shape.so.3.0: cannot open shared object file: No such file or directory 解决笔记
进入目录:/etc/ld.so.conf.d 创建:opencv.conf 添加:/opt/opencv-3.0.0/build/lib 执行:ldconfig DETAIL: (1)ldd dlsd ...
- 20145308 《网络对抗》 Web应用 学习总结
20145308 <网络对抗> Web应用 学习总结 实验内容 (1)Web前端HTML (2)Web前端javascipt (3)Web后端:MySQL基础:正常安装.启动MySQL,建 ...