这个爬虫的作用是,对于一个给定的url,查找页面里面所有的url连接并依次贪婪爬取

主要需要注意的地方:

1.lxml.html.iterlinks()  可以实现对页面所有url的查找

2.获取页面要设置超时,否则遇到没有响应的页面,代码容易卡死

3.对所有异常的捕获

4.广度优先搜索实现

具体代码如下:

#!/usr/bin/env python
#encoding:utf8 #这是一个爬虫代码,从初始url页面中查找所有的url并根据广度优先的顺序依次贪婪爬取
#爬取的页面以1.html,2.html...的方式命名
#author:匡子语 import re
import time
import lxml.html
import urllib2
from collections import deque class ScrawURL:
def __init__(self):
self.total = 50000 #要获取的页面数
self.urls = ["http://www.cnblogs.com/"] #初始url
self.html_num = 13047 #当前存储的是第几个页面
self.url_num = 0 #当前要爬取的url在urls中的位置 def getHtml(self, url):
print "url:%s" % url
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = { 'User-Agent' : user_agent }
try:
request = urllib2.Request(url, headers = headers)
response = urllib2.urlopen(request, timeout=5) #要设置timeout,有时页面长时间无法响应不加timeout会导致程序卡死
content = response.read()
self.html_num += 1
name = "htmls/%d.html" % self.html_num
with open(name, "w") as f:
f.write(content)
print self.html_num
return content
except urllib2.HTTPError, e:
return ''
except urllib2.URLError, e:
return ''
except Exception, ex: #对于所有异常形式,都返回空内容
return '' def getUrl(self, content):
try:
print "getUrl"
html = lxml.html.fromstring(content)
links = lxml.html.iterlinks(html) #这个函数可以自动获取页面中的所有url,非常好用
urls = []
for link in links:
if "http" in link[2]:
urls.append(link[2])
return urls
except Exception, ex:
return [] def scrawl(self): #广度优先爬取
print "scrawl"
while len(self.urls) < self.total and len(self.urls) > self.url_num: #获取足够的url
url = self.urls[self.url_num]
self.url_num += 1
content = self.getHtml(url)
if content:
urls = self.getUrl(content)
if urls:
for url in urls:
if url not in self.urls: #对于已经爬取过的url跳过
self.urls.append(url) while self.html_num < self.total and len(self.urls) > 0: #获取足够的页面
url = self.urls[self.url_num]
self.url_num += 1
self.getHtml(url) if __name__ == "__main__":
surl = ScrawURL()
surl.scrawl()

【python】一个简单的贪婪爬虫的更多相关文章

  1. python实现的一个简单的网页爬虫

    学习了下python,看了一个简单的网页爬虫:http://www.cnblogs.com/fnng/p/3576154.html 自己实现了一个简单的网页爬虫,获取豆瓣的最新电影信息. 爬虫主要是获 ...

  2. 做一个简单的scrapy爬虫

    前言: 做一个简单的scrapy爬虫,带大家认识一下创建scrapy的大致流程.我们就抓取扇贝上的单词书,python的高频词汇. 步骤: 一,新建一个工程scrapy_shanbay 二,在工程中中 ...

  3. Java实现一个简单的网络爬虫

    Java实现一个简单的网络爬虫 import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWri ...

  4. 一个简单的C#爬虫程序

    这篇这篇文章主要是展示了一个C#语言如何抓取网站中的图片.实现原理就是基于http请求.C#给我们提供了HttpWebRequest和WebClient两个对象,方便发送请求获取数据,下面看如何实 1 ...

  5. python -----一个简单的小程序(监控电脑内存,cpu,硬盘)

    一个简单的小程序 用函数实现!~~ 实现: cpu 使用率大于百分之50 时  ,  C 盘容量不足5 G 时, 内存 低于2G 时. 出现以上其中一种情况,发送自动报警邮件! 主要运用 到了两个 模 ...

  6. Python—一个简单搜索引擎索引库

    因为课业要求,搭建一个简单的搜索引擎,找了一些相关资料并进行了部分优化(坑有点多) 一.数据 数据是网络上爬取的旅游相关的攻略页面 这个是travels表,在索引中主要用到id和url两个字段. 页面 ...

  7. python一个简单的爬虫测试

    之前稍微学了一点python,后来一直都没用,今天稍微做一个小爬虫试一试.. 参考了: http://www.cnblogs.com/fnng/p/3576154.html 太久没用了,都忘记pych ...

  8. 利用python写一个简单的小爬虫 爬虫日记(1)(好好学习)

    打开py的IDLE >>>import urllib.request >>>a=urllib.request.urlopen("http://www.ba ...

  9. 一个简单的scrapy爬虫抓取豆瓣刘亦菲的图片地址

    一.第一步是创建一个scrapy项目 sh-3.2# scrapy startproject liuyifeiImage sh-3.2# chmod -R 777 liuyifeiImage/ 二.分 ...

随机推荐

  1. 【长期更新】--神犇的BLOGS(各种高端讲解)

    KMP字符串匹配算法: http://kb.cnblogs.com/page/176818/ http://blog.csdn.net/yutianzuijin/article/details/119 ...

  2. 【深入】java 单例模式(转)

    [深入]java 单例模式 关于单例模式的文章,其实网上早就已经泛滥了.但一个小小的单例,里面却是有着许多的变化.网上的文章大多也是提到了其中的一个或几个点,很少有比较全面且脉络清晰的文章,于是,我便 ...

  3. HYSBZ - 2152 聪聪和可可

    Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好 ...

  4. Codeforces 1C Ancient Berland Circus

    传送门 题意 给出一正多边形三顶点的坐标,求此正多边形的面积最小值. 分析 为了叙述方便,定义正多边形的单位圆心角u为正多边形的某条边对其外接圆的圆心角(即外接圆的某条弦所对的圆心角). (1)多边形 ...

  5. MyEclipse------缓冲流的使用

    可以把BufferedReader和BufferedWriter称为上层流,把它们指向的字符流(Reader,Writer)称为底层流. Java采用缓存技术将上层流和底层流连接. 底层字符输入流先将 ...

  6. std::thread join和detach区别

    thread detach, join 线程有两种状态,joinable或者detachable,pthread默认创建的线程是joinable的,也可以指定atrribute创建成一个detacha ...

  7. java中request,application,session三个域及参数简单示例

    直接上代码: java代码: public class HelloAction implements Action { @Override public String execute() throws ...

  8. java中获取路径中的空格处理(%20)问题

    在java中获取文件路径的时候,有时候会获取到空格,但是在中文编码环境下,空格会变成“%20”从而使得路径错误. 解决办法: String path = Parameter.class.getReso ...

  9. asp.net环境变量

    // 获取程序的基目录. System.AppDomain.CurrentDomain.BaseDirectory // 获取模块的完整路径. System.Diagnostics.Process.G ...

  10. centos7中systemctl命令使用方法和心得体会

    使用linux的同学对service和chkconfig两个命令都不陌生,其重要性不言而喻,那么怎么会突然冒出个systemctl命令呢?其实,为了简化操作,systemctl命令将service和c ...