今天,来对之前自学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项目完成的更多相关文章

  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. 破解Mac版MyEclipse-2017-ci3 2017、11、21亲测有效

    一.前提 要有安装好的jdk,没有的Mac用户看这篇博客:给Mac安装最新版本的jdk(戳此)  Windows用户先去官网(戳此)下载jdk,然后百度”jdk配置环境变量”(戳此),很简单的,加油你 ...

  2. java 多线程系列基础篇(十一)之生产消费者问题

    1. 生产/消费者模型 生产/消费者问题是个非常典型的多线程问题,涉及到的对象包括“生产者”.“消费者”.“仓库”和“产品”.他们之间的关系如下:(01) 生产者仅仅在仓储未满时候生产,仓满则停止生产 ...

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

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

  4. 11-19网页基础--第二部分CSS样式表基本概念

    CSS,全称(Cascading Style Sheets,层叠样式表),作用是美化HTML网页. 一.基本概念:是用于(增强)控制网页样式并允许将样式信息与网页内容分离的一种标记性语言. 你可能对C ...

  5. ABP系统设置

    代码分析 在abp中添加系统设置,都是在模块的预初始化方法中添加的. Configuration.Settings.Providers.Add<EmailSettingProvider>( ...

  6. linux&nbsp;dev/dsp&nbsp;声卡学习笔记

    原文地址:dev/dsp 声卡学习笔记">linux dev/dsp 声卡学习笔记作者:ziyou飞翔       无论是从声卡读取数据,或是向声卡写入数据,事实上都具有特定的格式(f ...

  7. PL/SQL批处理语句(一)BULK COLLECT

    我们知道PL/SQL程序中运行SQL语句是存在开销的,因为SQL语句是要提交给SQL引擎处理,这种在PL/SQL引擎和SQL引擎之间的控制转移叫做上下文却换,每次却换时,都有额外的开销.然而,FORA ...

  8. Comparatable接口和Comparator接口的使用与区别

    这篇博文可以为你解决的问题如下: 什么是自然排序 Collections.sort()与Arrays.sort()的异同点 Comparatable接口和Comparator接口各自的排序依据(理论讲 ...

  9. ngx-bootstrap使用01 安装ngx-bootstrap和bootstrap及其使用、外部样式引入

    1 版本说明 2 新建一个angular项目 ng new 项目名 --stayle=scss 代码解释:创建一个样式文件格式为SCSS的angular项目 技巧01:由于我angular-cli的版 ...

  10. ruby 类方法、实例方法、类变量

    ###################### #类变量 ###################### class Cloud @@count=0 def initialize(user,passwor ...