爬虫1号

这是我实现的第一个版本的爬虫,局限比较大,用的算法思想也比较简单。不过通过爬虫1号,我对爬虫和搜索引擎实现机制有了更多的认识,收获还是挺大的^_^,涂鸦之作,我不知道别人如何实现的,就按自己的想法写了个,大家有兴趣可以看看,用java实现的

这是工程目录:

下面是具体代码:

package com.rgy.reptile;

import com.rgy.utils.PageUtils;

public class Entry {

	public static void main(String args[]){
		String url = "http://www.youku.com";
		PageUtils.history_list.add(url);
		PageUtils.parent_stack.push(url);
		PageUtils.searchUrl(url);
		//PageUtils.hrefShow(url);
	}
}
package com.rgy.entity;

import java.util.ArrayList;

public class PageInfo {

	private String url;
	private String title;
	private String keywords;
	private ArrayList<String> href_list;

	public PageInfo(){
		this.url="";
		this.title="";
		this.keywords="";
		this.href_list=null;
	}

	public void setUrl(String url){
		this.url = url;
	}

	public void setTitle(String title){
		this.title = title;
	}

	public void setKeywords(String keywords){
		this.keywords = keywords;
	}

	public void setHref_list(ArrayList<String> href_list){
		this.href_list = href_list;
	}

	public String getUrl(){
		return url;
	}

	public String getTitle(){
		return title;
	}

	public String getKeywords(){
		return keywords;
	}

	public ArrayList<String> getHref_list(){
		return href_list;
	}

}

package com.rgy.utils;

import java.util.ArrayList;
import java.util.Stack;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import com.rgy.entity.PageInfo;

public class PageUtils {

	public static PageInfo getPageInfo(String url){

		PageInfo info = new PageInfo();
		if(url.endsWith("/")){
			url = url.substring(0, url.length()-1);
		}
		info.setUrl(url);
		try{
			Document doc = Jsoup.connect(url).timeout(30000).get();
			String title = doc.title().toString();
			info.setTitle(title);
			String keywords = doc.getElementsByTag("meta").select("[name=keywords]").attr("content");
			info.setKeywords(keywords);
			Elements links = doc.getElementsByTag("a");
			ArrayList<String> href_list = new ArrayList<String>();
			for (Element link : links) {
				String linkHref = link.attr("href");
				if(linkHref.endsWith("/")){
					linkHref = linkHref.substring(0, linkHref.length()-1);
				}
				//如果数组中不存在这个链接
				if(linkIsAvailable(linkHref)&&!href_list.contains(linkHref)){
					href_list.add(linkHref);
					info.setHref_list(href_list);
				}
			}
		}catch(Exception ex){
			ex.printStackTrace();
		}

		return info;
	}

	public static boolean linkIsAvailable(String url){
		if(url.startsWith("http://")){
			String regex = ".*.exe|.*.apk|.*.zip|.*.rar|.*.pdf|.*.doc";
			Pattern pattern = Pattern.compile(regex);
	        Matcher matcher = pattern.matcher(url);
			return !matcher.matches();
		}
		return false;
	}

	public static boolean keywordsIsAvailable(String keywords){
		String regex = ".*青春.*|.*搞笑.*|.*微电影.*|.*短片.*|.*迷你剧.*|.*喜剧.*";
		Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(keywords);
        return matcher.matches();
	}

	//存放已经访问过的url
	public static ArrayList<String> history_list = new ArrayList<String>();
	//记录一路走来的父结点
	public static Stack<String> parent_stack = new Stack<String>();

	public static void searchUrl(String url){
		PageInfo info = getPageInfo(url);
		String keywords = info.getKeywords();
		int hlist_size = history_list.size();
		System.out.println(hlist_size+"-->"+history_list.get(hlist_size-1));

//		if(keywordsIsAvailable(keywords)){//如果匹配上了,
//			System.out.println(url+"===>"+keywords);
//		}

		ArrayList<String> href_list = info.getHref_list();
		if(href_list==null){//该结点不可用,回到父亲结点继续走0
			parent_stack.pop();
			if(!parent_stack.empty()){//不为空栈
				searchUrl(parent_stack.peek());
			}else{//空栈
				System.out.println("Yir,爬虫1号已完成任务!!!");
			}
		}else{//结点可用
			int size = href_list.size();
			for(int i=0;i<size;i++){
				String strUrl = href_list.get(i);
				if(history_list.contains(strUrl)){//如果当前链接已经被访问过了
					continue;
				}
				history_list.add(strUrl);
				parent_stack.push(strUrl);
				searchUrl(strUrl);
			}
		}
	}

	public static void hrefShow(String url){
		PageInfo info = getPageInfo(url);
		ArrayList<String> href_list = info.getHref_list();
		int size = href_list.size();
		for(int i=0;i<size;i++){
			System.out.println(href_list.get(i));
		}
	}

}

有兴趣的童鞋可以到这里下载工程代码:

http://download.csdn.net/detail/u011700203/8410597

时间: 2024-10-07 15:31:43

爬虫1号的相关文章

微信新闻爬虫订阅号设计

github地址:https://github.com/moyangvip/newsWeChat 1.功能: 实现网站新闻定时爬取,并在订阅号端呈现. 后台通过scrapy定期抓取网站信息信息,并通过BosonNLP取摘要,最终整理信息存入DB.微信服务程序从DB中读取新闻信息, 并通过 memcached 缓存用户状态. 实际使用: 进入订阅号后 1.请输入"新闻"获取所有站点的最新新闻列表: 2.请输入具体网站名(如"猎云网")获取该站点最新新闻列表: 3.输入

python爬虫公众号所有信息,并批量下载公众号视频

前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 数据分析实战 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 http://note.youdao.com/noteshare?id=3054cce4add8a909e784ad934f956cef 主要功能 如何简单爬虫微信公众号 获取信息:标题.摘要.封面.文章地址 自动批量下载公众号内的视频 一.获取公众号信息:标题.摘要.封面.文章U

Python网络爬虫

http://blog.csdn.net/pi9nc/article/details/9734437 一.网络爬虫的定义 网络爬虫,即Web Spider,是一个很形象的名字. 把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛.网络蜘蛛是通过网页的链接地址来寻找网页的. 从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址, 然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止. 如果把整个互联网当成一个网站,那么

Python实现网络爬虫

一.网络爬虫的定义 网络爬虫,即Web Spider,是一个很形象的名字. 把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛. 网络蜘蛛是通过网页的链接地址来寻找网页的. 从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址, 然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止. 如果把整个互联网当成一个网站,那么网络蜘蛛就可以用这个原理把互联网上所有的网页都抓取下来. 这样看来,网络爬虫就是一个爬行程序,一个抓

Python]网络爬虫

Originated From: http://blog.csdn.net/pi9nc/article/details/9734437#comments [Python]网络爬虫(一):抓取网页的含义和URL基本构成 一.网络爬虫的定义 网络爬虫,即Web Spider,是一个很形象的名字. 把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛.网络蜘蛛是通过网页的链接地址来寻找网页的. 从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址, 然后通过这些

百度贴吧的网络爬虫(v0.4)源码及解析

更新:感谢评论中朋友的提醒,百度贴吧现在已经改成utf-8编码了吧,需要把代码中的decode('gbk')改成decode('utf-8'). 百度贴吧的爬虫制作和糗百的爬虫制作原理基本相同,都是通过查看源码扣出关键数据,然后将其存储到本地txt文件. 源码下载: http://download.csdn.net/detail/wxg694175346/6925583 项目内容: 用Python写的百度贴吧的网络爬虫. 使用方法: 新建一个BugBaidu.py文件,然后将代码复制到里面后,双

抓取百度贴吧python小爬虫 (2015最新版)

网上好多抓取贴吧的小爬虫都失效了,原因是百度贴吧的编码格式变了,或者是html代码变了,像这种简单的读取源代码的爬虫,只要网页源代码改变之后就得重新修改. 请诸位大牛指点. # -*- coding:utf8 -*- """ 程序就是读取网页的源代码,如果想获取相应的内容就找到其特定的格式,再利用正则表达式来获取. """ import string import urllib2 import re class html_Tool: #为了提取文

利用Python写百度贴吧爬虫

最近,我们这边需要做一次防爬虫和机器蜘蛛的困扰,感觉困惑,有点无从入手,倒不如,直接用Python来写一个Spiner理解其各种原理,再下手也不迟啊,于是便立刻去写一个爬虫程序. 使用方法: 新建一个BugBaidu.py文件,然后将代码复制到里面后,双击运行. 程序功能: 将贴吧中楼主发布的内容打包txt存储到本地. 好,不废话,直接上代码: #!/usr/bin/python #-*- coding: utf-8 -*- import string import urllib2 import

爬虫Scrapy学习指南之抓取新浪天气

scrapy有一个简单的入门文档,大家可以参考一下,我感觉官方文档是最靠谱的,也是最真实的. 首先我们先创建一个scrapy的项目 scrapy startproject weather 我采用的是ubuntu12.04的系统,建立项目之后主文件夹就会出现一个weather的文件夹.我们可以通过tree来查看文件夹的结构.可以使用sudoapt-get install tree安装. tree weather weather ├── scrapy.cfg ├── wea.json ├── wea