Python采集腾讯新闻实例


Posted in Python onJuly 10, 2014

目标是把腾讯新闻主页上所有新闻爬取下来,获得每一篇新闻的名称、时间、来源以及正文。

接下来分解目标,一步一步地做。

步骤1:将主页上所有链接爬取出来,写到文件里。

python在获取html方面十分方便,寥寥数行代码就可以实现我们需要的功能。

def getHtml(url):

     page = urllib.urlopen(url)

     html = page.read()

     page.close()

     return html

我们都知道html链接的标签是“a”,链接的属性是“href”,也就是要获得html中所有tag=a,attrs=href 值。

查阅了资料,一开始我打算用HTMLParser,而且也写出来了。但是它有一个问题,就是遇到中文字符的时候无法处理。

 class parser(HTMLParser.HTMLParser):

     def handle_starttag(self, tag, attrs):

             if tag == 'a':

             for attr, value in attrs:

                 if attr == 'href':

                     print value

后来使用了SGMLParser,它就没有这个问题。
class URLParser(SGMLParser):       

        def reset(self):

                SGMLParser.reset(self)

                self.urls = []

 

        def start_a(self,attrs):        

                href = [v for k,v in attrs if k=='href']          

                if href:

                        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)
for url in lParser.urls:#链接都存在urls里

    if pattern.match(url):

        fout.write(url+'\n')
fout.close()

这样子就把所有符合条件的链接都保存到urls.txt文件里了。

步骤2:对于每一个链接,获取它的网页内容。

很简单,只需要打开urls.txt文件,一行一行地读出来就可以了。

也许这里会显得多此一举,但是基于我对解耦的强烈愿望,我还是果断地写到文件里了。后面如果采用面向对象编程,重构起来是十分方便的。

获取网页内容部分也是相对简单的,但是需要把网页的内容都保存到一个文件夹里。

这里有几个新的用法:

os.getcwd()#获得当前文件夹路径

os.path.sep#当前系统路径分隔符(是这个叫法吗?)windows下是“\”,linux下是“/”
#判断文件夹是否存在,如果不存在则新建一个文件夹

if os.path.exists('newsdir') == False:

    os.makedirs('newsdir')
#str()用来将某个数字转为字符串

i = 5

str(i)

有了这些方法,将字符串保存到某个文件夹下不同的文件就不再是一件困难的事了。

步骤3:枚举每一个网页,根据正则匹配获得目标数据。

下面的方法是用来遍历文件夹的。

 #这个是用来遍历某个文件夹的

 for parent, dirnames, filenames in os.walk(dir):

     for dirname in dirnames

         print parent, dirname

     for filename in filenames:

         print parent, filename

遍历,读取,匹配,结果就出来了。

我使用的数据提取的正则表达式是这样的:

reg = '<div class="hd">.*?<h1>(.*?)</h1>.*?<span class="pubTime">(.*?)</span>.*?<a .*?>(.*?)</a>.*?<div id="Cnt-Main-Article-QQ" .*?>(.*?)</div>'

其实这个并不能匹配到腾讯网的所有新闻,因为上面的新闻有两种格式,标签有一点差别,所以只能提取出一种。

另外一点就是通过正则表达式的提取肯定不是主流的提取方法,如果需要采集其他网站,就需要变更正则表达式,这可是一件比较麻烦的事情。

提取之后观察可知,正文部分总是会参杂一些无关信息,比如“<script>...</script>”“<p></p>”等等。所以我再通过正则表达式将正文切片。

def func(str):#谁起的这个名字

    strs = re.split("<style>.*?</style>|<script.*?>.*?</script>|&#[0-9]+;|<!--\[if !IE\]>.+?<!\[endif\]-->|<.*?>", str)#各种匹配,通过“|”分隔

    ans = ''

    #将切分的结果组合起来

    for each in strs:

        ans += each

    return ans

这样腾讯网上面的正文基本全部能够提取出来。

到此整个采集也就结束了。

展示一下我提取到的结果(不使用自动换行,右边隐藏了):

Python采集腾讯新闻实例

注意:

1、打开某个网址的时候,如果网址是坏的(打不开),若不处理则会报错。我简单地使用处理异常的方式,估计应该有其他方式。

try:

    socket = urllib.urlopen(url)

except:

    continue

2、Python正则表达式中的“.”号,可以匹配任意字符,但是除了“\n”。

3、如何去除字符串末尾的“\n”?python的处理简直优雅到死啊!

if line[-1] == '\n':

    line = line[0:-1]
Python 相关文章推荐
python常用函数详解
Sep 13 Python
解决pycharm工程启动卡住没反应的问题
Jan 19 Python
python实现点击按钮修改数据的方法
Jul 17 Python
Python二元赋值实用技巧解析
Oct 25 Python
Python+OpenCV实现实时眼动追踪的示例代码
Nov 11 Python
利用python在excel中画图的实现方法
Mar 17 Python
文件上传服务器-jupyter 中python解压及压缩方式
Apr 22 Python
如何理解Python中包的引入
May 29 Python
解决python调用自己文件函数/执行函数找不到包问题
Jun 01 Python
浅谈matplotlib中FigureCanvasXAgg的用法
Jun 16 Python
浅谈python 类方法/静态方法
Sep 18 Python
Python爬取股票信息,并可视化数据的示例
Sep 26 Python
使用wxpython实现的一个简单图片浏览器实例
Jul 10 #Python
Python语言的12个基础知识点小结
Jul 10 #Python
使用Python获取Linux系统的各种信息
Jul 10 #Python
Django中实现一个高性能计数器(Counter)实例
Jul 09 #Python
python实现的登录和操作开心网脚本分享
Jul 09 #Python
python实现的一个火车票转让信息采集器
Jul 09 #Python
python的描述符(descriptor)、装饰器(property)造成的一个无限递归问题分享
Jul 09 #Python
You might like
php打印一个边长为N的实心和空心菱型的方法
2015/03/02 PHP
php实现通过soap调用.Net的WebService asmx文件
2017/02/27 PHP
根据key删除数组中指定的元素实现方法
2017/03/02 PHP
js继承的实现代码
2010/08/05 Javascript
Javascript学习笔记二 之 变量
2010/12/15 Javascript
深入理解javascript动态插入技术
2013/11/12 Javascript
cookie中的path与domain属性详解
2013/12/18 Javascript
js换图片效果可进行定时操作
2014/06/09 Javascript
JavaScript截断字符串的方法
2015/07/15 Javascript
基于JavaScript的操作系统你听说过吗?
2016/01/28 Javascript
省市区三级联动jquery实现代码
2020/04/15 Javascript
Ajax的概述与实现过程
2016/11/18 Javascript
vue + element-ui实现简洁的导入导出功能
2017/12/22 Javascript
Vue模拟数据,实现路由进入商品详情页面的示例
2018/08/31 Javascript
JavaScript数组、json对象、eval()函数用法实例分析
2019/02/21 Javascript
[53:29]完美世界DOTA2联赛循环赛 DM vs Matador BO2第二场 11.04
2020/11/05 DOTA
浅谈django model的get和filter方法的区别(必看篇)
2017/05/23 Python
Python django实现简单的邮件系统发送邮件功能
2017/07/14 Python
使用Kivy将python程序打包为apk文件
2017/07/29 Python
详谈python read readline readlines的区别
2017/09/22 Python
python调用Delphi写的Dll代码示例
2017/12/05 Python
python 监听salt job状态,并任务数据推送到redis中的方法
2019/01/14 Python
python使用mitmproxy抓取浏览器请求的方法
2019/07/02 Python
Python 矩阵转置的几种方法小结
2019/12/02 Python
如何基于python操作excel并获取内容
2019/12/24 Python
Python中的X[:,0]、X[:,1]、X[:,:,0]、X[:,:,1]、X[:,m:n]和X[:,:,m:n]
2020/02/13 Python
python3读取autocad图形文件.py实例
2020/06/05 Python
Python开发.exe小工具的详细步骤
2021/01/27 Python
python 实现网易邮箱邮件阅读和删除的辅助小脚本
2021/03/01 Python
Html5基于canvas实现电子签名并生成PDF文档
2020/12/07 HTML / CSS
英国排名第一的最新设计师品牌手表独立零售商:TIC Watches
2016/09/24 全球购物
什么是makefile? 如何编写makefile?
2013/01/02 面试题
医学专业毕业生个人求职信
2013/12/25 职场文书
美术指导求职信
2014/03/17 职场文书
jQuery实现影院选座订座效果
2021/04/13 jQuery
golang中的并发和并行
2021/05/08 Golang