国家地表水水质自动监测实时数据发布系统Python爬取实战
优采云 发布时间: 2020-08-31 08:36用于全国地表水质自动监测的Python爬行实战实时数据发布系统
本文主要是为了完成对国家地表水自动监测网站中监测数据的爬行. 网站首页如下:
爬行者通常被初学者选择为Python的首选. 他们可以锻炼其基本技能,并熟悉整个数据采集的流程. 已经有许多成熟的采集器框架,例如我们熟悉的Scrapy和Pyspider. 等等都是非常流行的采集器框架. 就个人而言,要成为爬虫,您不必使用现成的框架即可. 采集器的本质是模拟浏览器的操作,以完成简单的采集器的获取和发布操作. 它主要分为以下三个步骤:
这是我在完成许多爬虫项目之后总结的[Crawler Trilogy]. 简介如下:
第1步: 通过构建指向目标网站页面的链接来创建自动URL*敏*感*词*
第2步: 生成指定的页面URL后,将其移交给HTML下载器以下载页面的HTML数据. 在这里您可能会遇到更复杂的情况
第3步: 下载所需页面的HTML内容后,当需要使用数据项的内容时,内容解析器将分析并提取其HTML数据.
上面的块中说明了搜寻采集器数据的简单过程. 通过三个主要过程,您可以清楚地了解爬网程序在整个数据采集过程中的处理步骤.
接下来我们今天就进入本文的主题,完成对地表水数据的采集,核心实现如下:
def getCountryWater(url,fileDir='National_Surface_Water/'):
'''
爬取官网中的国家地表水水质自动监测实时数据发布系统 http://123.127.175.45:8082/
'''
if not os.path.exists(fileDir):
os.mkdir(fileDir)
browser=webdriver.PhantomJS(executable_path='D:\Anaconda2\phantomjs.exe')
browser.get(url)
page_html=browser.execute_script("return document.documentElement.outerHTML")
print 'page_html_length: ',len(page_html)
rule=re.compile(r'.*?')
res_list=re.findall(rule,page_html)
print 'record_length: ',len(res_list)
sssss=time.strftime('%Y-%m-%d-%H-%M-%S',time.localtime(time.time()))
res_dict={}
for one in res_list:
one_list=oneHandle(one)
one_key=hashMD5(one_list[0].strip())
res_dict[one_key]=one_list
one_file_path=fileDir+str(sssss)+'.json'
with open(one_file_path,'w') as f:
f.write(json.dumps(res_dict))
由于目标网站是动态更新数据的网站,因此您不能简单地使用静态页面的get操作来获取数据内容. 在这里,我使用了webdriver工具表单,该表单可以获取动态页面内容的数据.
此外,爬虫在实际使用时经常会遇到一些异常情况. 这就要求开发人员在实际开发和设计期间进行异常处理. 这也是代码健壮性的体现,由国家/地区{mask2}表示. 对于数据,我制定了页面HTML超时重试机制,该机制可以处理单页面HTML采集失败的问题. 具体实现如下:
def get_page_html(url,num_retries=3):
'''
设定超时重试机制,会在解析html失败后重试指定的次数
'''
try:
page=urllib.urlopen(url)
page_html=page.read()
page.close()
except:
time.sleep(random.randint(10,30))
page_html=None
if num_retries:
num_retries-=1
if page_html is None:
return get_page_html(url,num_retries)
T=time.strftime('%Y-%m-%d-%H',time.localtime(time.time()))
if page_html is None:
logging.log(logging.INFO, 'getPageHtml Wrong Time: '+str(T))
logging.log(logging.INFO, 'getPageHtml Wrong URL: '+str(url))
return 'null'
else:
return page_html
您可以根据需要使用它,也可以根据以上代码对其进行修改和升级.
启动采集器后,进行睡眠设置并简单地捕获目标网站数据,数据结果如下:
单个数据文件的结果如下:
为了便于结构化的显示和管理,存储和使用,将json数据文件转储到MySQL数据库中. 相关操作和代码实现在我以前的博客中进行了详细说明和实现,可以直接使用它,完整的结果图如下:
本文完全基于个人总结的[Crawler Trilogy]完成的数据采集,解析和存储操作. 接下来,我们将基于Scrapy实现目标网站的数据爬网操作.