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,一经查实,立即删除!

相关文章

使用ADF BC管理保存点

在使用ADF BC时&#xff0c;我们通常依赖于在数据库中执行DML操作的框架。 在DBTransaction提交周期内&#xff0c;该框架正确地在数据库中进行了所有必要的更新。 很酷的事情是&#xff0c;在这种情况下&#xff0c;数据库事务将被自动管理。 因此&#xff0c;如果出现问题&am…

sql优化(转)

(转)SQL 优化原则一、问题的提出 在应用系统开发初期&#xff0c;由于开发数据库数据比较少&#xff0c;对于查询SQL语句&#xff0c;复杂视图的的编写等体会不出SQL语句各种写法的性能优劣&#xff0c;但是如果将应用 系统提交实际应用后&#xff0c;随着数据库中数据的增加&a…

2017-12-04HTML table布局

<!DOCTYPE html> <html> <head lang"en"> <meta charset"UTF-8"> <title>table布局</title> </head> <body marginwidth"0px" marginheight"0px"> <table width"…

Java EE 8发生了什么? (第2部分)

Java EE 8的工作仍处于初期阶段&#xff0c;预计在来年会紧跟潮流&#xff0c;我们将看到专家组的形成完成&#xff0c;围绕用例/功能的更多讨论&#xff0c;许多JIRA&#xff0c;以及各种规范的草案版本&#xff08;本会很有趣&#xff01;&#xff09;。 在第1部分中 &#…

foreach语句的的解析

我这个虾米&#xff0c;今天才知道foreach语句是这样解析的&#xff0c;惭愧啊&#xff01;幸好我最新在原生态的学习这门编程语言。 //程序中我们这样写foreachforeach (Person item in Persons){Console.WriteLine(item);} //其实如果要使用foreach,需要实现IEnumerator接口&…

滚动条位置判断

//获取滚动条距离顶部位置function getScrollTop() { var scrollTop 0; if (document.documentElement && document.documentElement.scrollTop) { scrollTop document.documentElement.scrollTop; } else if (document.body) { scrollTop d…

如何处理Java注释

Java 8的很酷的新功能之一就是对lambda表达式的支持。 Lambda表达式在很大程度上依赖于FunctionalInterface 注释 。 在本文中&#xff0c;我们将介绍注释以及如何处理它们&#xff0c;以便您可以实现自己的出色功能。 注解 Java 5中添加了注释 。Java语言附带了一些预定义的…

(转)MFC技巧学习五

51. 如何获得其他程序的图标,并显示在View中 [问题提出] 有的时候,如:类资源管理器会遇到获得程序图标并显示的操作,如何实现呢? [解决方法] SDK函数SHGetFileInfo来获得有关文件的很多信息:如大小图标,属性,类型等.  [程序实现] 建立名为My的SDI工程.在OnPaint()函数中…

使用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个实质性页面。 前言 在序言中…

Oracle ORA-07445 [evaopn3()+384] 错误 分析

1.OS 和 DB 版本Oracle Version&#xff1a; 11.2.0.2Operation System&#xff1a;HP-UXItanium 11.312.Alert log中信息Tue Oct 16 22:27:31 2012Exception [type: SIGSEGV,Address not mapped to object] [ADDR:0xC00000000] [PC:0x400000000631B880,evaopn3()384] [flags: …

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% 对于商务网…

玩Java并发

最近&#xff0c;我需要将一些文件&#xff08;每个文件都有JSON格式的对象列表&#xff08;数组&#xff09;&#xff09;转换为每个文件都具有相同数据&#xff08;对象&#xff09;的分隔行的文件。 这是一次性的任务&#xff0c;很简单。 我使用Java nio的某些功能进行了读…

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格…

sound

sound类在 flash3.0中算是很常见的功能&#xff0c;也是很常用的&#xff0c;下面 简单的运用了 sound类&#xff0c;加载了一首歌&#xff0c;控制 播放 暂停 停止&#xff0c;和控制音量大小&#xff1b; package {import flash.display.MovieClip;import fl.controls.*;imp…

Java Lambdas和低延迟

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

HTTP协议/RTSP协议/RTMP协议的区别

RTSP、 RTMP、HTTP的共同点、区别 共同点&#xff1a; 1&#xff1a;RTSP RTMP HTTP都是在应用应用层。 2&#xff1a; 理论上RTSP RTMP HTTP都可以做直播和点播&#xff0c;但一般做直播用RTSP RTMP&#xff0c;做点播用HTTP。做视频会议的时候原来用SIP协议&#xff0c;现…

2013搜狗校园招聘笔试题

研习了Linux公社发布的2013搜狗校园招聘笔试题&#xff0c;还是有些收获的。 //第一题&#xff1a;以下程序的输出是___________________ class Base { public:Base(int j):i(j){}virtual ~Base(){}void func1(){i * 10; func2();}int getValue(){return i;} protected:virtual…