python文章采集例子(爬取http://infoq.com)

优采云 发布时间: 2020-08-09 15:02

  写了个采集资源的小程序,原理:从上读取提供的RESS资源。然后按照资源中相关链接下载相应文章

  RESS地址:

  <br /> <br />- <br />- <br /> 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! <br /> http://www.infoq.com/cn/ <br /> 本 RSS Feed 是一个个性化定制的 Feed,对于您在 InfoQ.com 上的帐号(无论注册与否)都是唯一的。您可以从 InfoQ 网站左侧栏中的“您的社区”选项框内选择感兴趣的社区,此外您还可以通过关闭子话题和标签的方式过滤掉您不感兴趣的内容。您所做的选择将影响到本 RSS Feed 显示的新闻——新闻内容将和您在网站首页中央的新闻栏看见的内容保持一致。如果您的 RSS Feed 没有反映出这样的相关性,那么可能是因为您使用的 Feed 链接没有与您的 InfoQ 帐号相关联。为了确保您所使用的 Feed 的正确性,请先在 InfoQ 上注册,然后从网站左侧菜单中的“个性化 RSS”链接获取新的 RSS Feed URL。祝您使用愉快! <br />- <br />- <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br />- <br /> PetaPoco:适用于.NET的微型ORM <br /> http://www.infoq.com/cn/news/2011/06/petapoco <br /> >PetaPoco是一款适用于.NET应用程序的对象关系映射器(ORM, Object Relational Mapper)。与那些功能完备的ORM(如NHibernate或Entity Framework)不同的是,PetaPoco更注重易用性和性能,而非丰富的功能。使用PetaPoco只需要引入一个C#文件,可以使用强类型的POCO,并支持<br />.........<br />

  得到一个RESS的标准XML文档,然后解析XML得相关文章信息,再步入解析,最后下载图片,保存文章信息到MYSQL数据库中

  下面是代码:

  <br />#! /usr/bin/env python <br /># -*- coding: utf-8 -*- <br /><br />import urllib<br />import re,sys<br />import string<br />from xml.dom.minidom import parseString<br />from sgmllib import SGMLParser <br />import MySQLdb<br />reload(sys)<br />sys.setdefaultencoding('utf8')<br /><br /><br />class Constants():<br /> #站点<br /> HTML_SITE = "http://www.infoq.com";<br /> #聚体资源<br /> HTML_RESOURCE = HTML_SITE + "/cn/rss/rss.action?token=v4OEYqEXG7ltwOPp5IpH34Ky6WdtpXqz"; <br /> #数据库配置<br /> DB_HOST = "localhost" <br /> #数据库用户名<br /> DB_USER = "root"<br /> #数据库密码<br /> DB_PASSWORD = "root"<br /> #数据库<br /> DB_DATABASE = "test"<br /> #数据库连接编码集<br /> CHARSET = "utf8"<br /> #代理服务器<br /> PROXY_ADRESS = ""<br /> #代理用户名<br /> PROXY_USERNAME = ""<br /> #代理用户密码<br /> PROXY_PASSWORD = ""<br /> #图片本地保存路径<br /> IMG_LOCALDSTDIR = "E:/image/"<br /><br /><br /><br />class ListUrls(SGMLParser): <br /> def reset(self): <br /> self.imgs = [] <br /> SGMLParser.reset(self) <br /> def start_img(self, attrs): <br /> src = [v for k, v in attrs if k == 'src'] <br /> if src: <br /> self.imgs.extend(src)<br />#数据库工具类<br />class DBUTIL():<br /> def getConnectionDB(self):<br /> try:<br /> conn = MySQLdb.connect(host=Constants.DB_HOST, user=Constants.DB_USER, passwd=Constants.DB_PASSWORD, db=Constants.DB_DATABASE, charset=Constants.CHARSET)<br /> return conn<br /> except:<br /> print "EROOR: get ConnectionDB is FAIL"<br /><br />#文章对象用于从网站中爬取然后存储在DB中<br />class actrict():<br /> title = ''<br /> link = ''<br /> description = ''<br /> creator = ''<br /> createdate = ''<br /> identifier = ''<br /> content = ''<br /><br />class webcrawlerhttpurl(): <br /> #获取HTML内容 <br /> def getUrlInfo(self, weburl):<br /> try :<br /> #proxyConfig = 'http://%s:%s@%s' % (Constants.PROXY_USERNAME, Constants.PROXY_PASSWORD, Constants.PROXY_ADRESS)<br /> #inforMation = urllib.urlopen(weburl, proxies={'http':proxyConfig})<br /> inforMation = urllib.urlopen(weburl)<br /> #header = inforMation.info() <br /> #contentType = header.getheader('Content-Type') <br /> status = inforMation.getcode() <br /> if status == 200: <br /> html = inforMation.readlines() <br /> return html <br /> else:<br /> return 'ERROR: get web %s% is fail and status=%s' % (weburl, status);<br /> except:<br /> print 'ERROR: get web %s% is fail' % (weburl);<br /> finally:<br /> inforMation.close() <br /><br /> #解析HTML<br /> def parseHtml(self, html, link):<br /> try:<br /> #body是一个list,需要转成string<br /> document = ""<br /> for line in html:<br /> if line.split():<br /> document = document + line <br /> #title<br /> title = document[re.search("title>", document).end():] <br /> title = title[:re.search("title>", title).end() - 8]<br /><br /> #content<br /> content = document[re.search("box-content-5", document).end():]<br /> content = content[:re.search("bottom-corners", content).end()] <br /> content = document[re.search("", document).end():] <br /> content = content[:re.search("", content).end() - 33] <br /> content = content.replace("'", "\\'") <br /><br /> except:<br /> print 'ERROR:PARSEHTML IS FAIL %s' % (link) <br /> return content<br /> #解析RESS然后访问其中每个具体资源<br /> def parseRessXml(self, xml_file): <br /> #body是一个list,需要转成string<br /> document = ""<br /> for line in xml_file:<br /> document = document + line <br /> doc = parseString(document)<br /> pkgs = doc.getElementsByTagName("item") <br /> #遍历所有的资源地址<br /> i = 0;<br /> for pkg in pkgs:<br /> try:<br /> i = i + 1<br /> print '-------------------PARSE HTML (%s)-----------------' % (i)<br /> title = pkg.getElementsByTagName("title")<br /> title = self.getText(title[0].childNodes)<br /> link = pkg.getElementsByTagName("link")<br /> link = self.getText(link[0].childNodes)<br /> description = pkg.getElementsByTagName("description")<br /> description = self.getText(description[0].childNodes)<br /> creator = pkg.getElementsByTagName("dc:creator")<br /> creator = self.getText(creator[0].childNodes)<br /> createdate = pkg.getElementsByTagName("dc:date")<br /> createdate = self.getText(createdate[0].childNodes)<br /> identifier = pkg.getElementsByTagName("dc:identifier")<br /> identifier = self.getText(identifier[0].childNodes)<br /><br /> #判断文章是否已存在<br /> conn = DBUTIL().getConnectionDB()<br /> cur = conn.cursor() <br /> SQL = "SELECT COUNT(1) FROM ARTICLES WHERE identifier='%s'"%(identifier)<br /> cur.execute(SQL)<br /> alldata = cur.fetchall()<br /><br /> if alldata[0][0] != 0:<br /> print "Warning: DB already exist for this article"<br /> continue;<br /><br /> #解析Html返回文章内容<br /> content = self.parseHtml(self.getUrlInfo(link), link)<br /> #存储图片文件到本地<br /> lister = ListUrls()<br /> lister.feed(content)<br /> self.saveimg(lister.imgs)<br /><br /> for img in lister.imgs:<br /> content = content.replace(img,Constants.IMG_LOCALDSTDIR +"/" + img.split("/")[-1].split(";")[0])<br /><br /> #封装成actrict类<br /> actrict.title = title<br /> actrict.link = link<br /> actrict.identifier = identifier<br /> actrict.description = description<br /> actrict.createdate = createdate<br /> actrict.creator = creator<br /> actrict.content = content <br /> #进行存本地数据库<br /> self.putDB(actrict)<br /> except :<br /> print "ERROR: PARSE_XMLRESS IS FAIL%s" % (link)<br /><br /> #解析XML取字符<br /> def getText(self, nodelist):<br /> rc = ""<br /> for node in nodelist:<br /> if node.nodeType == node.TEXT_NODE:<br /> rc = rc + node.data<br /> return rc<br /> #保存图片文件<br /> def saveimg(self, imgs):<br /> for img in imgs :<br /> try:<br /> if string.find(img, 'http') != 0:<br /> img = Constants.HTML_SITE + img <br /> DstDir = Constants.IMG_LOCALDSTDIR <br /> imgPath = DstDir + img.split("/")[-1].split(";")[0]<br /> print imgPath <br /> File = open(imgPath, "wb") <br /> #proxyConfig = 'http://%s:%s@%s' % (Constants.PROXY_USERNAME, Constants.PROXY_PASSWORD, Constants.PROXY_ADRESS)<br /> #inforMation = urllib.urlopen(img, proxies={'http':proxyConfig})<br /> inforMation = urllib.urlopen(img)<br /> jpg = inforMation.read()<br /> File.write(jpg)<br /> print("INFO: SAVE IMG:" + imgPath)<br /> except :<br /> print "ERROR: SAVA IMG IS FAIL:%s" % (img)<br /> finally:<br /> inforMation.close()<br /> File.close()<br /><br /> #存储DB<br /> def putDB(self, actrict):<br /> title = actrict.title<br /> link = actrict.link<br /> identifier = actrict.identifier<br /> description = actrict.description<br /> createdate = actrict.createdate<br /> creator = actrict.creator<br /> content = actrict.content<br /> print title<br /> try: <br /> conn = DBUTIL().getConnectionDB()<br /> cur = conn.cursor() <br /> SQL = "INSERT INTO ARTICLES(title,link,identifier,description,createdate,creator,content)VALUES\<br /> ('%s','%s','%s','%s','%s','%s','%s')" % (title, link, identifier, description, createdate, creator, content)<br /> cur.execute(SQL)<br /> conn.commit()<br /> print "INFO: SAVE ACTRICT IS SUCCESSFUL"<br /> except :<br /> print "ERROR: SAVE ACTRICT IS FAIL"<br /> finally: <br /> cur.close() <br /> conn.close()<br /><br /><br /><br />if __name__ == "__main__":<br /> webcrawler = webcrawlerhttpurl();<br /> xml_file = webcrawler.getUrlInfo(Constants.HTML_RESOURCE) <br /> webcrawler.parseRessXml(xml_file)<br /><br /><br />'''<br /> CREATE TABLE `ARTICLES` (<br /> `id` int(11) NOT NULL AUTO_INCREMENT,<br /> `title` varchar(500) DEFAULT NULL COMMENT '文章标题',<br /> `link` varchar(500) DEFAULT NULL COMMENT '文章完整链接',<br /> `description` varchar(5000) DEFAULT NULL COMMENT '描述信息',<br /> `creator` varchar(200) DEFAULT NULL COMMENT '作者',<br /> `createdate` varchar(200) DEFAULT NULL COMMENT '发布时间',<br /> `identifier` varchar(500) DEFAULT NULL COMMENT '关键字,用于区分文章是否已存在',<br /> `content` longtext COMMENT '内容',<br /> PRIMARY KEY (`id`)<br />) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8<br />'''<br /><br />

  ------------------------------

  

  提供源码下载:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线