![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmL1IDMw8lavwlM4p2LclGavwVbvNmL1RWahJmLn1Wavw1LcpDc0RHaiojIsJye.gif)
pycurl模块用法:
<code>c = pycurl.Curl() </code><code>#创建一个curl对象 </code>
<code>c.setopt(pycurl.CONNECTTIMEOUT, 5) </code><code>#连接的等待时间,设置为0则不等待 </code>
<code>c.setopt(pycurl.TIMEOUT, 5) </code><code>#请求超时时间 </code>
<code>c.setopt(pycurl.NOPROGRESS, 0) </code><code>#是否屏蔽下载进度条,非0则屏蔽 </code>
<code>c.setopt(pycurl.MAXREDIRS, 5) </code><code>#指定HTTP重定向的最大数 </code>
<code>c.setopt(pycurl.FORBID_REUSE, 1) </code><code>#完成交互后强制断开连接,不重用 </code>
<code>c.setopt(pycurl.FRESH_CONNECT,1) </code><code>#强制获取新的连接,即替代缓存中的连接 </code>
<code>c.setopt(pycurl.DNS_CACHE_TIMEOUT,60) </code><code>#设置保存DNS信息的时间,默认为120秒 </code>
<code>c.setopt(pycurl.URL,</code><code>"http://www.baidu.com"</code><code>) </code><code>#指定请求的URL </code>
<code>c.setopt(pycurl.USERAGENT,</code><code>"Mozilla/5.2 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50324)"</code><code>) </code><code>#配置请求HTTP头的User-Agent</code>
<code>c.setopt(pycurl.HEADERFUNCTION, getheader) </code><code>#将返回的HTTP HEADER定向到回调函数getheader</code>
<code>c.setopt(pycurl.WRITEFUNCTION, getbody) </code><code>#将返回的内容定向到回调函数getbody</code>
<code>c.setopt(pycurl.WRITEHEADER, fileobj) </code><code>#将返回的HTTP HEADER定向到fileobj文件对象</code>
<code>c.setopt(pycurl.WRITEDATA, fileobj) </code><code>#将返回的HTML内容定向到fileobj文件对象</code>
<code>c.getinfo(pycurl.HTTP_CODE) </code><code>#返回的HTTP状态码</code>
<code>c.getinfo(pycurl.TOTAL_TIME) </code><code>#传输结束所消耗的总时间</code>
<code>c.getinfo(pycurl.NAMELOOKUP_TIME) </code><code>#DNS解析所消耗的时间</code>
<code>c.getinfo(pycurl.CONNECT_TIME) </code><code>#建立连接所消耗的时间</code>
<code>c.getinfo(pycurl.PRETRANSFER_TIME) </code><code>#从建立连接到准备传输所消耗的时间</code>
<code>c.getinfo(pycurl.STARTTRANSFER_TIME) </code><code>#从建立连接到传输开始消耗的时间</code>
<code>c.getinfo(pycurl.REDIRECT_TIME) </code><code>#重定向所消耗的时间</code>
<code>c.getinfo(pycurl.SIZE_UPLOAD) </code><code>#上传数据包大小</code>
<code>c.getinfo(pycurl.SIZE_DOWNLOAD) </code><code>#下载数据包大小 </code>
<code>c.getinfo(pycurl.SPEED_DOWNLOAD) </code><code>#平均下载速度</code>
<code>c.getinfo(pycurl.SPEED_UPLOAD) </code><code>#平均上传速度</code>
<code>c.getinfo(pycurl.HEADER_SIZE) </code><code>#HTTP头部大小</code>
代码如下:
<code>#!/usr/bin/env python</code>
<code># __*__coding:utf8__*__</code>
<code>#Author:wangpengtai</code>
<code>#Blog:http://wangpengtai.blog.51cto.com/</code>
<code>import</code> <code>pycurl</code>
<code>import</code> <code>sys</code>
<code>import</code> <code>StringIO </code><code>#引用该模块的原因是:使用pycurl后会打印出页面内容,我们不需要看到这个内容,只需要获取页面反馈信息就行了,只能将其写入缓存中,目前没找到好办法,学艺不精,不会使用重定向写到os.devnull中,无奈初次下策。。。</code>
<code>#开始使用的是写入临时文件,但是会有权限问题,导致zabbix无法获取到数据。</code>
<code>class</code> <code>WebStatus(</code><code>object</code><code>):</code>
<code> </code><code>def</code> <code>__init__(</code><code>self</code><code>, url):</code>
<code> </code><code>self</code><code>.url </code><code>=</code> <code>url</code>
<code> </code><code>self</code><code>.curl </code><code>=</code> <code>pycurl.Curl()</code>
<code> </code><code>self</code><code>.string </code><code>=</code> <code>StringIO.StringIO()</code>
<code> </code><code># 连接等待时间,0则不等待</code>
<code> </code><code>self</code><code>.curl.setopt(pycurl.CONNECTTIMEOUT, </code><code>5</code><code>)</code>
<code> </code><code># 超时时间</code>
<code> </code><code>self</code><code>.curl.setopt(pycurl.TIMEOUT, </code><code>5</code><code>)</code>
<code> </code><code># 下载进度条,非0则屏蔽</code>
<code> </code><code>self</code><code>.curl.setopt(pycurl.NOPROGRESS, </code><code>1</code><code>)</code>
<code> </code><code># 指定HTTP重定向最大次数</code>
<code> </code><code>self</code><code>.curl.setopt(pycurl.MAXREDIRS, </code><code>5</code><code>)</code>
<code> </code><code># 完成交互后强制断开连接,不重用</code>
<code> </code><code>self</code><code>.curl.setopt(pycurl.FORBID_REUSE, </code><code>1</code><code>)</code>
<code> </code><code># 设置DNS信息保存时间,默认为120秒</code>
<code> </code><code>self</code><code>.curl.setopt(pycurl.DNS_CACHE_TIMEOUT, </code><code>60</code><code>)</code>
<code> </code><code># 设置请求的Url</code>
<code> </code><code>self</code><code>.curl.setopt(pycurl.URL, </code><code>self</code><code>.url)</code>
<code> </code><code>self</code><code>.curl.setopt(pycurl.WRITEFUNCTION, </code><code>self</code><code>.string.write)</code><code>#将页面内容写入缓存</code>
<code> </code><code>self</code><code>.curl.perform()</code>
<code> </code><code>def</code> <code>request_value(</code><code>self</code><code>):</code>
<code> </code><code>data </code><code>=</code> <code>{</code>
<code> </code><code>"Http_code"</code><code>: </code><code>self</code><code>.curl.getinfo(pycurl.HTTP_CODE),</code>
<code> </code><code>"Speed_download"</code><code>: </code><code>self</code><code>.curl.getinfo(pycurl.SPEED_DOWNLOAD),</code>
<code> </code><code>"Connect_time"</code><code>: </code><code>self</code><code>.curl.getinfo(pycurl.CONNECT_TIME),</code>
<code> </code><code>"Total_time"</code><code>: </code><code>self</code><code>.curl.getinfo(pycurl.TOTAL_TIME),</code>
<code> </code><code>"Dnslookup_time"</code><code>: </code><code>self</code><code>.curl.getinfo(pycurl.NAMELOOKUP_TIME),</code>
<code> </code><code>"Redirect_time"</code><code>: </code><code>self</code><code>.curl.getinfo(pycurl.REDIRECT_TIME),</code>
<code> </code><code>"Redirect_count"</code><code>: </code><code>self</code><code>.curl.getinfo(pycurl.REDIRECT_COUNT)</code>
<code> </code><code>}</code>
<code> </code><code>return</code> <code>data</code>
<code> </code><code>def</code> <code>__end__(</code><code>self</code><code>): </code><code>#释放内存和连接,做一个有始有终,有责任心的运维狗</code>
<code> </code><code>self</code><code>.string.close()</code>
<code> </code><code>self</code><code>.curl.close()</code>
<code>if</code> <code>__name__ </code><code>=</code><code>=</code> <code>"__main__"</code><code>:</code>
<code> </code><code>Usage </code><code>=</code> <code>"""</code>
<code>Usage: python web_monitor.py url [Http_code|Speed_download|Connect_time|Total_time|Dnslookup_time|Redirect_time|Redirect_count]</code>
<code> </code><code>"""</code>
<code> </code><code>try</code><code>:</code>
<code> </code><code>url </code><code>=</code> <code>sys.argv[</code><code>1</code><code>]</code>
<code> </code><code>request </code><code>=</code> <code>sys.argv[</code><code>2</code><code>]</code>
<code> </code><code>try</code><code>:</code>
<code> </code><code>s </code><code>=</code> <code>WebStatus(url)</code>
<code> </code><code>try</code><code>:</code>
<code> </code><code>print</code> <code>s.request_value()[request]</code>
<code> </code><code>except</code> <code>KeyError:</code>
<code> </code><code>print</code> <code>"Make sure 2nd argument is right!"</code>
<code> </code><code>except</code> <code>pycurl.error:</code>
<code> </code><code>print</code> <code>"Make sure the url is right or reachable!"</code>
<code> </code><code>except</code> <code>IndexError:</code>
<code> </code><code>print</code> <code>"Must be 2 arguments given!%s"</code> <code>%</code> <code>Usage</code>
<a href="https://s1.51cto.com/wyfs02/M02/9E/CF/wKioL1mWn16C1FgLAADAVUbD328649.jpg-wh_500x0-wm_3-wmp_4-s_275613802.jpg" target="_blank"></a>
二、配置zabbix自定义监控
这个相对来说比较灵活,可以找一台机器专门用来做监控,只需要在这台机器上配置以下内容就可以监控多个URL了。
zabbix界面中可以配置一个模版,将其挂在该机器上就行了。
1、将代码写到下面目录下并加上可执行权限
<code>[root@zabbix-12-195 scripts]</code><code># pwd</code>
<code>/etc/zabbix/scripts</code>
<code>[root@zabbix-12-195 scripts]</code><code># vim web_monitor.py </code>
<code>[root@zabbix-12-195 scripts]</code><code># chmod +x web_monitor.py</code>
2、配置zabbix_agentd.conf
<code>[root@zabbix-12-195 scripts]</code><code># cat /etc/zabbix_agentd.conf</code>
<code>UserParameter=web[*],</code><code>/etc/zabbix/scripts/web_monitor</code><code>.py $1 $2</code>
3、重启zabbix-agentd
<code>[root@zabbix-12-195 scripts]</code><code># service zabbix-agentd restart</code>
三、配置zabbix监控
<a href="https://s2.51cto.com/wyfs02/M02/00/04/wKiom1mU-YaDpLH8AAC9-gHCOUU707.jpg-wh_500x0-wm_3-wmp_4-s_2189949298.jpg" target="_blank"></a>
<a href="https://s4.51cto.com/wyfs02/M02/9E/B4/wKioL1mU-daCJY3HAACk3ML1kVk955.jpg-wh_500x0-wm_3-wmp_4-s_4016537963.jpg" target="_blank"></a>
<a href="https://s2.51cto.com/wyfs02/M00/9E/B4/wKioL1mU-iCynOqwAABiF67TeWU417.jpg-wh_500x0-wm_3-wmp_4-s_1483484018.jpg" target="_blank"></a>
本文转自 wangpengtai 51CTO博客,原文链接:http://blog.51cto.com/wangpengtai/1956973,如需转载请自行联系原作者