「原创声明:保留所有权利,禁止转载」
下面是使用 httpclient 爬虫爬取某个网站的汉字相关信息的实践代码,中间遇到了一些字符格式的问题。之前被同事见过用 html 解析类来抓取页面信息,而不是像我现在用正则,经常尝试,效果并不好,毕竟页面放爬虫还是非常好做的。在本次实践中,就遇到了相关的难点,所以还是才去了正则提取的方式。分享代码,供大家参考。关键信息并未隐去。
public static void main(String[] args) throws SQLException {
DEFAULT_CHARSET = GB2312;
List<String> list = WriteRead.readTxtFileByLine(LONG_Path + "word.log");
list.forEach(py -> {
getPYAndWord(py);
});
testOver();
}
public static void getPYAndWord(String py) {
output(py);
String url = "http://zd.diyifanwen.com/zidian/py/" + py + ".htm";
HttpGet httpGet = getHttpGet(url);
JSONObject response = getHttpResponse(httpGet);
// output(response);
String content = response.getString("content");
String all = new String(content.getBytes(UTF_8), UTF_8);
List<String> regexAll = new ArrayList<>();
List<String> alllist = regexAll(all, "http://zd.d.*?>[\\u4e00-\\u9FFF]<");
output(alllist.size());
alllist.forEach(line -> {
String murl = regexAll(line, "http://zd.diyifanwen.com/zidian/\\w/\\d+.htm").get(0);
String mword = regexAll(line, ">[\\u4e00-\\u9fa5]<").get(0);
regexAll.add(mword);
output(murl, mword);
String sql = "INSERT INTO chinese_dictionary_word (word,url) VALUES (\"%s\",\"%s\");";
sql = String.format(sql, mword.replaceAll("<|>", EMPTY), murl);
output(sql);
MySqlTest.sendWork(sql);
});
String str = regexAll.toString().replaceAll("<|>|\\[|\\]", EMPTY);
String sql = "INSERT INTO chinese_dictionary_py_word (py,words) VALUES (\"%s\",\"%s\");";
sql = String.format(sql, py, str);
output(sql);
MySqlTest.sendWork(sql);
sleep(2);
}
/**获取拼音列表
* @return
*/
public static String getPY() {
String url = "http://zd.diyifanwen.com/zidian/py/";
HttpGet httpGet = getHttpGet(url);
JSONObject response = getHttpResponse(httpGet);
// output(response);
String content = response.getString("content");
byte[] bytes = content.getBytes(UTF_8);
String all = new String(bytes, UTF_8);
Log.log("content", all);
return all;
}
/**获取所有首字母和拼音
* @param all
*/
public static void getAllPY(String all) {
List<String> list = regexAll(all, "<dt class=\"pyTitle\">拼音首字母\\w+</dt>" + LINE + ".+/dd>");
list.forEach(s -> {
int num = s.indexOf("拼音首字母");
String first = s.substring(num + 5, num + 6);
List<String> list1 = regexAll(s, "http://zd.diyifanwen.com/zidian/py/\\w+.htm");
list1.forEach(str -> {
int one = str.indexOf("/py/");
int two = str.lastIndexOf(".");
String second = str.substring(one + 4, two);
String sql = "INSERT INTO chinese_dictionary_py (first_word,all_word) VALUES (\"%s\",\"%s\");";
String sqlEnd = String.format(sql, first, second);
MySqlTest.sendWork(sqlEnd);
});
});
}
/**检查拼音是否全部获取到
* @param all
*/
public static void checkPY(String all) {
List<String> list = regexAll(all, "zidian/py/\\w+.htm");
list.forEach(str -> {
int one = str.indexOf("/py/");
int two = str.lastIndexOf(".");
String second = str.substring(one + 4, two);
output(second);
String sql = "SELECT * FROM chinese_dictionary_py WHERE all_word = \"%s\";";
String sq = String.format(sql, second);
ResultSet resultSet = MySqlTest.excuteQuerySql(sq);
try {
if (!resultSet.next()) output(sq);
} catch (SQLException e) {
e.printStackTrace();
}
});
}
/**从数据库中查找当前获取的拼音并存储到文件中
* @throws SQLException
*/
public static void getAllPY() throws SQLException {
List<String> word = new ArrayList<>();
ResultSet resultSet = MySqlTest.excuteQuerySql("SELECT all_word FROM chinese_dictionary_py;");
while (resultSet.next()) {
String string = resultSet.getString(1);
word.add(string);
}
Save.saveStringList(word, "word");
}
结果如图:
对于汉字具体的释义内容并未爬取,连接进行了保存。
技术类文章精选
- java 一行代码打印心形
- Linux 性能监控软件 netdata 中文汉化版
- 接口测试代码覆盖率(jacoco)方案分享
- 性能测试框架
- 如何在 Linux 命令行界面愉快进行性能测试
- 图解 HTTP 脑图
- 如何测试概率型业务接口
- httpclient 处理多用户同时在线
- 将 swagger 文档自动变成测试代码
- 五行代码构建静态博客
- httpclient 如何处理 302 重定向
- 基于 java 的直线型接口测试框架初探
- Tcloud 云测平台 -- 集大成者
非技术文章精选
- 为什么选择软件测试作为职业道路?
- 成为杰出 Java 开发人员的 10 个步骤
- 写给所有人的编程思维
- 自动化测试的障碍
- 自动化测试的问题所在
- 测试之《代码不朽》脑图
- 成为优秀自动化测试工程师的 7 个步骤
- 优秀软件开发人员的态度
- 如何正确执行功能 API 测试
TesterHome 为用户提供「保留所有权利,禁止转载」的选项。
除非获得原作者的单独授权,任何第三方不得转载标注了「原创声明:保留所有权利,禁止转载」的内容,否则均视为侵权。
具体请参见TesterHome 知识产权保护协议。
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。