Python项目完成
今天,来对之前自学python做的一个小任务进行复习和总结,首先回顾之前任务的每一个步骤,按照自己个人的思路,一布一步往下做
需求:根据主网站,爬取出大连市各年地区生产总值,观察2010至2015年的趋势
1.获取网页html源码
2.根据html源码解析a标签
3.对a标签进行筛选,返回对应的a标签文本和url字典
4.分别进入各个url网页,解析网页文本内容
5.利用正则提取网页感兴趣的信息
6.将处理后的信息存数据库
第一步:根据url获取主网页源代码
代码如下:
- import urllib2
- import re
- import pymssql
- import time
- from sgmllib import SGMLParser
- #获取页面的html
- def getHTML(url):
- request = urllib2.Request(url)
- response = urllib2.urlopen(request)
- html = response.read()
- return html
- html = getHTML("http://www.stats.dl.gov.cn/index.php?m=content&c=index&a=lists&catid=52")
- print html
第二部:根据html源码解析a标签
代码如下:
- import urllib2
- import re
- import pymssql
- import time
- import datetime
- from sgmllib import SGMLParser
- #获取网络页面
- def getHTML(url):
- request = urllib2.Request(url)
- response = urllib2.urlopen(request)
- html = response.read()
- return html
- #获取完整连接内容整个网页包含a标签的内容
- def findLinks3(html):
- l = []
- urls = re.findall(r"<a.*?href=.*?<\/a>",html,re.I|re.S|re.M)
- for i in urls:
- l.append(i)
- return l
- html = getHTML("http://www.stats.dl.gov.cn/index.php?m=content&c=index&a=lists&catid=52")
- l = findLinks3(html)
- for val in l:
- print val
第三布:对a标签进行筛选,返回对应的a标签文本和url字典
- import urllib2
- import re
- import pymssql
- import time
- import datetime
- from sgmllib import SGMLParser
- #获取网络页面
- def getHTML(url):
- request = urllib2.Request(url)
- response = urllib2.urlopen(request)
- html = response.read()
- return html
- #进行模糊筛选(对字符串进行模糊查找,判断是否存在)
- def choose(html):
- a = -1
- if html.find("大连市国民经济和社会发展") == -1:
- a=-1
- else:
- a=1
- return a
- #获取完整连接内容整个网页包含a标签的内容(有筛选)
- def findLinks3(html):
- l = []
- urls = re.findall(r"<a.*?href=.*?<\/a>",html,re.I|re.S|re.M)
- for i in urls:
- if choose(i)==1:
- l.append(i)
- return l
- html = getHTML("http://www.stats.dl.gov.cn/index.php?m=content&c=index&a=lists&catid=52")
- l = findLinks3(html)
- for val in l[1:]:
- print val
- import urllib2
- import re
- import pymssql
- import time
- import datetime
- from sgmllib import SGMLParser
- #获取网络页面
- def getHTML(url):
- request = urllib2.Request(url)
- response = urllib2.urlopen(request)
- html = response.read()
- return html
- #进行模糊筛选(对字符串进行模糊查找,判断是否存在)
- def choose(html):
- a = -1
- if html.find("大连市国民经济和社会发展") == -1:
- a=-1
- else:
- a=1
- return a
- #获取完整连接内容整个网页包含a标签的内容(有筛选)
- def findLinks3(html):
- l = []
- urls = re.findall(r"<a.*?href=.*?<\/a>",html,re.I|re.S|re.M)
- for i in urls:
- if choose(i)==1:
- l.append(i)
- return l
- #获取a标签文本内容
- def findLinks1(html):
- text = []
- txts = re.findall(r"<a.*?>(.*?)<\/a>",html,re.I|re.S|re.M)
- for i in txts:
- if choose(i)==1:
- #print i
- text.append(i)
- return text[0]
- #只获取<a>标签链接href中的url<a href="www.www.com"></a>
- def findLinks2(html):
- url = []
- txts = re.findall("(?<=href=\").+?(?=\")|(?<=href=\').+?(?=\')",html,re.I|re.S|re.M)
- for i in txts:
- #print i
- url.append(i)
- return url[0]
- def getEveryYear(html):
- yearUrl ={} #定义空的字典,
- l = findLinks3(html) #查找所有超链接
- for i in l[1:]:
- text = findLinks1(i)
- url = findLinks2(i)
- yearUrl[text]=url #将超链接文本和url存放在字典中(key-value)
- #print text
- #print url
- return yearUrl
- html = getHTML("http://www.stats.dl.gov.cn/index.php?m=content&c=index&a=lists&catid=52")
- """
- l = findLinks3(html)
- for val in l[1:]:
- pass
- print findLinks1(val)
- print findLinks2(val)
- """
- d = getEveryYear(html)
- for val,key in d.items():
- print val
- print key
第四 、五:分别进入各个url,提取信息
- import urllib2
- import re
- import pymssql
- import time
- import datetime
- from sgmllib import SGMLParser
- #获取网络页面
- def getHTML(url):
- request = urllib2.Request(url)
- response = urllib2.urlopen(request)
- html = response.read()
- return html
- #进行模糊筛选(对字符串进行模糊查找,判断是否存在)
- def choose(html):
- a = -1
- if html.find("大连市国民经济和社会发展") == -1:
- a=-1
- else:
- a=1
- return a
- #获取完整连接内容整个网页包含a标签的内容(有筛选)
- def findLinks3(html):
- l = []
- urls = re.findall(r"<a.*?href=.*?<\/a>",html,re.I|re.S|re.M)
- for i in urls:
- if choose(i)==1:
- l.append(i)
- return l
- #获取a标签文本内容
- def findLinks1(html):
- text = []
- txts = re.findall(r"<a.*?>(.*?)<\/a>",html,re.I|re.S|re.M)
- for i in txts:
- if choose(i)==1:
- #print i
- text.append(i)
- return text[0]
- #只获取<a>标签链接href中的url<a href="www.www.com"></a>
- def findLinks2(html):
- url = []
- txts = re.findall("(?<=href=\").+?(?=\")|(?<=href=\').+?(?=\')",html,re.I|re.S|re.M)
- for i in txts:
- #print i
- url.append(i)
- return url[0]
- def getEveryYear(html):
- yearUrl ={} #定义空的字典,
- l = findLinks3(html) #查找所有超链接
- for i in l[1:]:
- text = findLinks1(i)
- url = findLinks2(i)
- yearUrl[text]=url #将超链接文本和url存放在字典中(key-value)
- #print text
- #print url
- return yearUrl
- """
- for val in l[1:]:
- pass
- print findLinks1(val)
- print findLinks2(val)
- d = getEveryYear(html)
- for val,key in d.items():
- print val
- # print key
- """
- class GetIdList(SGMLParser):
- def reset(self):
- self.IDlist = []
- self.flag = False
- self.getdata = False
- self.verbatim = 0
- SGMLParser.reset(self)
- def start_div(self, attrs):
- if self.flag == True:
- self.verbatim +=1 #进入子层div了,层数加1
- return
- for k,v in attrs: #遍历div的所有属性以及其值
- if k == 'class' and v == 'newsBody':#确定进入了<div class='newsBody'>
- self.flag = True
- return
- def end_div(self):#遇到</div>
- if self.verbatim == 0:
- self.flag = False
- if self.flag == True:#退出子层div了,层数减1
- self.verbatim -=1
- def start_p(self, attrs):
- if self.flag == False:
- return
- self.getdata = True
- def end_p(self):#遇到</p>
- if self.getdata:
- self.getdata = False
- def handle_data(self, text):#处理文本
- if self.getdata:
- self.IDlist.append(text)
- def printID(self):
- for i in self.IDlist:
- ##print i
- pass
- return self.IDlist
- def printtext(url):
- html = getHTML(url)
- lister = GetIdList()
- lister.feed(html)
- l = lister.printID()
- s=" "
- for text in l:
- s=s+text
- return s[0:500]
- def matchRe2(string):
- pattern = re.compile(r'([0-9]{1,5}.[0-9])亿元')
- #pat = re.compile(r'比上年增长[0-9]{1,5}.[0-9]%')
- #pat1 = re.compile(r'第一产业增加值[0-9]{1,5}.[0-9]亿元')
- match = pattern.search(string)
- if match:
- pass
- #print "ok"
- #print match.group(0)
- #print '国民经济生产总值:', pattern.search(string).group()
- # print pat1.search(string).group()
- #print re.compile(r'现将.*年大连市国民经济和社会发展情况公报如下').search(string).group()
- # print re.compile(r'第三产业增加值[0-9]{1,5}.[0-9]亿元').search(string).group()
- else:
- print 'No match!'
- return pattern.search(string).group()
- def getData(html):
- data = {}
- d = getEveryYear(html)
- for key,value in d.items():
- #print key #,value
- #download3(value,key)
- s=printtext(value)
- #print s
- #matchRe2(s[20:80])
- data[key]= matchRe2(s)
- return data
- html = getHTML("http://www.stats.dl.gov.cn/index.php?m=content&c=index&a=lists&catid=52")
- d = getEveryYear(html)
- #打印出所有文本内容
- """
- for key,val in d.items():
- #print val
- #print key
- s = printtext(val)
- print s
- """
- data = getData(html)
- for val,key in data.items():
- print val,key
第六步:存数据库
- # -*- coding: cp936 -*-
- import urllib2
- import re
- import pymssql
- import time
- import datetime
- from sgmllib import SGMLParser
- #获取网络页面
- def getHTML(url):
- request = urllib2.Request(url)
- response = urllib2.urlopen(request)
- html = response.read()
- return html
- #进行模糊筛选(对字符串进行模糊查找,判断是否存在)
- def choose(html):
- a = -1
- if html.find("大连市国民经济和社会发展") == -1:
- a=-1
- else:
- a=1
- return a
- #获取完整连接内容整个网页包含a标签的内容(有筛选)
- def findLinks3(html):
- l = []
- urls = re.findall(r"<a.*?href=.*?<\/a>",html,re.I|re.S|re.M)
- for i in urls:
- if choose(i)==1:
- l.append(i)
- return l
- #获取a标签文本内容
- def findLinks1(html):
- text = []
- txts = re.findall(r"<a.*?>(.*?)<\/a>",html,re.I|re.S|re.M)
- for i in txts:
- if choose(i)==1:
- #print i
- text.append(i)
- return text[0]
- #只获取<a>标签链接href中的url<a href="www.www.com"></a>
- def findLinks2(html):
- url = []
- txts = re.findall("(?<=href=\").+?(?=\")|(?<=href=\').+?(?=\')",html,re.I|re.S|re.M)
- for i in txts:
- #print i
- url.append(i)
- return url[0]
- def getEveryYear(html):
- yearUrl ={} #定义空的字典,
- l = findLinks3(html) #查找所有超链接
- for i in l[1:]:
- text = findLinks1(i)
- url = findLinks2(i)
- yearUrl[text]=url #将超链接文本和url存放在字典中(key-value)
- #print text
- #print url
- return yearUrl
- """
- for val in l[1:]:
- pass
- print findLinks1(val)
- print findLinks2(val)
- d = getEveryYear(html)
- for val,key in d.items():
- print val
- # print key
- """
- class GetIdList(SGMLParser):
- def reset(self):
- self.IDlist = []
- self.flag = False
- self.getdata = False
- self.verbatim = 0
- SGMLParser.reset(self)
- def start_div(self, attrs):
- if self.flag == True:
- self.verbatim +=1 #进入子层div了,层数加1
- return
- for k,v in attrs:#遍历div的所有属性以及其值
- if k == 'class' and v == 'newsBody':#确定进入了<div class='entry-content'>
- self.flag = True
- return
- def end_div(self):#遇到</div>
- if self.verbatim == 0:
- self.flag = False
- if self.flag == True:#退出子层div了,层数减1
- self.verbatim -=1
- def start_p(self, attrs):
- if self.flag == False:
- return
- self.getdata = True
- def end_p(self):#遇到</p>
- if self.getdata:
- self.getdata = False
- def handle_data(self, text):#处理文本
- if self.getdata:
- self.IDlist.append(text)
- def printID(self):
- for i in self.IDlist:
- ##print i
- pass
- return self.IDlist
- def printtext(url):
- html = getHTML(url)
- lister = GetIdList()
- lister.feed(html)
- l = lister.printID()
- s=" "
- for text in l:
- s=s+text
- return s[0:500]
- def matchRe2(string):
- pattern = re.compile(r'([0-9]{1,5}.[0-9])亿元')
- #pat = re.compile(r'比上年增长[0-9]{1,5}.[0-9]%')
- #pat1 = re.compile(r'第一产业增加值[0-9]{1,5}.[0-9]亿元')
- match = pattern.search(string)
- if match:
- pass
- #print "ok"
- #print match.group(0)
- #print '国民经济生产总值:', pattern.search(string).group()
- # print pat1.search(string).group()
- #print re.compile(r'现将.*年大连市国民经济和社会发展情况公报如下').search(string).group()
- # print re.compile(r'第三产业增加值[0-9]{1,5}.[0-9]亿元').search(string).group()
- else:
- print 'No match!'
- return pattern.search(string).group()
- def getData(html):
- data = {}
- d = getEveryYear(html)
- for key,value in d.items():
- #print key #,value
- #download3(value,key)
- s=printtext(value)
- #print s
- #matchRe2(s[20:80])
- data[key]= matchRe2(s)
- return data
- class MSSQL:
- def __init__(self,host,user,pwd,db):
- self.host = host
- self.user = user
- self.pwd = pwd
- self.db = db
- def __GetConnect(self):
- if not self.db:
- raise(NameError,"没有设置数据库信息")
- self.conn = pymssql.connect(host=self.host,user=self.user,password=self.pwd,database=self.db,charset="utf8")
- cur = self.conn.cursor()
- if not cur:
- raise(NameError,"连接数据库失败")
- else:
- return cur
- def ExecQuery(self,sql):
- cur = self.__GetConnect()
- cur.execute(sql)
- resList = cur.fetchall()
- #查询完毕后必须关闭连接
- self.conn.close()
- return resList
- def ExecNonQuery(self,sql):
- cur = self.__GetConnect()
- cur.execute(sql)
- self.conn.commit()
- self.conn.close()
- def OnlyCharNum(s,oth=''):
- s2 = s.lower();
- fomart = '.0123456789'
- for c in s2:
- if not c in fomart:
- s = s.replace(c,'');
- return s;
- #写sql
- def makesql(year,money,time):
- sql = "insert into Innocellence_TimeSheet_GDPRecord values("+year+","+money+","+time+")"
- return sql
- #创建数据库实例
- ms = MSSQL(host="localhost",user="sa",pwd="",db="testdb")
- #先删除旧数据
- #查询数据
- """reslist = ms.ExecQuery("select year,round(amount,1) from Innocellence_TimeSheet_GDPRecord order by year")
- for i in reslist:
- print i"""
- #先清空数据
- ms.ExecNonQuery("delete from Innocellence_TimeSheet_GDPRecord ")
- html = getHTML("http://www.stats.dl.gov.cn/index.php?m=content&c=index&a=lists&catid=52")
- d = getEveryYear(html)
- data = getData(html)
- for key,val in data.items():
- print key,val
- sql = makesql(key[:4],OnlyCharNum(val),"'"+time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time()))+"'")
- print sql
- ms.ExecNonQuery(sql)
Python项目完成的更多相关文章
- Python语言在企业级应用上的十大谬误
英文原文:https://www.paypal-engineering.com/2014/12/10/10-myths-of-enterprise-python/ 翻译原文:http://www.os ...
- Python不能用于大型项目?关于Python的10大误解
 语言多元化是PayPal编程文化中一个重要的组成部分.在C++和Java长期流行的同时,更多的团队选择了Jva和Scala.同时,Braintree的收购也引入了一个久经世故的Ruby社区.Pyt ...
- Python不能用于大型项目?人们对Python的十大误解
Python 类型系统的特点是拥有强大.灵活的类型操作. 维基百科上对此作出的阐述. 而存在一个不争而有趣的事实是, Python 是比Java更加强类型的. Java 对于原生类型和对象区分了类型系 ...
- 学习pyhton需要做哪些准备工作
1:知道python个版本是有差异的 2:既然有差异,那么如何在不同项目不同版本的开发环境; ----------------------------------------------------- ...
- python基础教程笔记—即时标记(详解)
最近一直在学习python,语法部分差不多看完了,想写一写python基础教程后面的第一个项目.因为我在网上看到的别人的博客讲解都并不是特别详细,仅仅是贴一下代码,书上内容照搬一下,对于当时刚学习py ...
- C#转Python计划
1.学习python语法,完成python_cookbook上的代码. 目标:熟悉python语法和开发习惯,以及调试方法. 2.学习使用Django框架,完成一个基于Django框架的项目,发布到g ...
- 我的第一个python web开发框架(1)——前言
由于之前经验不是很丰富,写的C#系统太过复杂,所以一直想重写,但学的越多越觉得自己懂的越少,越觉的底气不足.所以一直不敢动手,在内心深处对自己讲,要静下心来认真学习,继续沉淀沉淀.这两年多以来找各种机 ...
- Python数据分析流程
一.数据分析的步骤: 1.查看数据并提出问题 2.数据清洗 3.代码编写,提取出结果数据,并分析是否有异常数据,修改代码 4.根据数据选择合适的图表进行展示 5.根据图表小组讨论交流获得最终的结果 二 ...
- 我的第一个python web开发框架(21)——小结
这个小网站终于成功上线,小白除了收获一笔不多的费用外,还得到女神小美的赞赏,心中满满的成就感.这一天下班后,他请老菜一起下馆子,兑现请吃饭的承诺,顺便让老菜点评一下. 小白:老大,在你的指导下终于完成 ...
随机推荐
- Oracle 静默安装的db_install.rsp 文件
Oracle 静默安装的db_install.rsp 文件,已修改好值 ################################################################ ...
- spring 学习二 @RequestMapping
RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径. RequestMapping注解有六个属性,下面我们把她 ...
- phonegap制作windows phone包
下载SDK win7及以下版本下载SDK http://www.microsoft.com/zh-cn/download/confirmation.aspx?id=27570 WIN8下载SDK ht ...
- [更新中]【South使用总结】django开发中使用South进行数据库迁移
Django开发中使用South进行数据库迁移的使用总结 South的详细资料可产看官方文档http://south.readthedocs.org/en/latest South安装配置 pip i ...
- 第三章 Java内存模型(下)
锁的内存语义 中所周知,锁可以让临界区互斥执行.这里将介绍锁的另一个同样重要但常常被忽视的功能:锁的内存语义 锁的释放-获取建立的happens-before关系 锁是Java并发编程中最重要的同步机 ...
- python(时间模块,序列化模块等)
一.time模块 表示时间的三种方式: 时间戳:数字(计算机能认识的) 时间字符串:t='2012-12-12' 结构化时间:time.struct_time(tm_year=2017, tm_mon ...
- 判断Integer值相等不能用==
今天在开发中判断两个Integer值相等, Integer a = 3; Duixiang duixiang = new Duixiang(); duixiang = DAO.getDuixiang( ...
- 关于struts2.3的action
struts2.3中支持实时配置,也就是说不用在struts.xml中进行配置.但是所有的action文件应该放在有路径名含action的包中,否则程序无法发现你的action. 这个问题,难为了我好 ...
- leetcode319
public class Solution { public int BulbSwitch(int n) { var x = Math.Sqrt(n); var y = Convert.ToInt32 ...
- maven 本地jar包依赖生成
转载自:http://www.cnblogs.com/wuyouwulv/p/maven_configure_oracle_jdbc.html 由于Oracle授权问题,Maven不提供Oracle ...