package baidusearch;

import com.sun.glass.ui.SystemClipboard;
import java.util.*;
import java.util.HashMap;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern; /**
* 首先客户端口先获取大量的百度的关键词 然后比对关键词信息
*
* @author timeless <834916321@qq.com>
*/
public class getLink { /**
* 获取 title 标签 遍历的时候直接使用就好了
*
* 如果 带着 www 不能访问 就执行 不带者www的
*
* @author timeless<834916321@qq.com>
* @param domain http://www.域名
* @return String title 没获取到则返回空
*/
public static List<String> getLinkArr(String url) {
try {
String charset = "UTF8";
String htmlsource = getHtmlSource(url, charset);
//现在有个问题是 百度的 带参数的练级不可以
List<String> baiduLinkList = getBaiduLink(htmlsource);
//这个地方可以获取重定向之后的
return baiduLinkList;
} catch (IllegalArgumentException ex) {
System.out.println("不合法的参数:" + ex.toString());
return new ArrayList<String>();
}
} /**
* 根据网址返回网页的源码 getHtmlSource
*
* @param htmlUrl 网站url
* @param charset 网站的编码已经获取的网站编码 防止出现乱码
* @return 网站的源代码 这样效率有点底 下个版本要改为 之获取前边的几行就好F
*/
public static String getHtmlSource(String htmlUrl, String charset) {
URL url;
StringBuffer sb = new StringBuffer();
try {
url = new URL(htmlUrl);
URLConnection myurlcon = url.openConnection();
myurlcon.setConnectTimeout(5000);
myurlcon.setReadTimeout(5000);
BufferedReader in = null;
if (!charset.equals("")) {
in = new BufferedReader(new InputStreamReader(myurlcon.getInputStream(), charset));//读取网页全部内容
} else {
in = new BufferedReader(new InputStreamReader(myurlcon.getInputStream()));//读取网页全部内容
}
// 现在有个问题 编码 怎么动态获取编码
String temp;
while ((temp = in.readLine()) != null) {
sb.append(temp);
// System.out.println(temp);
}
in.close();
} catch (ConnectException ex) {
System.out.println("链接异常:" + ex.toString());
} catch (UnknownHostException e) {
System.out.println("未知主机错误:" + e.toString());
} catch (SocketTimeoutException ex) {
System.out.println("读取超时:" + ex.toString());
} catch (MalformedURLException ex) {
System.out.println("你输入的URL格式有问题!请仔细输入:" + ex.toString());
} catch (IOException e) {
System.out.println("io 问题:" + e.toString());
} catch (IllegalArgumentException ex) {
System.out.println("不合法的参数:" + ex.toString());
}
return sb.toString();
} /**
* 获取百度的链接
*/
public static List<String> getBaiduLink(String htmlSource) {
List<String> list = new ArrayList<String>();
try {
//懒惰模式匹配 现在还是有问题的
// String mat = "[\\.|>](([0-9a-z-]+?)\\.(com|cn|cc|net|org|gov|edu|biz|info|tv|pro|name|coop|cc|club|site|xyz|int|ren|co|hk|me|mobi|(net\\.cn)|(gov\\.cn)|(org\\.cn)|(com\\.cn)|(cn\\.com)))[/|<]";
//修正不获取获取域名时候已-开头的
String mat = "[\\.|>](([0-9a-zA-Z]([0-9a-z-])+?)\\.(com|cn|cc|net|org|gov|edu|biz|info|tv|pro|name|coop|cc|club|site|xyz|int|ren|co|hk|me|mobi|(net\\.cn)|(gov\\.cn)|(org\\.cn)|(com\\.cn)|(cn\\.com)))[/|<]";
Pattern pattern = Pattern.compile(mat);
Matcher ma = pattern.matcher(htmlSource);
String link = "";
while (ma.find()) {
link = ma.group(1).toString();
//这个应该改成数组或者link的形式 然后判断是不是已经包含了
if (!link.equals("baidu.com") && !link.equals("bdstatic.com") && !link.equals("baiducontent.com") && !link.equals("taobao.com") && !link.equals("nuomi.com") && !link.equals("alibaba.com")&& !link.equals("qq.com")) {
if (!list.contains(link)) {
list.add(link);
System.out.println(ma.group(0));
}
}
}
} catch (Exception ex) {
System.out.println("执正则表达式获取域名出错" + ex.toString());
}
return list;
}
/**
* 获取重定向之后的链接
*/
private static String getRedirectUrl(String path) throws Exception {
HttpURLConnection conn = (HttpURLConnection) new URL(path).openConnection();
conn.setInstanceFollowRedirects(false);
conn.setConnectTimeout(5000);
return conn.getHeaderField("Location");
} public static void main(String[] args) {// 百度 文件搜索 一般的话最多就 76页 pn 到 750
List<String> list = new ArrayList<String>();
for (int i = 1; i <= 76; i++) {
//第一页不显示pn 选项第二页开始pn=1;
String key = "企业邮箱登录入口";
int pn = i * 10 - 10;
String baiduUrl = "http://www.baidu.com/s?wd=%s&pn=%d&ie=utf-8";
baiduUrl = String.format(baiduUrl, key, pn);
System.out.println(baiduUrl);
List<String> perpageList = getLinkArr(baiduUrl);
for (Iterator<String> iterator = perpageList.iterator(); iterator.hasNext();) {
String next = iterator.next();
if (!list.contains(next)) {//排重
list.add(next);
System.out.println(next);
}
}
System.out.println(list.size());
}
}
}

java 抓取百度根据关键词搜索域名的更多相关文章

  1. selenium-java web自动化测试工具抓取百度搜索结果实例

    selenium-java web自动化测试工具抓取百度搜索结果实例 这种方式抓百度的搜索关键字结果非常容易抓长尾关键词,根据热门关键词去抓更多内容可以用抓google,百度的这种内容容易给屏蔽,用这 ...

  2. PHP网络爬虫实践:抓取百度搜索结果,并分析数据结构

    百度的搜索引擎有反爬虫机制,我先直接用guzzle试试水.代码如下: <?php /** * Created by Benjiemin * Date: 2020/3/5 * Time: 14:5 ...

  3. java爬取百度首页源代码

    爬虫感觉挺有意思的,写一个最简单的抓取百度首页html代码的程序.虽然简单了一点,后期会加深的. package test; import java.io.BufferedReader; import ...

  4. java 抓取网页图片

    import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.Out ...

  5. Python抓取百度百科数据

    前言 本文整理自慕课网<Python开发简单爬虫>,将会记录爬取百度百科"python"词条相关页面的整个过程. 抓取策略 确定目标:确定抓取哪个网站的哪些页面的哪部分 ...

  6. python3 - 通过BeautifulSoup 4抓取百度百科人物相关链接

    导入需要的模块 需要安装BeautifulSoup from urllib.request import urlopen, HTTPError, URLError from bs4 import Be ...

  7. Python——爬取百度百科关键词1000个相关网页

    Python简单爬虫——爬取百度百科关键词1000个相关网页——标题和简介 网站爬虫由浅入深:慢慢来 分析: 链接的URL分析: 数据格式: 爬虫基本架构模型: 本爬虫架构: 源代码: # codin ...

  8. C#.Net使用正则表达式抓取百度百家文章列表

    工作之余,学习了一下正则表达式,鉴于实践是检验真理的唯一标准,于是便写了一个利用正则表达式抓取百度百家文章的例子,具体过程请看下面源码: 一:获取百度百家网页内容 public List<str ...

  9. 用PHP抓取百度贴吧邮箱数据

    注:本程序可能非常适合那些做百度贴吧营销的朋友. 去逛百度贴吧的时候,经常会看到楼主分享一些资源,要求留下邮箱,楼主才给发. 对于一个热门的帖子,留下的邮箱数量是非常多的,楼主需要一个一个的去复制那些 ...

随机推荐

  1. hdoj 1201 18岁生日

    18岁生日 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  2. C语言、Java的编译系统

    Java是跨平台的. Java代码的编译是由Java语言的编译器来执行的,执行后生成的是.class文件,该文件是字节码文件. 然后交给虚拟机进行运行,虚拟机是在各个平台上可移植的.从而决定了Java ...

  3. IIS- ASP站点布署时查看ASP错误信息

    ASP使用的脚本是VBSCRIPT,布置的时候想显示他的错误信息,可以在INTERNET选项里把显示友好http错误信息的勾去掉 就能查看ASP布署时查看错误信息的勾去掉.

  4. DevExpress 用户控件 分页(上)

    说明:使用用户控件分页,完成后,使用时非常简单,数据绑定,调用自己写的一个事件就OK了 前期准备工作: (1)添加一个用户控件 命名PageCtrl (2)打开代码:   [csharp] view ...

  5. 在C#中用Linq从属性文件中读取键值对Key-Value Pair

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:在C#中用Linq从属性文件中读取键值对Key-Value Pair.

  6. 【设计模式 - 24】之访问者模式(Visitor)

    1      模式简介 访问者模式的定义: 访问者模式将数据结构与数据操作进行了分离,解决了稳定的数据结构和易变的数据操作的耦合问题. 访问者模式的优点: 1)        符合单一职责原则: 2) ...

  7. spring applicationContext.xml 文件

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  8. 初识jQuery,八字真言“选择元素,对其操作”

    jQuery在我印象中,就是很多类似$(),然后昨天开始接触了,觉得很和谐,获取元素比JavaScript简单很多,有意思. 一.开始学习jQuery,下载jQuery库的文件 http://jque ...

  9. 基于VMware为CentOS 6.5配置两个网卡

    为CentOS 6.5配置两块网卡,一块是eth0,一块是eth1,下面以master为例 1.选择“master”-->“编辑虚拟机设置”,如下所示 2.单击“添加”,如下 3.选择“网络适配 ...

  10. 鸟哥的Linux私房菜学习笔记(1)

    2014/10/29 1.档案的权限管理分为三个部分: 拥有者.群组.其他 2.ls -al 命令可以看到档案的详细信息 3.档案的属性中由十个部分构成 第一个部分是档案类型 -代表档案.d代表文件夹 ...