网络爬虫第一个要面临的问题,就是如何抓取网页,抓取其实很容易,没你想的那么复杂,一个开源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. Android-ContentProvider理解操作系统的多媒体

    在多年以前,我做一款音乐播放器,要把很多.mp3文件,放置在自己新建的文件夹里面,然后去读取这个新建的文件夹里面的音乐列表,现在想想是多么的无知: 因为只要往手机里面放入.mp3文件,系统会自动检测, ...

  2. [LeetCode 题解]: Maximum Depth of Binary Tree

    Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the long ...

  3. jquery实现简单抽奖功能

    一直纠结要怎么用jquery实现抽奖功能,看别人很多都是用flash制作的,找了很多资料,最终找到一个比较适合需求的,我做了些许调整,以下是代码展示(复制下来可以直接使用). 先上图:

  4. jenkins+checkstyle

    一.新增一个自由风格的项目 建好之后如下图所示 二.修改pom.xml文件 在项目根目录下添加如下代码(此处添加的3个插件) <build> <plugins> <plu ...

  5. win7 64 VC++ ado方式连接access 连接字符串

    运行环境:win7 64       vc++6.0       office 2007  32位(access 2007) 我用的是ado方式连接access数据库,(现在的Win7系统中安装的一般 ...

  6. asp.net 汉字转拼音类

    前段时间公司人员反应OA里的汉字拼音首字母不准他们又要用,没办法自己就从网上搜有没有好的,看了很多都是首字母拼不出来或有些字母变为另一个,但最后找了很多还是有一个好用的,暂未发现有不准的. using ...

  7. Mvc 项目中使用Bootstrap以及基于bootstrap的 Bootgrid

    官方地址参考http://www.jquery-bootgrid.com/Examples Bootgrid 是一款基于BootStrap 开发的带有查询,分页功能的列表显示组件.可以在像MVC中开发 ...

  8. hdu 1542/1255 Atlantis/覆盖的面积

    1542 1255 两道扫描线+线段树的入门题. 基本没有什么区别,前者是模板,后者因为是求覆盖次数至少在两次以上的,这个同样是具有并集性质的,所以把cover的判断条件更改一下就可以了qwq. hd ...

  9. 二十三、MongoDb 数据库介绍、安装、启动和连接(非关系型数据库)

    1.数据库和文件的主要区别 1. 数据库有数据库表.行和列的概念,让我们存储操作数据更方便2. 数据库提供了非常方便的接口,可以让 nodejs.php java .net 很方便的实现增加修改删除功 ...

  10. 非固定参数:*args和 **kwargs

    先看一个固定参数栗子: def func1(x, args): print(x, args) func1(1,22) ====================1 22 ================ ...