采集baidu搜索信息的java源代码实现(大部分转发,少量自己修改)(使用了htmlunit和Jsoup)(转发:https://blog.csdn.net/zhaohang_1/article/details/44731039)
1.maven依赖
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zhaowu</groupId>
<artifactId>pachong01</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</dependency> <!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.11.2</version>
</dependency> <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency> <!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency> <!-- https://mvnrepository.com/artifact/cn.edu.hfut.dmic.webcollector/WebCollector -->
<dependency>
<groupId>cn.edu.hfut.dmic.webcollector</groupId>
<artifactId>WebCollector</artifactId>
<version>2.71</version>
</dependency> <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency> <!-- https://mvnrepository.com/artifact/net.sourceforge.htmlunit/htmlunit -->
<dependency>
<groupId>net.sourceforge.htmlunit</groupId>
<artifactId>htmlunit</artifactId>
<version>2.29</version>
</dependency> </dependencies>
</project>
2.建立项目
3.观察网页内容
4.好,来代码!
- package bdsearch;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.net.MalformedURLException;
- import java.net.URL;
- import java.util.ArrayList;
- import org.jsoup.Jsoup;
- import org.jsoup.nodes.Element;
- import org.jsoup.select.Elements;
- import com.gargoylesoftware.htmlunit.BrowserVersion;
- import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
- import com.gargoylesoftware.htmlunit.WebClient;
- import com.gargoylesoftware.htmlunit.html.HtmlInput;
- import com.gargoylesoftware.htmlunit.html.HtmlPage;
- ///////////////关于htmlunit的相关资料,在此站上有些资料,参考了一下:http://www.cnblogs.com/cation/p/3933408.html
- public class HtmlUnitforBD {
- private static int N = 3;// 搜索页数
- private static String keyW = "习大大";// 搜索词
- private static HtmlPage firstBaiduPage;// 保存第一页搜索结果
- private static String format = "";// Baidu对应每个搜索结果的第一页第二页第三页等等其中包含“&pn=1”,“&pn=2”,“&pn=3”等等,提取该链接并处理可以获取到一个模板,用于定位某页搜索结果
- private static ArrayList<String> eachurl = new ArrayList<String>();// 用于保存链接
- public static void main(String[] args) throws Exception {
- mainFunction(N, keyW);
- }
- public static void mainFunction(final int n, final String keyWord) throws FailingHttpStatusCodeException, MalformedURLException, IOException {
- Thread thread = new Thread(new Runnable() {
- @Override
- public void run() {
- int x = n;// 页数
- System.out.println("要提取百度关于“" + keyWord + "”搜索结果的前" + x + "页");
- /*
- * 1.获取并输出第一页百度查询内容
- */
- Elements firstPageURL = null;
- try {
- firstPageURL = getFirstPage(keyWord);
- } catch (FailingHttpStatusCodeException | IOException e) {
- e.printStackTrace();
- }// 定义firstPageURL作为第一个搜索页的元素集
- for (Element newlink : firstPageURL) {
- String linkHref = newlink.attr("href");// 提取包含“href”的元素成分,JSoup实现内部具体过程
- String linkText = newlink.text();// 声明变量用于保存每个链接的摘要
- if (linkHref.length() > 14 & linkText.length() > 2) {// 去除某些无效链接
- System.out.println(linkHref + "\n\t\t摘要:" + linkText);// 输出链接和摘要
- eachurl.add(linkHref);// 作为存储手段存储在arrayList里面
- // try {
- // String temp = "";
- // try {
- // transURLtoINFO.trans(linkHref, temp);
- // } catch (IOException e) {
- // // TODO Auto-generated catch block
- // e.printStackTrace();
- // }
- // } catch (FailingHttpStatusCodeException e) {
- // e.printStackTrace();
- // }
- }
- }
- /*
- * 2.读取第二页及之后页面预处理
- */
- nextHref(firstBaiduPage);// 以firstBaiduPage作为参数,定义format,即网页格式。
- /*
- * 3.获取百度第一页之后的搜索结果
- */
- for (int i = 1; i < x; i++) {
- System.out.println("\n************百度搜索“" + keyW + "”第" + (i + 1) + "页结果************");
- String tempURL = format.replaceAll("&pn=1", "&pn=" + i + "");// 根据已知格式修改生成新的一页的链接
- System.out.println("该页地址为:" + format.replaceAll("&pn=1", "&pn=" + i + ""));// 显示该搜索模板
- HtmlUnitforBD h = new HtmlUnitforBD();
- String htmls = h.getPageSource(tempURL, "utf-8");// 不知为何此处直接用JSoup的相关代码摘取网页内容会出现问题,所以采用新的编码来实现摘取网页源码
- org.jsoup.nodes.Document doc = Jsoup.parse(htmls);// 网页信息转换为jsoup可识别的doc模式
- Elements links = doc.select("a[data-click]");// 摘取该页搜索链接
- for (Element newlink : links) {// 该处同上getFirstPage的相关实现
- String linkHref = newlink.attr("href");
- String linkText = newlink.text();
- if (linkHref.length() > 14 & linkText.length() > 2) {// 删除某些无效链接,查查看可发现有些无效链接是不包含信息文本的
- System.out.println(linkHref + "\n\t\t摘要:" + linkText);
- eachurl.add(linkHref);// 作为存储手段存储在arrayList里面
- // try {
- // String temp = "";
- // try {
- // transURLtoINFO.trans(linkHref, temp);
- // } catch (IOException e) {
- // // TODO Auto-generated catch block
- // e.printStackTrace();
- // }
- // } catch (FailingHttpStatusCodeException e) {
- // e.printStackTrace();
- // }
- }
- }
- }
- System.out.println("\n\n\n输出所有地址");
- for (String xx : eachurl) {
- System.out.println(xx);
- }
- return;
- }
- });
- thread.start();
- }
- /*
- * 获取百度搜索第一页内容
- */
- public static Elements getFirstPage(String w) throws FailingHttpStatusCodeException, MalformedURLException, IOException {
- // 创建Web Client
- String word = w;
- WebClient webClient = new WebClient(BrowserVersion.CHROME);
- webClient.getOptions().setJavaScriptEnabled(false);// HtmlUnit对JavaScript的支持不好,关闭之
- webClient.getOptions().setCssEnabled(false);// HtmlUnit对CSS的支持不好,关闭之
- HtmlPage page = (HtmlPage) webClient.getPage("http://www.baidu.com/");// 百度搜索首页页面
- HtmlInput input = (HtmlInput) page.getHtmlElementById("kw");// 获取搜索输入框并提交搜索内容(查看源码获取元素名称)
- input.setValueAttribute(word);// 将搜索词模拟填进百度输入框(元素ID如上)
- HtmlInput btn = (HtmlInput) page.getHtmlElementById("su");// 获取搜索按钮并点击
- firstBaiduPage = btn.click();// 模拟搜索按钮事件
- String WebString = firstBaiduPage.asXml().toString();// 将获取到的百度搜索的第一页信息输出
- org.jsoup.nodes.Document doc = Jsoup.parse(WebString);// 转换为Jsoup识别的doc格式
- System.out.println("************百度搜索“" + word + "”第1页结果************");// 输出第一页结果
- Elements links = doc.select("a[data-click]");// 返回包含类似<a......data-click=" "......>等的元素,详查JsoupAPI
- return links;// 返回此类链接,即第一页的百度搜素链接
- }
- /*
- * 获取下一页地址
- */
- public static void nextHref(HtmlPage p) {
- // 输入:HtmlPage格式变量,第一页的网页内容;
- // 输出:format的模板
- WebClient webClient = new WebClient(BrowserVersion.CHROME);
- webClient.getOptions().setJavaScriptEnabled(false);
- webClient.getOptions().setCssEnabled(false);
- p = firstBaiduPage;
- String morelinks = p.getElementById("page").asXml();// 获取到百度第一页搜索的底端的页码的html代码
- org.jsoup.nodes.Document doc = Jsoup.parse(morelinks);// 转换为Jsoup识别的doc格式
- Elements links = doc.select("a[href]");// 提取这个html中的包含<a href=""....>的部分
- boolean getFormat = true;// 设置只取一次每页链接的模板格式
- for (Element newlink : links) {
- String linkHref = newlink.attr("href");// 将提取出来的<a>标签中的链接取出
- if (getFormat) {
- format = "http://www.baidu.com" + linkHref;// 补全模板格式
- getFormat = false;
- }
- }
- }
- public String getPageSource(String pageUrl, String encoding) {
- // 输入:url链接&编码格式
- // 输出:该网页内容
- StringBuffer sb = new StringBuffer();
- try {
- URL url = new URL(pageUrl);// 构建一URL对象
- BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), encoding));// 使用openStream得到一输入流并由此构造一个BufferedReader对象
- String line;
- while ((line = in.readLine()) != null) {
- sb.append(line);
- sb.append("\n");
- }
- in.close();
- } catch (Exception ex) {
- System.err.println(ex);
- }
- return sb.toString();
- }
- }
- package bdsearch;
- import java.io.BufferedReader;
- import java.io.ByteArrayInputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.net.ConnectException;
- import java.net.MalformedURLException;
- import java.util.ArrayList;
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- import com.gargoylesoftware.htmlunit.BrowserVersion;
- import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
- import com.gargoylesoftware.htmlunit.WebClient;
- import com.gargoylesoftware.htmlunit.html.HtmlPage;
- public class transURLtoINFO {
- /*
- * 匹配消除html元素
- */
- // 定义script的正则表达式
- private static final String regEx_script = "<script[^>]*?>[\\s\\S]*?<\\/script>";
- // 定义style的正则表达式
- private static final String regEx_style = "<style[^>]*?>[\\s\\S]*?<\\/style>";
- // 定义HTML标签的正则表达式
- private static final String regEx_html = "<[^>]+>";
- // 定义空格回车换行符
- private static final String regEx_space = "\\s*|\t|\r|\n";
- public static void main(String[] args) throws FailingHttpStatusCodeException, MalformedURLException, IOException {
- String temp = null;
- trans("http://www.baidu.com/", temp);
- System.out.println("over");
- }
- public static String trans(String url, String info) throws FailingHttpStatusCodeException, MalformedURLException, IOException {
- ArrayList<String> hrefList = new ArrayList<String>();
- WebClient webClient = new WebClient(BrowserVersion.CHROME);
- webClient.getOptions().setJavaScriptEnabled(false);
- webClient.getOptions().setCssEnabled(false);
- try {
- HtmlPage page = null;
- try {
- page = (HtmlPage) webClient.getPage(url);
- } catch (ConnectException e) {
- }
- InputStream temp = new ByteArrayInputStream(page.asText().getBytes());
- InputStreamReader isr = new InputStreamReader(temp);
- BufferedReader br = new BufferedReader(isr);
- String str = null, rs = null;
- while ((str = br.readLine()) != null) {
- rs = str;
- if (rs != null)
- hrefList.add(rs);
- }
- System.out.println("从该网址" + url + "查找的可能相关文本如下:");
- for (int i = 0; i < hrefList.size(); i++) {
- String string = hrefList.get(i);
- string = getTextFromHtml(string);
- if (string.length() >= 50) {
- info += "\n" + string;
- System.out.println(string);
- }
- }
- } catch (IOException e) {
- }
- return info;
- }
- /*
- * 从一行开始清除标签
- *
- * @return
- */
- public static String delHTMLTag(String htmlStr) {
- Pattern p_space = Pattern.compile(regEx_space, Pattern.CASE_INSENSITIVE);
- Matcher m_space = p_space.matcher(htmlStr);
- htmlStr = m_space.replaceAll(""); // 过滤空格回车标签
- Pattern p_script = Pattern.compile(regEx_script, Pattern.CASE_INSENSITIVE);
- Matcher m_script = p_script.matcher(htmlStr);
- htmlStr = m_script.replaceAll(""); // 过滤script标签
- Pattern p_style = Pattern.compile(regEx_style, Pattern.CASE_INSENSITIVE);
- Matcher m_style = p_style.matcher(htmlStr);
- htmlStr = m_style.replaceAll(""); // 过滤style标签
- Pattern p_html = Pattern.compile(regEx_html, Pattern.CASE_INSENSITIVE);
- Matcher m_html = p_html.matcher(htmlStr);
- htmlStr = m_html.replaceAll(""); // 过滤html标签
- return htmlStr.trim(); // 返回文本字符串
- }
- public static String getTextFromHtml(String htmlStr) {
- htmlStr = delHTMLTag(htmlStr);
- htmlStr = htmlStr.replaceAll(" ", "");
- return htmlStr;
- }
- }
运行结果:
采集baidu搜索信息的java源代码实现(大部分转发,少量自己修改)(使用了htmlunit和Jsoup)(转发:https://blog.csdn.net/zhaohang_1/article/details/44731039)的更多相关文章
- Java类和对象 详解(一)---写的很好通俗易懂---https://blog.csdn.net/wei_zhi/article/details/52745268
https://blog.csdn.net/wei_zhi/article/details/52745268
- 转-java编译时error: illegal character '\ufeff' 的解决办法-https://blog.csdn.net/t518vs20s/article/details/80833061
原文链接:https://blog.csdn.net/shixing_11/article/details/6976900 最近开发人员通过SVN提交了xxx.java文件,因发布时该包有问题需要回退 ...
- java之比较两个日期大小----https://blog.csdn.net/dongfangbaiyun/article/details/51225469
https://blog.csdn.net/dongfangbaiyun/article/details/51225469 java之比较两个日期大小 最近又用到两个日期大小的比较,因此记录在此,方便 ...
- java 生成20位唯一ID,生成不会重复的20位数字----https://blog.csdn.net/weixin_36751895/article/details/70331781
java 生成20位唯一ID,生成不会重复的20位数字----https://blog.csdn.net/weixin_36751895/article/details/70331781
- java定时器的使用(Timer)(转发:https://blog.csdn.net/ecjtuxuan/article/details/2093757)
1.在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等. 对于这样的操作最方便.高效的实现方式就是使用java.util.Timer工具类. private java.util.Tim ...
- jeecms 强大的采集功能优化 转载 https://blog.csdn.net/jeff06143132/article/details/7099003
========================================================= 没办法附件上传不了,AcquisitionSvcImpl.java类: //---- ...
- 极大极小搜索思想+(α/β)减枝 【转自-----https://blog.csdn.net/hzk_cpp/article/details/79275772】
极大极小搜索,即minimax搜索算法,专门用来做博弈论的问题的暴力. 多被称为对抗搜索算法. 这个搜索算法的基本思想就是分两层,一层是先手,记为a,还有一层是后手,记为b. 这个搜索是认为这a与b的 ...
- 转:Java面试题集(51-70) http://blog.csdn.net/jackfrued/article/details/17403101
Java面试题集(51-70) Java程序员面试题集(51-70) http://blog.csdn.net/jackfrued/article/details/17403101 摘要:这一部分主要 ...
- maven 依赖文件 pom.xml 编译 mvn compile 运行 不用mvn exec:java -Dexec.mainClass="hello.HelloWorld" 打成jar包 mvn package mvn install http://blog.csdn.net/yaya1943/article/details/48464371
使用maven编译Java项目 http://blog.csdn.net/yaya1943/article/details/48464371 使用"mvn clean"命令清除编 ...
随机推荐
- Java 调用 C/C++ 之 JNA 系列实战篇 —— 输出char * (六)
一. 工作环境 1. windows (64位), JDK (64位),dll文件 (64位) 2. Linux (64位), JDK (64位),so文件 (64位) 3. JNA的官方资 ...
- js 正则表达式 验证小数点后几位
function IsFloatByBit (value, state, bit) { if (state == false) { var re ...
- Effective C++:条款39:明智而审慎地使用private继承
(一) (1)private继承意味着"依据某物实现出".仅仅有实现部分被继承.接口部分应略去: (2)它仅仅在软件"实现"层面上有意义,在软件"设计 ...
- Flex远程访问获取数据--HTTPService
编写service类: package services { import com.adobe.serialization.json.JSON; import log.LogUtil; import ...
- kettle的job中使用循环
job中使用循环 在一个不稳定的网络环境下作文件传输.偶尔会有超时或连接重置.这时须要稍等片刻再重试.在重试10次之后放弃并结束该job.类似使用循环解决这类问题. 该演示样例job演示了这样 ...
- 大数据(2) - Hadoop完全分布式的部署
apache hadoop 官方文档 ** Hadoop介绍 ** HDFS:分布式存储文件 角色:NameNode和DataNode ** YARN:分布式资源调度框架(Hadoop2.x以上才引用 ...
- ThinkPHP 模板 Volist 标签嵌套循环输出多维数组
ThinkPHP 中对 volist 标签嵌套使用可实现多维数组的输出. volist 嵌套使用 一般的二维数组,可以用 volist 标签直接循环输出.对于多维数组,则需要对其中的数组成员再次使用 ...
- Spring中HttpInvoker远程方法调用总结
Spring为各种远程訪问技术的集成提供了工具类.Spring远程支持是由普通(Spring)POJO实现的,这使得开发具有远程訪问功能的服务变得相当easy. 眼下,Spring支持四种远程技术: ...
- js indexof用法indexOf()定义和用法
indexOf()定义和用法 indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置. 语法 stringObject.indexOf(searchvalue,fromindex) ...
- python数据表的合并(python pandas join() 、merge()和concat()的用法)
merage# pandas提供了一个类似于关系数据库的连接(join)操作的方法<Strong>merage</Strong>,可以根据一个或多个键将不同DataFrame中 ...