Python多篇新闻自动采集

  昨天用python写了一个天气预报采集,今天趁着兴头写个新闻采集的。

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

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

 

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

  根据上一篇文章的方法,可以简单地获取到整个主页的文本内容。

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

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

1 class parser(HTMLParser.HTMLParser):
2     def handle_starttag(self, tag, attrs):
3             if tag == 'a':
4             for attr, value in attrs:
5                 if attr == 'href':
6                     print value

  后来使用了SGMLParser,它就没有这个问题。

1 class URLParser(SGMLParser):       
2         def reset(self):
3                 SGMLParser.reset(self)
4                 self.urls = []
5  
6         def start_a(self,attrs):        
7                 href = [v for k,v in attrs if k=='href']          
8                 if href:
9                         self.urls.extend(href)

  SGMLParser针对某个标签都需要重载它的函数,这里是把所有的链接放到该类的urls里。

 1 lParser = URLParser()#分析器来的
 2 socket = urllib.urlopen("http://news.qq.com/")#打开这个网页
 3 
 4 fout = file('urls.txt', 'w')#要把链接写到这个文件里
 5 lParser.feed(socket.read())#分析啦
 6 
 7 reg = 'http://news.qq.com/a/.*'#这个是用来匹配符合条件的链接,使用正则表达式匹配
 8 pattern = re.compile(reg)
 9 
10 for url in lParser.urls:#链接都存在urls里
11     if pattern.match(url):
12         fout.write(url+'\n')
13 
14 fout.close()

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

 

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

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

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

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

  这里有几个新的用法:

 1 os.getcwd()#获得当前文件夹路径
 2 os.path.sep#当前系统路径分隔符(是这个叫法吗?)windows下是“\”,linux下是“/”
 3 
 4 #判断文件夹是否存在,如果不存在则新建一个文件夹
 5 if os.path.exists('newsdir') == False:
 6     os.makedirs('newsdir')
 7 
 8 #str()用来将某个数字转为字符串
 9 i = 5
10 str(i)

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

 

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

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

1 #这个是用来遍历某个文件夹的
2 for parent, dirnames, filenames in os.walk(dir):
3     for dirname in dirnames
4         print parent, dirname
5     for filename in filenames:
6         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>”等等。所以我再通过正则表达式将正文切片。

1 def func(str):#谁起的这个名字
2     strs = re.split("<style>.*?</style>|<script.*?>.*?</script>|&#[0-9]+;|<!--\[if !IE\]>.+?<!\[endif\]-->|<.*?>", str)#各种匹配,通过“|”分隔
3     ans = ''
4     #将切分的结果组合起来
5     for each in strs:
6         ans += each
7     return ans

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

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

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

  

  注意:

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

try:socket = urllib.urlopen(url)
except:continue

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

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

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

 

 

转载于:https://www.cnblogs.com/coltfoal/archive/2012/10/07/2714468.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/361213.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用navicat premium将数据库从Oracle迁移到SQL Server,或从Oracle迁移到MySQL

有时候我们有迁移数据库的需求&#xff0c;例如从Oracle迁移到SQL Server&#xff0c;或者从MySQL迁移到Oracle。 很多江湖好汉一时不知如何手工操作&#xff0c;所幸的是Navicat提供了迁移的自动化操作界面。 当然&#xff0c;Navicat的数据库迁移无法做到完美&#xff0c;一些…

书评:Mockito Essentials

Sujoy Acharya的Mockito Essentials副标题&#xff08; Packt Publishing &#xff0c;2014年10月&#xff09;是&#xff1a;“实用指南&#xff0c;可帮助您使用Mockito进行单元测试并开始运行。” Mockito Essentials中的前言和七章涵盖大约190个实质性页面。 前言 在序言中…

http网站转换成https网站

https&#xff0c;https的本地测试环境搭建,asp.net结合https的代码实现,http网站转换成https网站之后遇到的问题 一&#xff1a;什么是https SSL&#xff08;Security Socket Layer&#xff09;全称是加密套接字协议层&#xff0c;它位于HTTP协议层和TCP协议层之间&#x…

EAGER的获取是代码的味道

介绍 休眠获取策略确实可以使几乎没有爬网的应用程序和响应速度很快的应用程序有所不同。 在这篇文章中&#xff0c;我将解释为什么您应该选择基于查询的获取而不是全局获取计划。 取得101 Hibernate定义了四种关联检索策略 &#xff1a; 提取策略 描述 加入 原始SELECT语…

基于S2SH的电子商务网站系统性能优化

对于经常逛网页的人来说最受不了的事情就是访问的网页加载太慢&#xff0c;除去网络的原因网站的系统性能对加载的快慢非常重要&#xff0c; 网上有个统计&#xff1a; 每慢500ms Google访问量降低20% 每慢400ms Yahoo 访问量降低5-9% 每慢100ms Amazon销售额降低1% 对于商务网…

ExtJs的Reader

ExtJs的Reader Reader : 主要用于将proxy数据代理读取的数据按照不同的规则进行解析,讲解析好的数据保存到Modle中 结构图 Ext.data.reader.Reader 读取器的根类 Ext.data.reader.Json JSON格式的读取器 Ext.data.reader.Array 扩展JSON的Array读取器 Ext.data.reader.Xml XML格…

Java Lambdas和低延迟

总览 有关在Java和低延迟中使用Lambda的主要问题是&#xff1a; 它们会产生垃圾吗&#xff0c;您能做些什么吗&#xff1f; 背景 我正在开发一个支持不同有线协议的库。 这样的想法是&#xff0c;您可以描述要写入/读取的数据&#xff0c;并且有线协议确定它是否使用带有JSon或…

Java中的线程本地存储

开发人员中鲜为人知的功能之一是线程本地存储。 这个想法很简单&#xff0c;并且在需要数据的情况下很有用。 如果我们有两个线程&#xff0c;则它们引用相同的全局变量&#xff0c;但我们希望它们具有彼此独立初始化的单独值。 大多数主要的编程语言都有该概念的实现。 例如&…

多个退货单

我曾经听说过&#xff0c;过去人们为使方法具有单个出口点而奋斗。 我知道这是一种过时的方法&#xff0c;从未认为它特别值得注意。 但是最近&#xff0c;我与一些仍坚持该想法的开发人员进行了联系&#xff08;最后一次是在这里 &#xff09;&#xff0c;这让我开始思考。 因…

GO 语言编程 windows 环境搭建

参考 : http://blog.csdn.net/love_se/article/details/7754274 首先是安装Go&#xff0c;这里有很详细的安装说明&#xff0c;http://code.google.com/p/golang-china/wiki/Install 或者http://golang.org/doc/install 下面我们在window下面安装&#xff0c;google有提供win安…

机打发票打印管理

最近公司也从手写发票换成了机打发票&#xff0c;便应财务的要求做了这么一个简单的发票管理及打印系统&#xff0c;程序并不复杂。 使用C#&#xff08;2.0&#xff09; Access&#xff08;97-2003版&#xff09;/WinForm形式 系统菜单中有企业基本信息设置&#xff0c;见图4…

序列化的概念

讨论了为什么Optional不可序列化以及如何处理&#xff08;即将推出&#xff09;之后&#xff0c;让我们仔细看看序列化。 总览 这篇文章介绍了序列化的一些关键概念。 它尝试精简地执行此操作&#xff0c;而不会涉及太多细节&#xff0c;包括将建议降至最低。 它没有叙述&…

Java飞行记录器(JFR)

JFR是Java分析器&#xff0c;它使您可以研究代码的运行时特征。 通常&#xff0c;您将使用探查器来确定代码的哪些部分导致大量内存分配或导致消耗过多的CPU。 有很多产品在那里。 过去&#xff0c;我使用过YourKit&#xff0c;OptimizeIt&#xff0c;JProfiler&#xff0c;Ne…

图像识别SLIC、Haralick texture features(自备)

SLIC 简单线性迭代聚类(SLIC ),它采用k-means聚类方法来有效地生成超像素。 SLIC超像素分割详解&#xff08;一&#xff09;&#xff08;二&#xff09;&#xff08;三&#xff09;_超像素分割 样本-CSDN博客 超像素分割 & SLIC算法 & 使用示例_slic分割算法matlab-C…

浏览器中的JavaFX

浏览器中的JavaFX屏幕截图 最近&#xff0c;Carl Dea和我启动了一个新项目&#xff0c;将JavaFX 8引入浏览器。 今天&#xff0c;我想介绍我们创建的前两个概念验证&#xff0c;以查看该想法是否完全可行。 对于不耐烦的人&#xff0c;这里是到PoC的链接。 但请注意&#xff0…

MDB!= JMS,反之亦然

基本 消息驱动Bean&#xff08;又称为MDB&#xff09;只是另一个EJB&#xff0c;如无状态&#xff0c;有状态或单例。 使用MessageDriven批注指定。 MDB用于异步消息处理 它们与无状态EJB 相似 &#xff0c;因为它们都是由EJB容器池化的 但是&#xff0c;它们与无状态EJB不同…

周三的工作 张孝祖

今天的任务是主面板master嘿嘿 上头有几个按钮&#xff0c;登录登出&#xff0c;个人信息&#xff0c;注册注销等&#xff0c;他们是根据用户是否等率决定的 具体代码如下 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System…

CSS 垂直居中

1、使用绝对定位垂直居中 绝对对位原理&#xff1a;元素在过度受限情况下&#xff0c;将margin设置为auto&#xff0c;浏览器会重算margin的值&#xff0c;过度受限指的是同时设置top/bottom与height或者left/right与width。 .absolute_center{/*display:none;*/position:absol…

[ExtJs6] 环境搭建及创建项目

1. 环境搭建 sencha cmd 和 extjs6 sdk.sencha cmd: https://www.sencha.com/products/extjs/cmd-download/extjs6: https://www.sencha.com/sencha cmd 安装过程将其加入系统的环境变量path中。export PATH${PATH}:/Users/shuanggai/bin/Sencha/Cmd/6.2.2.36把改语句添加到 ~/…

通过Spring Integration和RabbitMQ获得高可用性的AMQP支持的消息通道

Spring Integration消息通道默认情况下将消息存储在内存中。 这是因为内存速度快&#xff0c;易于实现&#xff0c;并且不会增加网络成本。 但是&#xff0c;在某些情况下&#xff0c;这可能会引起问题&#xff0c;因为如果应用程序崩溃或服务器意外关闭&#xff0c;所有消息都…