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发送邮件的实例代码(支持html、图片、附件)
Mar 04 Python
用Python编写一个简单的FUSE文件系统的教程
Apr 02 Python
Python运行报错UnicodeDecodeError的解决方法
Jun 07 Python
python中int与str互转方法
Jul 02 Python
详解Python3 中的字符串格式化语法
Jan 15 Python
在 Linux/Mac 下为Python函数添加超时时间的方法
Feb 20 Python
在keras中model.fit_generator()和model.fit()的区别说明
Jun 17 Python
Python基于callable函数检测对象是否可被调用
Oct 16 Python
Python高并发和多线程有什么关系
Nov 14 Python
BeautifulSoup中find和find_all的使用详解
Dec 07 Python
python和opencv构建运动检测器的实现
Mar 03 Python
Python接口自动化之文件上传/下载接口详解
Apr 05 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中register_globals参数为OFF和ON的区别(register_globals 使用详解)
2012/02/05 PHP
PHP页面间参数传递的四种方法详解
2013/06/09 PHP
thinkphp使用phpmailer发送邮件的方法
2014/11/24 PHP
ThinkPHP 404页面的设置方法
2015/01/14 PHP
WordPress中用于获取搜索表单的PHP函数使用解析
2016/01/05 PHP
javascript 获取select下拉列表值的代码
2009/09/07 Javascript
js中数组结合字符串实现查找(屏蔽广告判断url等)
2016/03/30 Javascript
json的使用小结
2016/06/08 Javascript
详解win7 cmd执行vue不是内部命令的解决方法
2017/07/27 Javascript
Angular中响应式表单的三种更新值方法详析
2017/08/22 Javascript
微信小程序实现折叠面板
2018/01/31 Javascript
我要点爆”微信小程序云开发之项目建立与我的页面功能实现
2019/05/26 Javascript
layui2.0使用table+laypage实现真分页
2019/07/27 Javascript
python正则表达式判断字符串是否是全部小写示例
2013/12/25 Python
Python实现115网盘自动下载的方法
2014/09/30 Python
详解Python发送邮件实例
2016/01/10 Python
Python爬虫爬取美剧网站的实现代码
2016/09/03 Python
Python获取当前路径实现代码
2017/05/08 Python
python+matplotlib绘制饼图散点图实例代码
2018/01/20 Python
几种实用的pythonic语法实例代码
2018/02/24 Python
Python使用百度翻译开发平台实现英文翻译为中文功能示例
2019/08/08 Python
python中类的输出或类的实例输出为这种形式的原因
2019/08/12 Python
Python scipy的二维图像卷积运算与图像模糊处理操作示例
2019/09/06 Python
Python object类中的特殊方法代码讲解
2020/03/06 Python
Appium+Python实现简单的自动化登录测试的实现
2021/01/26 Python
微软香港官网及网上商店:Microsoft HK
2016/09/01 全球购物
美国受欢迎的女性牛仔裤品牌:DL1961
2016/11/12 全球购物
Footshop乌克兰:运动鞋的最大选择
2019/12/01 全球购物
公司廉洁自律承诺书
2014/03/27 职场文书
《路旁的橡树》教学反思
2014/04/07 职场文书
中学生学雷锋演讲稿
2014/04/26 职场文书
国际贸易系求职信
2014/08/09 职场文书
高考升学宴答谢词
2015/01/20 职场文书
2016公务员年度考核评语
2015/12/01 职场文书
Vue OpenLayer测距功能的实现
2022/04/20 Vue.js
Python如何让字典保持有序排列
2022/04/29 Python