今天,来对之前自学python做的一个小任务进行复习和总结,首先回顾之前任务的每一个步骤,按照自己个人的思路,一布一步往下做

需求:根据主网站,爬取出大连市各年地区生产总值,观察2010至2015年的趋势

1.获取网页html源码

2.根据html源码解析a标签

3.对a标签进行筛选,返回对应的a标签文本和url字典

4.分别进入各个url网页,解析网页文本内容

5.利用正则提取网页感兴趣的信息

6.将处理后的信息存数据库

第一步:根据url获取主网页源代码

代码如下:

  1. import urllib2
  2. import re
  3. import pymssql
  4. import time
  5. from sgmllib import SGMLParser
  6. #获取页面的html
  7. def getHTML(url):
  8. request = urllib2.Request(url)
  9. response = urllib2.urlopen(request)
  10. html = response.read()
  11. return html
  12.  
  13. html = getHTML("http://www.stats.dl.gov.cn/index.php?m=content&c=index&a=lists&catid=52")
  14. print html

第二部:根据html源码解析a标签

代码如下:

  1. import urllib2
  2. import re
  3. import pymssql
  4. import time
  5. import datetime
  6. from sgmllib import SGMLParser
  7.  
  8. #获取网络页面
  9. def getHTML(url):
  10. request = urllib2.Request(url)
  11. response = urllib2.urlopen(request)
  12. html = response.read()
  13. return html
  14. #获取完整连接内容整个网页包含a标签的内容
  15. def findLinks3(html):
  16. l = []
  17. urls = re.findall(r"<a.*?href=.*?<\/a>",html,re.I|re.S|re.M)
  18. for i in urls:
  19. l.append(i)
  20. return l
  21. html = getHTML("http://www.stats.dl.gov.cn/index.php?m=content&c=index&a=lists&catid=52")
  22. l = findLinks3(html)
  23. for val in l:
  24. print val

第三布:对a标签进行筛选,返回对应的a标签文本和url字典

  1. import urllib2
  2. import re
  3. import pymssql
  4. import time
  5. import datetime
  6. from sgmllib import SGMLParser
  7.  
  8. #获取网络页面
  9. def getHTML(url):
  10. request = urllib2.Request(url)
  11. response = urllib2.urlopen(request)
  12. html = response.read()
  13. return html
  14. #进行模糊筛选(对字符串进行模糊查找,判断是否存在)
  15. def choose(html):
  16. a = -1
  17. if html.find("大连市国民经济和社会发展") == -1:
  18. a=-1
  19. else:
  20. a=1
  21. return a
  22. #获取完整连接内容整个网页包含a标签的内容(有筛选)
  23. def findLinks3(html):
  24. l = []
  25. urls = re.findall(r"<a.*?href=.*?<\/a>",html,re.I|re.S|re.M)
  26. for i in urls:
  27. if choose(i)==1:
  28. l.append(i)
  29. return l
  30. html = getHTML("http://www.stats.dl.gov.cn/index.php?m=content&c=index&a=lists&catid=52")
  31. l = findLinks3(html)
  32. for val in l[1:]:
  33. print val
  1. import urllib2
  2. import re
  3. import pymssql
  4. import time
  5. import datetime
  6. from sgmllib import SGMLParser
  7.  
  8. #获取网络页面
  9. def getHTML(url):
  10. request = urllib2.Request(url)
  11. response = urllib2.urlopen(request)
  12. html = response.read()
  13. return html
  14. #进行模糊筛选(对字符串进行模糊查找,判断是否存在)
  15. def choose(html):
  16. a = -1
  17. if html.find("大连市国民经济和社会发展") == -1:
  18. a=-1
  19. else:
  20. a=1
  21. return a
  22. #获取完整连接内容整个网页包含a标签的内容(有筛选)
  23. def findLinks3(html):
  24. l = []
  25. urls = re.findall(r"<a.*?href=.*?<\/a>",html,re.I|re.S|re.M)
  26. for i in urls:
  27. if choose(i)==1:
  28. l.append(i)
  29. return l
  30. #获取a标签文本内容
  31. def findLinks1(html):
  32. text = []
  33. txts = re.findall(r"<a.*?>(.*?)<\/a>",html,re.I|re.S|re.M)
  34. for i in txts:
  35. if choose(i)==1:
  36. #print i
  37. text.append(i)
  38. return text[0]
  39. #只获取<a>标签链接href中的url<a href="www.www.com"></a>
  40. def findLinks2(html):
  41. url = []
  42. txts = re.findall("(?<=href=\").+?(?=\")|(?<=href=\').+?(?=\')",html,re.I|re.S|re.M)
  43. for i in txts:
  44. #print i
  45. url.append(i)
  46. return url[0]
  47. def getEveryYear(html):
  48. yearUrl ={} #定义空的字典,
  49. l = findLinks3(html) #查找所有超链接
  50. for i in l[1:]:
  51. text = findLinks1(i)
  52. url = findLinks2(i)
  53. yearUrl[text]=url #将超链接文本和url存放在字典中(key-value)
  54. #print text
  55. #print url
  56. return yearUrl
  57.  
  58. html = getHTML("http://www.stats.dl.gov.cn/index.php?m=content&c=index&a=lists&catid=52")
  59. """
  60. l = findLinks3(html)
  61. for val in l[1:]:
  62. pass
  63. print findLinks1(val)
  64. print findLinks2(val)
  65. """
  66. d = getEveryYear(html)
  67. for val,key in d.items():
  68. print val
  69. print key

第四 、五:分别进入各个url,提取信息

  1. import urllib2
  2. import re
  3. import pymssql
  4. import time
  5. import datetime
  6. from sgmllib import SGMLParser
  7.  
  8. #获取网络页面
  9. def getHTML(url):
  10. request = urllib2.Request(url)
  11. response = urllib2.urlopen(request)
  12. html = response.read()
  13. return html
  14. #进行模糊筛选(对字符串进行模糊查找,判断是否存在)
  15. def choose(html):
  16. a = -1
  17. if html.find("大连市国民经济和社会发展") == -1:
  18. a=-1
  19. else:
  20. a=1
  21. return a
  22. #获取完整连接内容整个网页包含a标签的内容(有筛选)
  23. def findLinks3(html):
  24. l = []
  25. urls = re.findall(r"<a.*?href=.*?<\/a>",html,re.I|re.S|re.M)
  26. for i in urls:
  27. if choose(i)==1:
  28. l.append(i)
  29. return l
  30. #获取a标签文本内容
  31. def findLinks1(html):
  32. text = []
  33. txts = re.findall(r"<a.*?>(.*?)<\/a>",html,re.I|re.S|re.M)
  34. for i in txts:
  35. if choose(i)==1:
  36. #print i
  37. text.append(i)
  38. return text[0]
  39. #只获取<a>标签链接href中的url<a href="www.www.com"></a>
  40. def findLinks2(html):
  41. url = []
  42. txts = re.findall("(?<=href=\").+?(?=\")|(?<=href=\').+?(?=\')",html,re.I|re.S|re.M)
  43. for i in txts:
  44. #print i
  45. url.append(i)
  46. return url[0]
  47. def getEveryYear(html):
  48. yearUrl ={} #定义空的字典,
  49. l = findLinks3(html) #查找所有超链接
  50. for i in l[1:]:
  51. text = findLinks1(i)
  52. url = findLinks2(i)
  53. yearUrl[text]=url #将超链接文本和url存放在字典中(key-value)
  54. #print text
  55. #print url
  56. return yearUrl
  57. """
  58. for val in l[1:]:
  59. pass
  60. print findLinks1(val)
  61. print findLinks2(val)
  62.  
  63. d = getEveryYear(html)
  64. for val,key in d.items():
  65. print val
  66. # print key
  67. """
  68.  
  69. class GetIdList(SGMLParser):
  70. def reset(self):
  71. self.IDlist = []
  72. self.flag = False
  73. self.getdata = False
  74. self.verbatim = 0
  75. SGMLParser.reset(self)
  76.  
  77. def start_div(self, attrs):
  78. if self.flag == True:
  79. self.verbatim +=1 #进入子层div了,层数加1
  80. return
  81. for k,v in attrs: #遍历div的所有属性以及其值
  82. if k == 'class' and v == 'newsBody':#确定进入了<div class='newsBody'>
  83. self.flag = True
  84. return
  85.  
  86. def end_div(self):#遇到</div>
  87. if self.verbatim == 0:
  88. self.flag = False
  89. if self.flag == True:#退出子层div了,层数减1
  90. self.verbatim -=1
  91.  
  92. def start_p(self, attrs):
  93. if self.flag == False:
  94. return
  95. self.getdata = True
  96.  
  97. def end_p(self):#遇到</p>
  98. if self.getdata:
  99. self.getdata = False
  100.  
  101. def handle_data(self, text):#处理文本
  102. if self.getdata:
  103. self.IDlist.append(text)
  104.  
  105. def printID(self):
  106. for i in self.IDlist:
  107. ##print i
  108. pass
  109. return self.IDlist
  110.  
  111. def printtext(url):
  112. html = getHTML(url)
  113. lister = GetIdList()
  114. lister.feed(html)
  115. l = lister.printID()
  116. s=" "
  117. for text in l:
  118. s=s+text
  119. return s[0:500]
  120. def matchRe2(string):
  121. pattern = re.compile(r'([0-9]{1,5}.[0-9])亿元')
  122. #pat = re.compile(r'比上年增长[0-9]{1,5}.[0-9]%')
  123. #pat1 = re.compile(r'第一产业增加值[0-9]{1,5}.[0-9]亿元')
  124. match = pattern.search(string)
  125. if match:
  126. pass
  127. #print "ok"
  128. #print match.group(0)
  129. #print '国民经济生产总值:', pattern.search(string).group()
  130. # print pat1.search(string).group()
  131. #print re.compile(r'现将.*年大连市国民经济和社会发展情况公报如下').search(string).group()
  132. # print re.compile(r'第三产业增加值[0-9]{1,5}.[0-9]亿元').search(string).group()
  133. else:
  134. print 'No match!'
  135. return pattern.search(string).group()
  136.  
  137. def getData(html):
  138. data = {}
  139. d = getEveryYear(html)
  140. for key,value in d.items():
  141. #print key #,value
  142. #download3(value,key)
  143. s=printtext(value)
  144. #print s
  145. #matchRe2(s[20:80])
  146. data[key]= matchRe2(s)
  147. return data
  148. html = getHTML("http://www.stats.dl.gov.cn/index.php?m=content&c=index&a=lists&catid=52")
  149. d = getEveryYear(html)
  150.  
  151. #打印出所有文本内容
  152. """
  153. for key,val in d.items():
  154. #print val
  155. #print key
  156. s = printtext(val)
  157. print s
  158. """
  159.  
  160. data = getData(html)
  161. for val,key in data.items():
  162. print val,key

第六步:存数据库

  1. # -*- coding: cp936 -*-
  2. import urllib2
  3. import re
  4. import pymssql
  5. import time
  6. import datetime
  7. from sgmllib import SGMLParser
  8.  
  9. #获取网络页面
  10. def getHTML(url):
  11. request = urllib2.Request(url)
  12. response = urllib2.urlopen(request)
  13. html = response.read()
  14. return html
  15. #进行模糊筛选(对字符串进行模糊查找,判断是否存在)
  16. def choose(html):
  17. a = -1
  18. if html.find("大连市国民经济和社会发展") == -1:
  19. a=-1
  20. else:
  21. a=1
  22. return a
  23. #获取完整连接内容整个网页包含a标签的内容(有筛选)
  24. def findLinks3(html):
  25. l = []
  26. urls = re.findall(r"<a.*?href=.*?<\/a>",html,re.I|re.S|re.M)
  27. for i in urls:
  28. if choose(i)==1:
  29. l.append(i)
  30. return l
  31. #获取a标签文本内容
  32. def findLinks1(html):
  33. text = []
  34. txts = re.findall(r"<a.*?>(.*?)<\/a>",html,re.I|re.S|re.M)
  35. for i in txts:
  36. if choose(i)==1:
  37. #print i
  38. text.append(i)
  39. return text[0]
  40. #只获取<a>标签链接href中的url<a href="www.www.com"></a>
  41. def findLinks2(html):
  42. url = []
  43. txts = re.findall("(?<=href=\").+?(?=\")|(?<=href=\').+?(?=\')",html,re.I|re.S|re.M)
  44. for i in txts:
  45. #print i
  46. url.append(i)
  47. return url[0]
  48. def getEveryYear(html):
  49. yearUrl ={} #定义空的字典,
  50. l = findLinks3(html) #查找所有超链接
  51. for i in l[1:]:
  52. text = findLinks1(i)
  53. url = findLinks2(i)
  54. yearUrl[text]=url #将超链接文本和url存放在字典中(key-value)
  55. #print text
  56. #print url
  57. return yearUrl
  58. """
  59. for val in l[1:]:
  60. pass
  61. print findLinks1(val)
  62. print findLinks2(val)
  63.  
  64. d = getEveryYear(html)
  65. for val,key in d.items():
  66. print val
  67. # print key
  68. """
  69.  
  70. class GetIdList(SGMLParser):
  71. def reset(self):
  72. self.IDlist = []
  73. self.flag = False
  74. self.getdata = False
  75. self.verbatim = 0
  76. SGMLParser.reset(self)
  77.  
  78. def start_div(self, attrs):
  79. if self.flag == True:
  80. self.verbatim +=1 #进入子层div了,层数加1
  81. return
  82. for k,v in attrs:#遍历div的所有属性以及其值
  83. if k == 'class' and v == 'newsBody':#确定进入了<div class='entry-content'>
  84. self.flag = True
  85. return
  86.  
  87. def end_div(self):#遇到</div>
  88. if self.verbatim == 0:
  89. self.flag = False
  90. if self.flag == True:#退出子层div了,层数减1
  91. self.verbatim -=1
  92.  
  93. def start_p(self, attrs):
  94. if self.flag == False:
  95. return
  96. self.getdata = True
  97.  
  98. def end_p(self):#遇到</p>
  99. if self.getdata:
  100. self.getdata = False
  101.  
  102. def handle_data(self, text):#处理文本
  103. if self.getdata:
  104. self.IDlist.append(text)
  105.  
  106. def printID(self):
  107. for i in self.IDlist:
  108. ##print i
  109. pass
  110. return self.IDlist
  111.  
  112. def printtext(url):
  113. html = getHTML(url)
  114. lister = GetIdList()
  115. lister.feed(html)
  116. l = lister.printID()
  117. s=" "
  118. for text in l:
  119. s=s+text
  120. return s[0:500]
  121. def matchRe2(string):
  122. pattern = re.compile(r'([0-9]{1,5}.[0-9])亿元')
  123. #pat = re.compile(r'比上年增长[0-9]{1,5}.[0-9]%')
  124. #pat1 = re.compile(r'第一产业增加值[0-9]{1,5}.[0-9]亿元')
  125. match = pattern.search(string)
  126. if match:
  127. pass
  128. #print "ok"
  129. #print match.group(0)
  130. #print '国民经济生产总值:', pattern.search(string).group()
  131. # print pat1.search(string).group()
  132. #print re.compile(r'现将.*年大连市国民经济和社会发展情况公报如下').search(string).group()
  133. # print re.compile(r'第三产业增加值[0-9]{1,5}.[0-9]亿元').search(string).group()
  134. else:
  135. print 'No match!'
  136. return pattern.search(string).group()
  137.  
  138. def getData(html):
  139. data = {}
  140. d = getEveryYear(html)
  141. for key,value in d.items():
  142. #print key #,value
  143. #download3(value,key)
  144. s=printtext(value)
  145. #print s
  146. #matchRe2(s[20:80])
  147. data[key]= matchRe2(s)
  148. return data
  149.  
  150. class MSSQL:
  151. def __init__(self,host,user,pwd,db):
  152. self.host = host
  153. self.user = user
  154. self.pwd = pwd
  155. self.db = db
  156.  
  157. def __GetConnect(self):
  158. if not self.db:
  159. raise(NameError,"没有设置数据库信息")
  160. self.conn = pymssql.connect(host=self.host,user=self.user,password=self.pwd,database=self.db,charset="utf8")
  161. cur = self.conn.cursor()
  162. if not cur:
  163. raise(NameError,"连接数据库失败")
  164. else:
  165. return cur
  166.  
  167. def ExecQuery(self,sql):
  168. cur = self.__GetConnect()
  169. cur.execute(sql)
  170. resList = cur.fetchall()
  171.  
  172. #查询完毕后必须关闭连接
  173. self.conn.close()
  174. return resList
  175.  
  176. def ExecNonQuery(self,sql):
  177. cur = self.__GetConnect()
  178. cur.execute(sql)
  179. self.conn.commit()
  180. self.conn.close()
  181.  
  182. def OnlyCharNum(s,oth=''):
  183. s2 = s.lower();
  184. fomart = '.0123456789'
  185. for c in s2:
  186. if not c in fomart:
  187. s = s.replace(c,'');
  188. return s;
  189. #写sql
  190. def makesql(year,money,time):
  191. sql = "insert into Innocellence_TimeSheet_GDPRecord values("+year+","+money+","+time+")"
  192. return sql
  193.  
  194. #创建数据库实例
  195. ms = MSSQL(host="localhost",user="sa",pwd="",db="testdb")
  196. #先删除旧数据
  197.  
  198. #查询数据
  199. """reslist = ms.ExecQuery("select year,round(amount,1) from Innocellence_TimeSheet_GDPRecord order by year")
  200. for i in reslist:
  201. print i"""
  202. #先清空数据
  203. ms.ExecNonQuery("delete from Innocellence_TimeSheet_GDPRecord ")
  204. html = getHTML("http://www.stats.dl.gov.cn/index.php?m=content&c=index&a=lists&catid=52")
  205. d = getEveryYear(html)
  206. data = getData(html)
  207. for key,val in data.items():
  208. print key,val
  209. sql = makesql(key[:4],OnlyCharNum(val),"'"+time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time()))+"'")
  210. print sql
  211. ms.ExecNonQuery(sql)

Python项目完成的更多相关文章

  1. Python语言在企业级应用上的十大谬误

    英文原文:https://www.paypal-engineering.com/2014/12/10/10-myths-of-enterprise-python/ 翻译原文:http://www.os ...

  2. Python不能用于大型项目?关于Python的10大误解

     语言多元化是PayPal编程文化中一个重要的组成部分.在C++和Java长期流行的同时,更多的团队选择了Jva和Scala.同时,Braintree的收购也引入了一个久经世故的Ruby社区.Pyt ...

  3. Python不能用于大型项目?人们对Python的十大误解

    Python 类型系统的特点是拥有强大.灵活的类型操作. 维基百科上对此作出的阐述. 而存在一个不争而有趣的事实是, Python 是比Java更加强类型的. Java 对于原生类型和对象区分了类型系 ...

  4. 学习pyhton需要做哪些准备工作

    1:知道python个版本是有差异的 2:既然有差异,那么如何在不同项目不同版本的开发环境; ----------------------------------------------------- ...

  5. python基础教程笔记—即时标记(详解)

    最近一直在学习python,语法部分差不多看完了,想写一写python基础教程后面的第一个项目.因为我在网上看到的别人的博客讲解都并不是特别详细,仅仅是贴一下代码,书上内容照搬一下,对于当时刚学习py ...

  6. C#转Python计划

    1.学习python语法,完成python_cookbook上的代码. 目标:熟悉python语法和开发习惯,以及调试方法. 2.学习使用Django框架,完成一个基于Django框架的项目,发布到g ...

  7. 我的第一个python web开发框架(1)——前言

    由于之前经验不是很丰富,写的C#系统太过复杂,所以一直想重写,但学的越多越觉得自己懂的越少,越觉的底气不足.所以一直不敢动手,在内心深处对自己讲,要静下心来认真学习,继续沉淀沉淀.这两年多以来找各种机 ...

  8. Python数据分析流程

    一.数据分析的步骤: 1.查看数据并提出问题 2.数据清洗 3.代码编写,提取出结果数据,并分析是否有异常数据,修改代码 4.根据数据选择合适的图表进行展示 5.根据图表小组讨论交流获得最终的结果 二 ...

  9. 我的第一个python web开发框架(21)——小结

    这个小网站终于成功上线,小白除了收获一笔不多的费用外,还得到女神小美的赞赏,心中满满的成就感.这一天下班后,他请老菜一起下馆子,兑现请吃饭的承诺,顺便让老菜点评一下. 小白:老大,在你的指导下终于完成 ...

随机推荐

  1. Oracle 静默安装的db_install.rsp 文件

    Oracle 静默安装的db_install.rsp 文件,已修改好值 ################################################################ ...

  2. spring 学习二 @RequestMapping

    RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径. RequestMapping注解有六个属性,下面我们把她 ...

  3. phonegap制作windows phone包

    下载SDK win7及以下版本下载SDK http://www.microsoft.com/zh-cn/download/confirmation.aspx?id=27570 WIN8下载SDK ht ...

  4. [更新中]【South使用总结】django开发中使用South进行数据库迁移

    Django开发中使用South进行数据库迁移的使用总结 South的详细资料可产看官方文档http://south.readthedocs.org/en/latest South安装配置 pip i ...

  5. 第三章 Java内存模型(下)

    锁的内存语义 中所周知,锁可以让临界区互斥执行.这里将介绍锁的另一个同样重要但常常被忽视的功能:锁的内存语义 锁的释放-获取建立的happens-before关系 锁是Java并发编程中最重要的同步机 ...

  6. python(时间模块,序列化模块等)

    一.time模块 表示时间的三种方式: 时间戳:数字(计算机能认识的) 时间字符串:t='2012-12-12' 结构化时间:time.struct_time(tm_year=2017, tm_mon ...

  7. 判断Integer值相等不能用==

    今天在开发中判断两个Integer值相等, Integer a = 3; Duixiang duixiang = new Duixiang(); duixiang = DAO.getDuixiang( ...

  8. 关于struts2.3的action

    struts2.3中支持实时配置,也就是说不用在struts.xml中进行配置.但是所有的action文件应该放在有路径名含action的包中,否则程序无法发现你的action. 这个问题,难为了我好 ...

  9. leetcode319

    public class Solution { public int BulbSwitch(int n) { var x = Math.Sqrt(n); var y = Convert.ToInt32 ...

  10. maven 本地jar包依赖生成

    转载自:http://www.cnblogs.com/wuyouwulv/p/maven_configure_oracle_jdbc.html 由于Oracle授权问题,Maven不提供Oracle ...