Python采集腾讯新闻实例
目标是把腾讯新闻主页上所有新闻爬取下来,获得每一篇新闻的名称、时间、来源以及正文。
接下来分解目标,一步一步地做。
步骤1:将主页上所有链接爬取出来,写到文件里。
python在获取html方面十分方便,寥寥数行代码就可以实现我们需要的功能。
defgetHtml(url): page=urllib.urlopen(url) html=page.read() page.close() returnhtml
我们都知道html链接的标签是“a”,链接的属性是“href”,也就是要获得html中所有tag=a,attrs=href值。
查阅了资料,一开始我打算用HTMLParser,而且也写出来了。但是它有一个问题,就是遇到中文字符的时候无法处理。
classparser(HTMLParser.HTMLParser): defhandle_starttag(self,tag,attrs): iftag=='a': forattr,valueinattrs: ifattr=='href': printvalue
后来使用了SGMLParser,它就没有这个问题。
classURLParser(SGMLParser): defreset(self): SGMLParser.reset(self) self.urls=[] defstart_a(self,attrs): href=[vfork,vinattrsifk=='href'] ifhref: self.urls.extend(href)
SGMLParser针对某个标签都需要重载它的函数,这里是把所有的链接放到该类的urls里。
lParser=URLParser()#分析器来的 socket=urllib.urlopen("http://news.qq.com/")#打开这个网页
fout=file('urls.txt','w')#要把链接写到这个文件里 lParser.feed(socket.read())#分析啦
reg='http://news.qq.com/a/.*'#这个是用来匹配符合条件的链接,使用正则表达式匹配 pattern=re.compile(reg)
forurlinlParser.urls:#链接都存在urls里 ifpattern.match(url): fout.write(url+'\n')
fout.close()