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模块学习 filecmp 文件比较
Aug 27 Python
简单介绍使用Python解析并修改XML文档的方法
Oct 15 Python
Python字符串处理实现单词反转
Jun 14 Python
Python 利用scrapy爬虫通过短短50行代码下载整站短视频
Oct 29 Python
三步实现Django Paginator分页的方法
Jun 11 Python
python 整数越界问题详解
Jun 27 Python
Python3实现配置文件差异对比脚本
Nov 18 Python
vue学习笔记之动态组件和v-once指令简单示例
Feb 29 Python
安装多个版本的TensorFlow的方法步骤
Apr 21 Python
解决Keras中Embedding层masking与Concatenate层不可调和的问题
Jun 18 Python
Python使用sys.exc_info()方法获取异常信息
Jul 23 Python
详解Python为什么不用设计模式
Jun 24 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
1982年日本摄影师镜头下的中国孩子 那无忧无虑的童年
2020/03/12 杂记
php中Session的生成机制、回收机制和存储机制探究
2014/08/19 PHP
Laravel 5 学习笔记
2015/03/06 PHP
PHP实现动态柱状图改进版
2015/03/30 PHP
PHP基于mssql扩展远程连接MSSQL的简单实现方法
2016/10/08 PHP
解放web程序员的输入验证
2006/10/06 Javascript
解读JavaScript代码 var ie = !-[1,] 最短的IE判定代码
2011/05/28 Javascript
javascript垃圾收集机制与内存泄漏详细解析
2013/11/11 Javascript
jQuery中:selected选择器用法实例
2015/01/04 Javascript
浅析JavaScript访问对象属性和方法及区别
2015/11/16 Javascript
HTML5游戏引擎LTweenLite实现的超帅动画效果(附demo源码下载)
2016/01/26 Javascript
基于javascript制作微博发布栏效果
2016/04/04 Javascript
简单理解Vue条件渲染
2016/12/03 Javascript
js仿iphone秒表功能 计算平均数
2017/01/11 Javascript
vue-router重定向不刷新问题的解决
2018/06/25 Javascript
JS将网址url转化为JSON格式的方法
2018/07/02 Javascript
使用webpack打包后的vue项目如何正确运行(express)
2018/10/26 Javascript
微信小程序实现同一页面取值的方法分析
2019/04/30 Javascript
Vue项目中配置pug解析支持
2019/05/10 Javascript
JS用最简单的方法实现四舍五入
2019/08/27 Javascript
[02:30]DOTA2英雄基础教程 暗影恶魔
2013/12/17 DOTA
浅谈Tensorflow由于版本问题出现的几种错误及解决方法
2018/06/13 Python
Python3爬虫教程之利用Python实现发送天气预报邮件
2018/12/16 Python
Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法
2019/06/05 Python
Python目录和文件处理总结详解
2019/09/02 Python
Python基础教程(一)——Windows搭建开发Python开发环境
2020/07/20 Python
学习Python需要哪些工具
2020/09/04 Python
萨克斯第五大道精品百货店: Saks Fifth Avenue
2017/04/28 全球购物
倡议书范文格式
2014/05/12 职场文书
交通志愿者活动总结
2014/06/27 职场文书
群众路线对照检查材料
2014/09/22 职场文书
个人委托书范文
2015/01/28 职场文书
工程项目经理岗位职责
2015/02/02 职场文书
医务人员岗前培训心得体会
2016/01/08 职场文书
《七律·长征》教学反思
2016/02/16 职场文书
python编程项目中线上问题排查与解决
2021/11/01 Python