网络爬虫第一个要面临的问题,就是如何抓取网页,抓取其实很容易,没你想的那么复杂,一个开源HtmlUnit包,几行代码就OK啦!

通常在一个页面中会包含别的Url,在别的Url当中又会包含更多的Url。如果我们要对与该站点相关的Url全部都抓取过来。就相当于我们要对跟这个站有关的Url进行搜索。

常用的搜索算法有bfs和dfs,考虑到网页上的Url的重要程度还是以广度来分布的,所以这里采用bfs来搜索url。

到这里又会产生一些问题:

1,搜索过的url,并不需要重新访问
2,如何拼凑新的url
3,不要访问站外url,处理无法访问的url等.....

总之我们尽可能的根据实际的情况得到自己想要的url~所以我们尽可能编写合法的剪枝算法。

下面添上自己胡乱写的算法的框架,写的不好哈哈。

import java.io.IOException;
import java.net.MalformedURLException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
import java.util.Set; import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
import com.gargoylesoftware.htmlunit.html.HtmlPage; //引用HtmlUnit
public class MyWalker { static int num = 0;//暂时用num进行限制 final static WebClient webClient = new WebClient();
static Queue<String> Q = new LinkedList<String>();//存放被抓取的Url
static Set<String> linkUrl = new HashSet<String>();
static Map<String,Boolean> flagMap = new HashMap<String,Boolean>();//标记Url是否访问过 static{
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setJavaScriptEnabled(false);
} private static String baseUrl = "http://xjasc.gov.cn"; //拼凑出可再次访问的url, 这里的拼凑是不完整的
private static String createUrl(String current, String u){
     return current + "/" + u;
} //判断该链接是否合法
private static boolean isLegal(String url){
if(num > 100) return false;
return true;
} //页面是否坏掉
private static boolean isBadUrl(String url){
return false;
} private static void bfs(){
Q.offer(baseUrl);
linkUrl.add(baseUrl);
     while(!Q.isEmpty()){
//得到当前的Url
try {
String tmpUrl = Q.poll();
if(flagMap.get(tmpUrl)==null){//该结点没有访问过
flagMap.put(tmpUrl, true);//标记为已经访问
HtmlPage page = webClient.getPage(tmpUrl);
java.util.List<HtmlAnchor> achList=page.getAnchors();
for(HtmlAnchor ach:achList){
String newUrl = createUrl(tmpUrl, ach.getHrefAttribute());
if(isLegal(newUrl)){
System.out.println(newUrl);
num++;
linkUrl.add(newUrl);
Q.offer(newUrl);
}
}
}
} catch (FailingHttpStatusCodeException e) {
System.out.println(e.getStatusCode());
} catch (MalformedURLException e) {
} catch (IOException e) {
} } } public static void main(String[] args) {
bfs();
} }

HtmlUnit 开发网络爬虫的更多相关文章

  1. 零基础自学用Python 3开发网络爬虫

    原文出处: Jecvay Notes (@Jecvay) 由于本学期好多神都选了Cisco网络课, 而我这等弱渣没选, 去蹭了一节发现讲的内容虽然我不懂但是还是无爱. 我想既然都本科就出来工作还是按照 ...

  2. Python开发网络爬虫抓取某同城房价信息

    前言: 苦逼的我从某某城市换到另一个稍微大点的某某城市,面临的第一个问题就是买房,奋斗10多年,又回到起点,废话就不多说了,看看如何设计程序把某同城上的房价数据抓取过来. 方案:方案思路很简单,先把网 ...

  3. Python 3网络爬虫开发实战》中文PDF+源代码+书籍软件包

    Python 3网络爬虫开发实战>中文PDF+源代码+书籍软件包 下载:正在上传请稍后... 本书书籍软件包为本人原创,在这个时间就是金钱的时代,有些软件下起来是很麻烦的,真的可以为你们节省很多 ...

  4. Python 3网络爬虫开发实战中文 书籍软件包(原创)

    Python 3网络爬虫开发实战中文 书籍软件包(原创) 本书书籍软件包为本人原创,想学爬虫的朋友你们的福利来了.软件包包含了该书籍所需的所有软件. 因为软件导致这个文件比较大,所以百度网盘没有加速的 ...

  5. Python 3网络爬虫开发实战中文PDF+源代码+书籍软件包(免费赠送)+崔庆才

    Python 3网络爬虫开发实战中文PDF+源代码+书籍软件包+崔庆才 下载: 链接:https://pan.baidu.com/s/1H-VrvrT7wE9-CW2Dy2p0qA 提取码:35go ...

  6. 《Python 3网络爬虫开发实战中文》超清PDF+源代码+书籍软件包

    <Python 3网络爬虫开发实战中文>PDF+源代码+书籍软件包 下载: 链接:https://pan.baidu.com/s/18yqCr7i9x_vTazuMPzL23Q 提取码:i ...

  7. Python 3网络爬虫开发实战书籍

    Python 3网络爬虫开发实战书籍,教你学会如何用Python 3开发爬虫   本书介绍了如何利用Python 3开发网络爬虫,书中首先介绍了环境配置和基础知识,然后讨论了urllib.reques ...

  8. Python3网络爬虫开发实战PDF高清完整版免费下载|百度云盘

    百度云盘:Python3网络爬虫开发实战高清完整版免费下载 提取码:d03u 内容简介 本书介绍了如何利用Python 3开发网络爬虫,书中首先介绍了环境配置和基础知识,然后讨论了urllib.req ...

  9. Python网络爬虫与信息提取笔记

    直接复制粘贴笔记发现有问题 文档下载地址//download.csdn.net/download/hide_on_rush/12266493 掌握定向网络数据爬取和网页解析的基本能力常用的 Pytho ...

随机推荐

  1. python中用ElementTree.iterparse()读取xml文件中的多层节点

    我在使用Python解析比较大型的xml文件时,为了提高效率,决定使用iterparse()方法,但是发现根据网上的例子:每次if event == 'end':之后elem.clear()或者是每次 ...

  2. 优化案例--改写IN条件为INNER JOIN

    --====================================== --原始语句 SET STATISTICS IO ON SELECT COUNT(DISTINCT parent_co ...

  3. Transaction And Lock--常用的查询事务和锁的语句

    --===================================================== --查看当前运行事务 SET TRANSACTION ISOLATION LEVEL R ...

  4. Replication--无法将事务提升为分布式事务,因为在事务中有活动的保存点

    场景描述在SQL SERVER 2012上创建事务发布,发布库已搭建为可AWAYSON,分发服务器和发布服务器分离,创建发布时提示“无法将事务提升为分布式事务,因为在事务中有活动的保存点” 解决方法E ...

  5. unity面试准备

    最近有换工作的打算 所以上网看下面试题 自己做下总结 Q:ArrayList 和 List区别 A: 1:List大家都知道初始化的时候需要定义其类型,例如 List<int> listT ...

  6. “全栈2019”Java第三十四章:可变参数列表

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  7. luoguP3702 [SDOI2017]序列计数

    https://www.luogu.org/problemnew/show/P3702 题目让我们在 $ [1, m] $ 从中选出 $ n $ 个数,当中要有 > $ 0 $ 个质数,和是 $ ...

  8. ArchLinux中证书错误解决方案

    ca-certificates 更新 x509: failed to load system roots and no roots provided. curl error: Problem with ...

  9. Arch下error: signature from "NAME<EMAIL ADD>"

    pacman的unknown trust问题错误消息类似于:error: signature from "NAME<EMAIL ADD>" is unknown tru ...

  10. ArchLinux 下 OpenSSH 高级运用

    00x0.相关介绍 OpenSSH(OpenBSD Secure Shell)使用 SSH 通过计算机网络加密通信的实现. 它是替换由 SSH Communications Security 所提供的 ...