正则匹配牛刀小试——一键抓取奇虎360新闻信息
继续爬虫的学习,为了致敬
http://blog.csdn.net/pleasecallmewhy/article/details/8932310 中why大神的糗事爬虫,我做了一个奇虎新闻的小爬虫,亲测可试,但是我这个爬虫还是单线程的,而且抓取的量也不是很多,而且是最基本的url特性抓取,还没有能力抓取url不变的网站消息。
首先说一下我要抓取的网站:360新闻搜索 - 搜一下,知天下 ,通过观察其url,不难看出来是
http://sh.qihoo.com/类别/index_页数.html 的结构,隐藏只需要把它抓取回来,依次用正则的方式匹配就行,废话不多说,上码。
1 #!/usr/bin/env python 2 #-*-coding:utf-8-*- 3 4 #--------------------------------------- 5 # 程序:奇虎360新闻爬虫 6 # 文件名:Qihoo360.py 7 # 作者:sysublackbear 8 # 日期:2014-03-30 9 # 语言:Python 10 # 功能:将360中的新闻,链接及摘要输出并且保存到本地文件 11 #--------------------------------------- 12 13 import urllib2 14 import urllib 15 import re 16 import string 17 18 #定义新闻的标签 19 tags = ['china','world','mil','ent','sports',\ 20 'internet','tech','finance','house','auto','edu','game',\ 21 'lady','health','society'] 22 23 class Qihoo360News: 24 #构造函数 25 def __init__(self): 26 self.start = 1 #默认开始从第一页开始 27 self.end = 5 #默认结束页还是1 28 29 #把某一页的标题和连接都放到字典上 30 def getPage(self,tag,start,end): 31 if tag not in tags: 32 print '你所找的类别不存在!' 33 return 34 if end > 5: 35 end = 5 36 url = "http://sh.qihoo.com/"+tag+"/" 37 intro = '以下是'+tag+'抓取的结果' 38 print intro 39 for i in range(start,end+1): 40 f = open('/home/dzhwen/python文件/Homework/urllib/qihoo/qihoo_'+tag+'_page_'+str(i)+'.txt','w+') 41 id = '第'+str(i)+'页' 42 print id.center(40) 43 f.write(id.center(40)+'\n') 44 if i == 1: 45 myurl = url + "index.html" 46 else: 47 myurl = url + "index_" + str(i) + ".html" 48 Response = urllib2.urlopen(myurl) 49 Page = Response.read() 50 myItems = re.findall('<div class="hd">.*?<h2><a href="(.*?)" target="_blank">(.*?)</a></h2>.*?<div class="bd">.*?<p>(.*?)<a',Page,re.S) 51 #其中,re.S为多行匹配模式 52 #输出同时写入文本 53 temp = '*******************************************' 54 for item in myItems: 55 print temp 56 f.write(temp + '\n') 57 print '标题:',item[1] 58 f.write('标题:'+item[1]+'\n') 59 print 'From:',item[0] 60 f.write('From:'+item[0]+'\n') 61 print '摘要:',item[2] 62 f.write('摘要:'+item[2]+'\n') 63 print temp 64 f.close() 65 66 67 if __name__ == '__main__': 68 qihoo = Qihoo360News() 69 menu=""" 70 请选择要抓取的类别: 71 1——国内;2——国际;3——军事;4——娱乐;5——体育;6——互联网;7——科技;8——财经; 72 9——房产;10——汽车;11——教育;12——游戏;13——女性;14——健康;15——社会; 73 或者:?(慎用!!) 74 一键全抓取??(A) 75 """ 76 print menu 77 tag = raw_input("请选择:") 78 if tag != 'A': 79 start = raw_input("请选择开始页数(1——5):") 80 end = raw_input("请选择结束页数(1——5):") 81 qihoo.getPage(tags[int(tag)-1],int(start),int(end)) 82 else: 83 for item in tags: 84 qihoo.getPage(item,1,5)
就这样,请多多指教!