1 # -*- coding: UTF-8 -*- 2 import re 3 import urllib2 4 5 from collections import deque 6 7 # 保存文件的后缀 8 SUFFIX=‘.html‘ 9 # 提取文章标题的正则表达式 10 REX_TITLE=r‘<title>(.*?)</title>‘ 11 # 提取所需链接的正则表达式 12 REX_URL=r‘/jdbc/(.+?).html‘ 13 # 种子url,从这个url开始爬取 14 BASE_URL=‘http://www.yiibai.com/jdbc/‘ 15 16 17 # 将获取到的文本保存为html文件 18 def saveHtml(file_name,file_content): 19 # 注意windows文件命名的禁用符,比如 / 20 with open(file_name.replace(‘/‘, ‘_‘)+SUFFIX,"wb") as f: 21 # 写文件用bytes而不是str,所以要转码 22 f.write(file_content) 23 # 获取文章标题 24 def getTitle(file_content): 25 linkre=re.search(REX_TITLE,file_content) 26 if(linkre): 27 print (‘获取文章主题:‘+linkre.group(1)) 28 return linkre.group(1) 29 30 # 爬虫用到的两个数据结构,队列和集合 31 queue=deque() 32 visited=set() 33 # 初始化种子链接 34 queue.append(BASE_URL) 35 count=0 36 37 while queue: 38 url=queue.popleft() # 队首元素出队 39 visited |= {url} # 标记为已访问 40 41 print(‘已经抓取: ‘+ str(count)+‘ 正在抓取 <--- ‘+url) 42 count += 1 43 urlop=urllib2.urlopen(url) 44 # 只处理html链接 45 if ‘html‘ not in urlop.headers.getheader(‘Content-Type‘): 46 continue 47 # 避免程序异常中止 48 try: 49 data=urlop.read() 50 title=getTitle(data).decode(‘utf-8‘); 51 # 保存文件 52 saveHtml(title,data) 53 except: 54 continue 55 56 # 正则表达式提取页面中所有链接, 并判断是否已经访问过, 然后加入待爬队列 57 linkre = re.compile(REX_URL) 58 for sub_link in linkre.findall(data): 59 sub_url=BASE_URL+sub_link+SUFFIX; 60 # 已经访问过,不再处理 61 if sub_url in visited: 62 pass 63 else: 64 # 设置已访问 65 visited |= {sub_url} 66 # 加入队列 67 queue.append(sub_url) 68 print(‘join the quene---> ‘+sub_url)
http://blog.csdn.net/wangshihui512/article/details/51100605#python
22 和 49行 与原文有所出处 如果添加了反而无法执行 可能和编码有关系
时间: 2024-10-21 07:30:26