- 浏览: 118037 次
- 性别:
- 来自: 成都
最新评论
-
sp42:
Oracle 不是很吊的么,怎么连个分页都这么麻烦?
数据库分页大全(oracle利用解析函数row_number高效分页) -
metarnetyflu:
不知道哪里快了!!!over()是最慢的,rownum其次,r ...
数据库分页大全(oracle利用解析函数row_number高效分页) -
wfd0807:
09年发的博文,五年了,一定影响到了不少人。首先,你描述的三层 ...
数据库分页大全(oracle利用解析函数row_number高效分页) -
diyunpeng:
学习了,写的不错。
python urlOpen使用代理 -
qepwqnp:
帖子沉的好深,涝起来
js_自己封装一个可查询frame中对象的一个方法
写了个采集http://infoq.com资源的小程序,原理:从infoq.com上读取提供的RESS资源。然后根据资源中相关链接下载相应文章
RESS地址:http://www.infoq.com/cn/rss/rss.action?token=v4OEYqEXG7ltwOPp5IpH34Ky6WdtpXqz
得到一个RESS的标准XML文档,然后解析XML得相关文章信息,再进入解析,最后下载图片,保存文章信息到MYSQL数据库中
下面是代码:
------------------------------
提供源码下载:
RESS地址:http://www.infoq.com/cn/rss/rss.action?token=v4OEYqEXG7ltwOPp5IpH34Ky6WdtpXqz
<?xml version="1.0" encoding="UTF-8" ?> - <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:dc="http://purl.org/dc/elements/1.1/"> - <channel rdf:about="http://www.infoq.com/cn/"> <title>未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级!</title> <link>http://www.infoq.com/cn/</link> <description>本 RSS Feed 是一个个性化定制的 Feed,对于您在 InfoQ.com 上的帐号(无论注册与否)都是唯一的。您可以从 InfoQ 网站左侧栏中的“您的社区”选项框内选择感兴趣的社区,此外您还可以通过关闭子话题和标签的方式过滤掉您不感兴趣的内容。您所做的选择将影响到本 RSS Feed 显示的新闻——新闻内容将和您在网站首页中央的新闻栏看见的内容保持一致。如果您的 RSS Feed 没有反映出这样的相关性,那么可能是因为您使用的 Feed 链接没有与您的 InfoQ 帐号相关联。为了确保您所使用的 Feed 的正确性,请先在 InfoQ 上注册,然后从网站左侧菜单中的“个性化 RSS”链接获取新的 RSS Feed URL。祝您使用愉快!</description> - <items> - <rdf:Seq> <rdf:li resource="http://www.infoq.com/cn/news/2011/06/petapoco" /> <rdf:li resource="http://www.infoq.com/cn/news/2011/06/Scale-ASPNet-Apps" /> <rdf:li resource="http://www.infoq.com/cn/articles/ck-explore-test-mistakes" /> <rdf:li resource="http://www.infoq.com/cn/news/2011/06/NativeDriver" /> <rdf:li resource="http://www.infoq.com/cn/news/2011/06/Premailer" /> <rdf:li resource="http://www.infoq.com/cn/news/2011/06/learning-from-history" /> <rdf:li resource="http://www.infoq.com/cn/news/2011/06/github-mac" /> <rdf:li resource="http://www.infoq.com/cn/articles/cf-java-object-serialization-rmi" /> <rdf:li resource="http://www.infoq.com/cn/news/2011/06/Win8-Doubt" /> <rdf:li resource="http://www.infoq.com/cn/presentations/lcm-javaee-7-reaching-cloud" /> <rdf:li resource="http://www.infoq.com/cn/articles/raw-notes-redmond" /> <rdf:li resource="http://www.infoq.com/cn/news/2011/06/collective-ownership-bad" /> <rdf:li resource="http://www.infoq.com/cn/news/2011/06/swarchbooks2011" /> <rdf:li resource="http://www.infoq.com/cn/news/2011/06/Micro-42-Beta" /> <rdf:li resource="http://www.infoq.com/cn/articles/wl-silverlight-query" /> </rdf:Seq> </items> </channel> - <item rdf:about="http://www.infoq.com/cn/news/2011/06/petapoco"> <title>PetaPoco:适用于.NET的微型ORM</title> <link>http://www.infoq.com/cn/news/2011/06/petapoco</link> <description>>PetaPoco是一款适用于.NET应用程序的对象关系映射器(ORM, Object Relational Mapper)。与那些功能完备的ORM(如NHibernate或Entity Framework)不同的是,PetaPoco更注重易用性和性能,而非丰富的功能。使用PetaPoco只需要引入一个C#文件,可以使用强类型的POCO,并支持 .........
得到一个RESS的标准XML文档,然后解析XML得相关文章信息,再进入解析,最后下载图片,保存文章信息到MYSQL数据库中
下面是代码:
#! /usr/bin/env python # -*- coding: utf-8 -*- import urllib import re,sys import string from xml.dom.minidom import parseString from sgmllib import SGMLParser import MySQLdb reload(sys) sys.setdefaultencoding('utf8') class Constants(): #站点 HTML_SITE = "http://www.infoq.com"; #聚体资源 HTML_RESOURCE = HTML_SITE + "/cn/rss/rss.action?token=v4OEYqEXG7ltwOPp5IpH34Ky6WdtpXqz"; #数据库配置 DB_HOST = "localhost" #数据库用户名 DB_USER = "root" #数据库密码 DB_PASSWORD = "root" #数据库 DB_DATABASE = "test" #数据库连接编码集 CHARSET = "utf8" #代理服务器 PROXY_ADRESS = "" #代理用户名 PROXY_USERNAME = "" #代理用户密码 PROXY_PASSWORD = "" #图片本地保存路径 IMG_LOCALDSTDIR = "E:/image/" class ListUrls(SGMLParser): def reset(self): self.imgs = [] SGMLParser.reset(self) def start_img(self, attrs): src = [v for k, v in attrs if k == 'src'] if src: self.imgs.extend(src) #数据库工具类 class DBUTIL(): def getConnectionDB(self): try: conn = MySQLdb.connect(host=Constants.DB_HOST, user=Constants.DB_USER, passwd=Constants.DB_PASSWORD, db=Constants.DB_DATABASE, charset=Constants.CHARSET) return conn except: print "EROOR: get ConnectionDB is FAIL" #文章对象用于从网站中爬取然后存储在DB中 class actrict(): title = '' link = '' description = '' creator = '' createdate = '' identifier = '' content = '' class webcrawlerhttpurl(): #获取HTML内容 def getUrlInfo(self, weburl): try : #proxyConfig = 'http://%s:%s@%s' % (Constants.PROXY_USERNAME, Constants.PROXY_PASSWORD, Constants.PROXY_ADRESS) #inforMation = urllib.urlopen(weburl, proxies={'http':proxyConfig}) inforMation = urllib.urlopen(weburl) #header = inforMation.info() #contentType = header.getheader('Content-Type') status = inforMation.getcode() if status == 200: html = inforMation.readlines() return html else: return 'ERROR: get web %s% is fail and status=%s' % (weburl, status); except: print 'ERROR: get web %s% is fail' % (weburl); finally: inforMation.close() #解析HTML def parseHtml(self, html, link): try: #body是一个list,需要转成string document = "" for line in html: if line.split(): document = document + line #title title = document[re.search("title>", document).end():] title = title[:re.search("title>", title).end() - 8] #content content = document[re.search("box-content-5", document).end():] content = content[:re.search("bottom-corners", content).end()] content = document[re.search("<!-- AddThis Button END -->", document).end():] content = content[:re.search("<script type='text/javascript'>", content).end() - 33] content = content.replace("'", "\\'") except: print 'ERROR:PARSEHTML IS FAIL %s' % (link) return content #解析RESS然后访问其中每个具体资源 def parseRessXml(self, xml_file): #body是一个list,需要转成string document = "" for line in xml_file: document = document + line doc = parseString(document) pkgs = doc.getElementsByTagName("item") #遍历所有的资源地址 i = 0; for pkg in pkgs: try: i = i + 1 print '-------------------PARSE HTML (%s)-----------------' % (i) title = pkg.getElementsByTagName("title") title = self.getText(title[0].childNodes) link = pkg.getElementsByTagName("link") link = self.getText(link[0].childNodes) description = pkg.getElementsByTagName("description") description = self.getText(description[0].childNodes) creator = pkg.getElementsByTagName("dc:creator") creator = self.getText(creator[0].childNodes) createdate = pkg.getElementsByTagName("dc:date") createdate = self.getText(createdate[0].childNodes) identifier = pkg.getElementsByTagName("dc:identifier") identifier = self.getText(identifier[0].childNodes) #判断文章是否已存在 conn = DBUTIL().getConnectionDB() cur = conn.cursor() SQL = "SELECT COUNT(1) FROM ARTICLES WHERE identifier='%s'"%(identifier) cur.execute(SQL) alldata = cur.fetchall() if alldata[0][0] != 0: print "Warning: DB already exist for this article" continue; #解析Html返回文章内容 content = self.parseHtml(self.getUrlInfo(link), link) #存储图片文件到本地 lister = ListUrls() lister.feed(content) self.saveimg(lister.imgs) for img in lister.imgs: content = content.replace(img,Constants.IMG_LOCALDSTDIR +"/" + img.split("/")[-1].split(";")[0]) #封装成actrict类 actrict.title = title actrict.link = link actrict.identifier = identifier actrict.description = description actrict.createdate = createdate actrict.creator = creator actrict.content = content #进行存本地数据库 self.putDB(actrict) except : print "ERROR: PARSE_XMLRESS IS FAIL%s" % (link) #解析XML取字符 def getText(self, nodelist): rc = "" for node in nodelist: if node.nodeType == node.TEXT_NODE: rc = rc + node.data return rc #保存图片文件 def saveimg(self, imgs): for img in imgs : try: if string.find(img, 'http') != 0: img = Constants.HTML_SITE + img DstDir = Constants.IMG_LOCALDSTDIR imgPath = DstDir + img.split("/")[-1].split(";")[0] print imgPath File = open(imgPath, "wb") #proxyConfig = 'http://%s:%s@%s' % (Constants.PROXY_USERNAME, Constants.PROXY_PASSWORD, Constants.PROXY_ADRESS) #inforMation = urllib.urlopen(img, proxies={'http':proxyConfig}) inforMation = urllib.urlopen(img) jpg = inforMation.read() File.write(jpg) print("INFO: SAVE IMG:" + imgPath) except : print "ERROR: SAVA IMG IS FAIL:%s" % (img) finally: inforMation.close() File.close() #存储DB def putDB(self, actrict): title = actrict.title link = actrict.link identifier = actrict.identifier description = actrict.description createdate = actrict.createdate creator = actrict.creator content = actrict.content print title try: conn = DBUTIL().getConnectionDB() cur = conn.cursor() SQL = "INSERT INTO ARTICLES(title,link,identifier,description,createdate,creator,content)VALUES\ ('%s','%s','%s','%s','%s','%s','%s')" % (title, link, identifier, description, createdate, creator, content) cur.execute(SQL) conn.commit() print "INFO: SAVE ACTRICT IS SUCCESSFUL" except : print "ERROR: SAVE ACTRICT IS FAIL" finally: cur.close() conn.close() if __name__ == "__main__": webcrawler = webcrawlerhttpurl(); xml_file = webcrawler.getUrlInfo(Constants.HTML_RESOURCE) webcrawler.parseRessXml(xml_file) ''' CREATE TABLE `ARTICLES` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(500) DEFAULT NULL COMMENT '文章标题', `link` varchar(500) DEFAULT NULL COMMENT '文章完整链接', `description` varchar(5000) DEFAULT NULL COMMENT '描述信息', `creator` varchar(200) DEFAULT NULL COMMENT '作者', `createdate` varchar(200) DEFAULT NULL COMMENT '发布时间', `identifier` varchar(500) DEFAULT NULL COMMENT '关键字,用于区分文章是否已存在', `content` longtext COMMENT '内容', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 '''
------------------------------
提供源码下载:
发表评论
-
字节顺序大端模式Big Endian
2023-12-22 16:57 2101大端模式和小端模式是描述多字节数据在存储时的字节顺序的两种方 ... -
mediawiki 如何开发特殊页面
2015-04-01 14:56 1161Mediawiki特殊页面开发步骤 1 页面显示名字设 ... -
mediawiki 实现ajax请求及demo
2015-04-01 14:36 1036实现方案为使用mediawiki 的api。 1.前台 ... -
mediawiki1.24源码分析(一)
2015-04-01 14:31 0所有分析说明采用文字使用浅红色、小四号楷体。 Index ... -
Mysql ERROR 1040 (00000): Too many connections
2013-09-23 16:38 1726程序添加数据库数据:错误信息: com.mysql. ... -
解决AJAX传输到后台时中文乱码问题
2011-09-14 08:49 1846var urlPaging = "中间信息&qu ... -
Webservices手写客户端调用
2011-08-11 14:08 1376客户端调用 // 实例化IS ... -
一键搞定python连接mysql驱动问题(windows版本)
2011-06-21 17:49 2421对于mysql驱动问题折腾了一下午,现共享出解决方案 1:手动 ... -
python爬虫抓站技巧
2011-06-19 20:20 2305本文章部分内容为转载----- 本人学习python中,用得最 ... -
python urlOpen使用代理
2011-06-17 17:42 9829利用urllib包 import urllib prox ... -
TypeError: 'str' object is not callable
2011-06-17 14:25 8591weburl = 'xyz' print " ... -
Eclipse 如何本地进行远程调试
2011-06-16 11:42 2048步骤:(无法上传图片) 1 确保TOMCAT在DEBUG模 ... -
js_自己封装一个可查询frame中对象的一个方法
2011-01-20 16:34 1423说明 用途: 查询当前页面以及所包含的frame中id为传入 ... -
在Eclipse中启动tomcat,并指定启动目录
2011-01-11 16:44 1524我们会有这样的需求:为了工程结构统层次清晰,在开发时不将工程定 ... -
ORACLE VARCHAR 排序问题
2010-06-24 16:31 4091为了实现varchar型的字段序号递增,我每次插入数据要先找出 ... -
SQL 连接 JOIN 例解。(左连接,右连接,全连接,内连接,交叉连接,自连接)
2009-09-09 22:11 1587SQL 连接 JOIN 例解。( ... -
利用properties资源文件追加写入,而不覆盖
2009-08-14 09:11 4968利用properties资源文件追加写入,而不覆盖 Prop ... -
Spring+AspectJ采用注释做申明式事务(手工山寨版)
2009-06-07 10:56 1115建立表 DROP TABLE t_book; CRE ... -
数据库分页大全(oracle利用解析函数row_number高效分页)
2009-05-24 16:50 15268数据库分页大全(oracle利用解析函数row_number高 ... -
jdbc优化[手工原创]
2009-04-16 21:26 1327java 与oracle数据库效率优化 @java 方面 ...
相关推荐
描述中的链接则指向了InfoQ网站上的一篇博客,作者为yanxinfeng,但未给出具体的文章主题。 由于提供的信息有限,我将基于"CRM完整数据库脚本.sql"这个文件名来生成相关知识点。SQL脚本通常是用于创建、修改或操作...
[Infoq]私有云之殇:公有云这座大山(上)http://www.infoq.com/cn/articles/ZStack-PartI [Infoq]为私有云结庐而做“隆中对”(下)http://www.infoq.com/cn/articles/ZStack-PartII ...
6. InfoQ (https://www.infoq.com/) InfoQ是一个全面的技术资讯平台,发布最新的技术趋势、实践和大会报道,包括Java领域。 7. Baeldung (https://www.baeldung.com/) Baeldung是一个深入的Java教程网站,涵盖了...
深入浅出Node.js(二):Node.js&NPM的安装与配置-http://www.infoq.com/cn/articles/nodejs-npm-install-config 2.NPM的命令: (1).unstall:npm unstall -g grunt-cli 3.环境变量: D:\Program Files\nodejs\; D:\...
http://www.infoq.com/presentations/scaling-operations-facebook https://ops-school.readthedocs.org/en/latest/config_management.html http://www.damnsmalllinux.org/income-guide/intro.html ops ...
InfoQ下载器 从Infoq下载演讲,以离线查看。 先决条件 您将需要有上述或 。...casper ./lib/infoq-casper.js http://www.infoq.com/presentations/a-presentation-name 如果您更喜欢SlimerJS,请尝试以下方法: cas
ARCore / ARKit学习资料ARCore-ARKit技术ARCore / ARKit学习资料官方文档Google ARCore:https://www.infoq.cn/article/1jwL4NOhehcEJgvh-KDI Apple ARKit:https://developer.apple.com/augmented-reality /关于...
本资源为文档PDF:郑华 - Hulu推荐系统构建经验谈 视频网址:http://www.infoq.com/cn/presentations/hulu-recommendation-system-construction-experiences/
国内用户可以访问gitee大规模仓库: ://gitee.com/cnperl/Nightingale,非实时同步,每天一次,不过速度很快。 夜莺简介 夜莺是一套分布式高可用的运维监控系统,...二次开发: ://xie.infoq.cn/article/30d37e98fbe5
这个链接指向了InfoQ中国(iteye)上的一个博客文章,通常这里会包含有关IT技术、编程技巧或者某个特定话题的讨论,但由于无法直接访问这个链接,我们无法获取具体信息。 标签“源码”和“工具”暗示了可能涉及的...
除了上述网站,还有许多其他的学习资源,如Stack Overflow、GitHub、Oracle Developer Network (OTN)、JavaWorld、InfoQ等,它们都提供了大量的技术问答、源码示例、文章和讨论,可以帮助开发者解决问题,学习新的...
nodejs学习记录学习路径初级开发者要求:能基于koa/express 开发基本的web服务学习材料:【强烈推荐】博文共赏:Node.js 静态文件服务器实战 https://www.infoq.cn/article/2011/11/tyq-nodejs-static-file-server...
Architect-200908-by-InfoQ.pdf,Architect-200908-by-InfoQ.pdfArchitect-200908-by-InfoQ.pdf
http://www.cnblogs.com/WormCanFly/archive/2009/09/17/1568668.html#2045847 09年的刚刚工作时用到的技术,仅供大家参考。今天发现还有人来下载,特地改成免费的。 内容源码
2. **技术社区**:如[InfoQ](https://www.infoq.com/cn/)、[CSDN](https://www.csdn.net/)等,参与技术讨论,获取最新资讯。 3. **专业论坛**:如[IBM developerWorks](https://www.ibm.com/developerworks/)、...