HtmlUnit 开发网络爬虫
网络爬虫第一个要面临的问题,就是如何抓取网页,抓取其实很容易,没你想的那么复杂,一个开源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 开发网络爬虫的更多相关文章
- 零基础自学用Python 3开发网络爬虫
原文出处: Jecvay Notes (@Jecvay) 由于本学期好多神都选了Cisco网络课, 而我这等弱渣没选, 去蹭了一节发现讲的内容虽然我不懂但是还是无爱. 我想既然都本科就出来工作还是按照 ...
- Python开发网络爬虫抓取某同城房价信息
前言: 苦逼的我从某某城市换到另一个稍微大点的某某城市,面临的第一个问题就是买房,奋斗10多年,又回到起点,废话就不多说了,看看如何设计程序把某同城上的房价数据抓取过来. 方案:方案思路很简单,先把网 ...
- Python 3网络爬虫开发实战》中文PDF+源代码+书籍软件包
Python 3网络爬虫开发实战>中文PDF+源代码+书籍软件包 下载:正在上传请稍后... 本书书籍软件包为本人原创,在这个时间就是金钱的时代,有些软件下起来是很麻烦的,真的可以为你们节省很多 ...
- Python 3网络爬虫开发实战中文 书籍软件包(原创)
Python 3网络爬虫开发实战中文 书籍软件包(原创) 本书书籍软件包为本人原创,想学爬虫的朋友你们的福利来了.软件包包含了该书籍所需的所有软件. 因为软件导致这个文件比较大,所以百度网盘没有加速的 ...
- Python 3网络爬虫开发实战中文PDF+源代码+书籍软件包(免费赠送)+崔庆才
Python 3网络爬虫开发实战中文PDF+源代码+书籍软件包+崔庆才 下载: 链接:https://pan.baidu.com/s/1H-VrvrT7wE9-CW2Dy2p0qA 提取码:35go ...
- 《Python 3网络爬虫开发实战中文》超清PDF+源代码+书籍软件包
<Python 3网络爬虫开发实战中文>PDF+源代码+书籍软件包 下载: 链接:https://pan.baidu.com/s/18yqCr7i9x_vTazuMPzL23Q 提取码:i ...
- Python 3网络爬虫开发实战书籍
Python 3网络爬虫开发实战书籍,教你学会如何用Python 3开发爬虫 本书介绍了如何利用Python 3开发网络爬虫,书中首先介绍了环境配置和基础知识,然后讨论了urllib.reques ...
- Python3网络爬虫开发实战PDF高清完整版免费下载|百度云盘
百度云盘:Python3网络爬虫开发实战高清完整版免费下载 提取码:d03u 内容简介 本书介绍了如何利用Python 3开发网络爬虫,书中首先介绍了环境配置和基础知识,然后讨论了urllib.req ...
- Python网络爬虫与信息提取笔记
直接复制粘贴笔记发现有问题 文档下载地址//download.csdn.net/download/hide_on_rush/12266493 掌握定向网络数据爬取和网页解析的基本能力常用的 Pytho ...
随机推荐
- Android-自定义RadioButton
1.控件RadioButton需要用RadioGroup包裹起来,才能使用2.RadioButton必须设置ID才能实现单选功能3.RadioGroup有方向(垂直方向 和 水平方向)默认是垂直方向 ...
- await Task传异步Lambda问题
微软在.NET4.5中升级了C#语言到5.0,加入了await和async语法,极大地方便了广大开发人员的异步编程,也是为了和WinRT API配套,因为这套API充满了异步编程. 在开发过程中发现有 ...
- Oracle数据表转换为Shapefile(一)
严格来说,文章标题中的“转换”并不完全合适.本文的主要内容是基于Oracle数据表的数据来生产出Shapefile文件.进行该工作的一个前提条件是:Oracle数据表中包含坐标数值字段,一般来说就是x ...
- [Asp.net Mvc]为js,css静态文件添加版本号
方式一: 思路 string version = ViewBag.Version; @Scripts.RenderFormat("<script type=\"text/ja ...
- Filter 设计模式编码实践
原文地址: haifeiWu和他朋友们的博客 博客地址:www.hchstudio.cn 欢迎转载,转载请注明作者及出处,谢谢! 最近项目中遇到各种输出数据监控,数据校验等逻辑,一个个实现很是麻烦.项 ...
- MVC ASP.NET MVC5使用Area区域
MVC ASP.NET MVC5使用Area区域 一.为什么要使用area? 在大型的ASP.NET mvc5项目中一般都有许多个功能模块,这些功能模块可以用Area(中文翻译为区域)把它们分离开来 ...
- jquery函数封装
<script type="text/javascript"> $(function () { $("#tabMenu a").on('click' ...
- [Objective-C语言教程]基本语法(4)
前面已经看到了Objective-C程序的基本结构,因此很容易理解Objective-C编程语言的其他基本构建块. Objective-C令牌 Objective-C程序由各种令牌组成,令牌可以是关键 ...
- [转] 翻译130+VIM基本命令
基础 :e filename 在编辑器中打开一个文件 :w 保存文件 :q 退出vim :q! 退出但不保存 :x 写文件(如果有做修改)并退出 :sav filename 保存为 . 在正常模式中重 ...
- python 绘制抛物线
%matplotlib inlineimport matplotlib.pyplot as plt import numpy as npx = range(100) y = [val**2 for v ...