国家地表水水质自动监测实时数据发布系统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实现目标网站的数据爬网操作.

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线