Python学习笔记之网络爬虫

本文介绍了一种使用宽度优先搜索(BFS)算法实现网络爬虫的方法,通过SGMLParser解析HTML并提取超链接,实现了网页的有效抓取。文中详细说明了如何避免重复抓取同一URL,并探讨了提高URL判重效率的可能性。

网络爬虫的实现可以用BFS(宽度优先搜索),以某个weburl为起始节点,利用标准库的SGMLParser解析html提取超链接,判重后进队,即可实现对网页的抓取。

1)用HTMLParser实现的时候编码的问题总是解决不了,很多html解析后都直接抛出异常,试过将当前html的编码格式转成unicode也无法解决。于是改为SGMLParser,便没有出现编码问题,基本上试过很多站点的html都可以正常解析。

2)关于url判重,我直接放在一个字典里面然后用has_key()找,可能效率并不高。更高效应该是用hashlib等标准库。
感觉代码实现的有点搓,有待优化。。。

#!/usr/bin/env python

import sys, socket, HTMLParser, urllib, urllib2
from sgmllib import SGMLParser

#analysis html file
class MyParser(SGMLParser):
def __init__(self):
self.link
= []
SGMLParser.
__init__(self)

def start_a(self, attrs):
for name, value in attrs:
if name == 'href' and value.startswith('h'):
self.link.append(value)
def getlink(self):
return self.link

#save html file to disk
def SaveFile(name, html):
f
= file("/home/crbtmac/html/" + name, 'w')
f.write(html)
f.close()

def doit():
WebUrl
= ['http://www.baidu.com']
value
= 0
dic
= {}
id
= 0
while len(WebUrl) > 0:
try:
if len(WebUrl):
url1
= WebUrl.pop(0)
req
= urllib2.Request(url1)
id
+= 1
except urllib2.URLError, e:
print e

try:
#open the weburl
fd = urllib2.urlopen(req)
Html
= fd.read()
#save html file to disk
name = str(id) + '.html'
SaveFile(name, Html)

parser
= MyParser()
parser.feed(Html)
#get the link from current page
Link = parser.getlink()
for url in Link:
if dic.has_key(url) == False:
dic[url]
= value
WebUrl.append(url)
value
+= 1
except:
print 'Error'
continue


if __name__ == '__main__':
doit()

转载于:https://www.cnblogs.com/crbtmac/archive/2011/03/24/1994039.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值