一、介绍

该程序主体是《Python核心编程第二版》例20.2。本篇会修改部分代码及添加了相关注释。
ps:该书该例程不能直接运行,需要修改。

二、功能
网络爬虫crawl.py抓取web的开始页面地址,下载该页面和其他后续链接页面,但是仅限于那些与开始页面有着相同域名页面。

三、程序
crawl.py

#coding=utf-8

#20170628 why
'''


本程序执行成功后会在本地产生文件名太长或文件夹路径太深无法删除的情况,解决方法如下:

在要删除的目录新建t1

在该目录下的cmd中执行 D:\it\Python\HTTP_Client>robocopy t1 www.runoob.com /MIR

接着删除t1和www.runoob.com文件夹

'''

from sys import argv

from os import makedirs, unlink, sep

from os.path import dirname, exists, isdir, splitext

from string import replace, find, lower

from htmllib import HTMLParser

from urllib import urlretrieve

from urlparse import urlparse, urljoin

from formatter import DumbWriter, AbstractFormatter

from cStringIO import StringIO

class Retriever(object):

def __init__(self, url):

self.url = url

self.file = self.filename(url)

def filename(self, url, deffile = 'index.html'):

'''
 
     
该函数将输入的网址作为相对路径并创建。若该路径存在则删除后重新创建;若该路径不存在则新建。返回本地保存的路径。

 
     
:param url:地址

 
     
:param deffile:要爬的主页名

 
     
:return:返回路径

 
     
'''
 
     
parsedurl = urlparse(url)

# print parsedurl[0] 
#http
 
     
# print parsedurl[1] 
#www.null.com
   
   
# print parsedurl[2] 
#/home/index.html
   
   
path = parsedurl[] + parsedurl[]

# print path 
     
 
#www.null.com/home/index.html
   
   
ext = splitext(path)

     
  # print ext 
     
 
 #('www.null.com/home/index', '.html')

 
     
# print ext[1] 
     
#.html
 
     
# print path[-1] 
    #l
   
    ] == '':

] == '/':

path += deffile

     
     
    # print path

 
     
    else:

     
     
   
path += '/' + deffile

# print path

 
     
ldir = dirname(path)

     
  # print ldir 
   
#www.null.com/home
   
   
# print sep 
   
 #\
   
    if sep != '/':

ldir = replace(ldir, '/', sep)

     
  if not isdir(ldir): 
   #判断是否是文件夹,若不是文件夹isdir(ldir)是False;若是文件夹isdir(ldir)是True;
 
     
    if exists(ldir): 
  #判断文件夹是否存在,若存在exists(ldir)是True;若不存在exists(ldir)是False;

 
     
     
  unlink(ldir) 
  #unlink() 方法用于删除文件,如果文件是一个目录则返回一个错误。
 
     
   
makedirs(ldir)  #修改错误处 makedirs() 方法用于递归创建目录。若之前存在或不存在都需要新建。


 
     
print path 
#www.null.com/home/index.html
 
     
return path #返回路径


 
  def download(self):

'''
 
     
该函数直接将远程数据下载到本地。

 
     
urlretrieve(url, filename, reporthook);

 
     
url:外部或者本地url

 
     
filename:指定了保存到本地的路径(如果未指定该参数,urllib会生成一个临时文件来保存数据);

 
     
reporthook:是一个回调函数,当连接上服务器、以及相应的数据块传输完毕的时候会触发该回调。我们可以利用这个回调函数来显示当前的下载进度。

 
     
:return:返回网址

 
     
'''
 
     
try:

     
     
# print self.url 
#http://www.null.com/home/index.html
   
     
 
# print self.file #www.null.com/home/index.html

 
     
   
retval = urlretrieve(self.url, self.file) 
 #直接将远程数据下载到本地。
 
     
except IOError:

retval = ('*** Error: invaild URL "%s"' % self.url)

return retval 
 #修改错误处

 
  def parseAndGetLinks(self):

#HTMLParser实现HTML文件的分析。
 
     
#StringIO是从内存中读取数据;DumbWriter将事件流转换为存文本文档
 
     
self.paraser = HTMLParser(AbstractFormatter(DumbWriter(StringIO())))

print self.paraser

self.paraser.feed(open(self.file).read()) 
 #feed方法将接收数据
 
     
self.paraser.close()

     
  print self.paraser.anchorlist

return self.paraser.anchorlist #返回地址和日期



class Crawler(object):

count = 0

   
def __init__(self, url):

self.q = [url]

self.seen = []

]

def getPage(self, url):

r = Retriever(url)

     
 
retval = r.download()

     
  #print retval #('www.null.com/home/index.html', )

 
     
] == '*':

print retval, '... skipping parase'

 
     
    return
 
     
Crawler.count += 1
   
    print '\n(', Crawler.count,')'

 
     
print 'URL:', url

]

self.seen.append(url) 
 #['http://www.null.com/home/index.html'] append() 方法用于在列表末尾添加新的对象

 
     
print self.seen

links = r.parseAndGetLinks()

print links

for eachLink in links:

]

print find(eachLink, '://')

] != : #find() 方法检测字符串中是否包含子字符串 str

 
     
     
 
eachLink = urljoin(url, eachLink)

print '*', eachLink

:

print '... discarded, mailto link'

 
     
     
  continue

 
     
   
if eachLink not in self.seen:

:

print '... discared, not in domain'

 
     
     
  else:

     
     
     
  if eachLink not in self.q:

self.q.append(eachLink)

     
     
     
     
print '... new, added to Q'

 
     
     
     
else:

     
     
     
     
print '... discared, already in Q'

 
     
    else:

     
     
    print '... discarded, alraedy processed'


   
def go(self):

while self.q:

url = self.q.pop() #pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。
 
     
    self.getPage(url)





def main():

:

url = argv[]



    else:

     
  try:

     
     
url = raw_input('Enter starting URL:')

except (KeyboardInterrupt, EOFError):

url = ''
   
if not url: return

 
 
robot = Crawler(url)

    robot.go()



if __name__ == '__main__': #使用http://www.runoob.com/w3cnote/index.html

 
  main()

网络爬虫Web开始的更多相关文章

  1. 网络爬虫框架Scrapy简介

    作者: 黄进(QQ:7149101) 一. 网络爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本:它是一个自动提取网页的程序,它为搜索引擎从万维 ...

  2. <HTTP权威指南>记录 ---- 网络爬虫

    网络爬虫 网络爬虫(web crawler)能够在无需人类干预的情况下自动进行一系列Web事务处理的软件程序.很多爬虫会从一个Web站点逛到另一个Web站点,获取内容,跟踪超链,并对它们找到的数据进行 ...

  3. [CareerCup] 10.5 Web Crawler 网络爬虫

    10.5 If you were designing a web crawler, how would you avoid getting into infinite loops? 这道题问如果让我们 ...

  4. 有了 Docker,用 JavaScript 框架开发的 Web 站点也能很好地支持网络爬虫的内容抓取

    点这里 阅读目录 用 AngularJS(以及其它 JavaScript 框架)开发的 Web 站点不支持爬虫的抓取 解决方案 为什么公开我们的解决方案 实现 AngularJS 服务 结论   Pr ...

  5. 网络爬虫与web之间的访问授权协议——Robots

    网站的管理者们通常会有这样一种心态:一方面期待百度.Google这样的搜索引擎来抓取网站的内容,另一方面又很厌恶其他来路不明的网络爬虫抓取自己的信息.正是因为这样,才有“好爬虫”.“坏爬虫”这样的说法 ...

  6. 网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(3): 抓取amazon.com价格

    通过上一篇随笔的处理,我们已经拿到了书的书名和ISBN码.(网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(2): 抓取allitebooks.com书籍信息 ...

  7. 网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(1): 基础知识Beautiful Soup

    开始学习网络数据挖掘方面的知识,首先从Beautiful Soup入手(Beautiful Soup是一个Python库,功能是从HTML和XML中解析数据),打算以三篇博文纪录学习Beautiful ...

  8. Atitit.数据检索与网络爬虫与数据采集的原理概论

    Atitit.数据检索与网络爬虫与数据采集的原理概论 1. 信息检索1 1.1. <信息检索导论>((美)曼宁...)[简介_书评_在线阅读] - dangdang.html1 1.2. ...

  9. [Python] 网络爬虫和正则表达式学习总结

    以前在学校做科研都是直接利用网上共享的一些数据,就像我们经常说的dataset.beachmark等等.但是,对于实际的工业需求来说,爬取网络的数据是必须的并且是首要的.最近在国内一家互联网公司实习, ...

随机推荐

  1. Css实现一个简单的幻灯片效果页面

    使用animation动画实现一个简单的幻灯片效果. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 2 ...

  2. 单人纸牌_NOI导刊2011提高(04)

    单人纸牌 时间限制: 1 Sec  内存限制: 128 MB 题目描述 单人纸牌游戏,共 36 张牌分成 9 叠,每叠 4 张牌面向上.每次,游戏者可以从某两个不同的牌堆最顶上取出两张牌面相同的牌(如 ...

  3. 浅谈WEB编辑器——HBuilder

    我自己用过的WEB编辑器有两种:HBuilder和Dreamweaver.这两种编辑器各有各的特点,但是相对来说,我倾向于前者:后者给我的感觉就是功能繁杂,运行起来慢,而且编码的便捷度不高,时不时需要 ...

  4. win7休眠的开启与关闭方法

    从开始菜单中找到“附件→命令提示符”,右击选择“以管理员身份运行”,此时可能需要输入管理员密码或进行UAC确认,手工输入如下命令:powercfg -a,从这里可以清楚的看到,计算机是支持休眠的,只是 ...

  5. USACO The Castle

    首先看一下题目. The CastleIOI'94 - Day 1 In a stroke of luck almost beyond imagination, Farmer John was sen ...

  6. IE的hack问题浅谈

    *我一直以为是IE7的专属选择. 开始,我以为是bug ,怎么可能会有+号.一定是哪位同事写错了.找了度娘才知道自己的不足.原来也是可以的. 后来,通过ie8和ie7来调整自己的css.也感觉不用ha ...

  7. Linux 压缩 与解压命令

    tar命令 解包:tar zxvf FileName.tar 打包:tar czvf FileName.tar DirName gz命令 解压1:gunzip FileName.gz 解压2:gzip ...

  8. javascript数组集锦

    设计数组的函数方法 toString, toLocaleString, valueOf, concat, splice, slice indexOf,lastIndexOf, push, pop, s ...

  9. voa 2015 / 4 / 26

    Now, Words and Their Stories, a VOA Special English program about American expressions. I'm Rich Kle ...

  10. python基础(2):python的变量和常量

    今天看看python的变量和常量:python3 C:\test.py 首先先说一下解释器执行Python的过程: 1. 启动python解释器(内存中) 2. 将C:\test.py内容从硬盘读入内 ...