Python利用urllib/二模拟Http的Post请求调用php

Python利用urllib/2模拟Http的Post请求调用php

一、应用需求

        VSO平台的推广系统已接近尾声,还有最后一个问题就是每个月末对分红进行结账,将平台订单金额产生的分红打到用户的账户上,这种情况肯定要用Linux的定时任务来完成,结合前面的那篇《Python调用php》依然采用Python调用php的方式来实现。这次使用Python中的urllib和urllib2模块完成模拟http发送post请求来调用结算页面,执行数据库操作。这种方式相比上一篇将的方式要灵活、可行的多,上一篇中的方式只能调用单独的php处理页面,然后获取返回结果,无法真正模拟从url访问web站点。由于系统是基于Discuz进行的二次开发,我们要利用http://WEBIP/index.php?do=user&view=scan_prom_event这种url形式,它的控制器才会根据url里面的参数将我们的请求定位到指定页面。

       urllib和urllib2是Python的一个获取Url的模块。它用urlopen()的形式提供了非常简洁的接口,支持获取url的多种类别的协议,例如HTTP、FTP等,它的用途非常广泛,批量上传文件,网络爬虫等等(就是在网络上抓取网络流中的内容保存下来,并对其进行分析处理)。urllib和urllib2都是接收URL请求的相关模块,但是提供了不同的功能。最显著的地方在于:

       urllib2可以接收一个Request类的实例来设置URL请求的headers,而urllib仅可以接受URL,这意味着你不能伪装你浏览器的User-Agent,而这有可能浏览器会拒绝你的访问,不做任何处理。而urllib提供了urlencode方法,它可以将key-value这样的键值对转换成我们想要的格式,比如:data={ ‘do’ : 'user' , 'view' : 'scan_prom_event'} , 经过urlencode转码后会变为do=user&view=scan_prom_event的形式,而且当url地址中含有中文的时候,会对其进行转码处理。

二、实现代码

#!/usr/bin/python
import os
import urllib
import urllib2
import time

url="http://192.168.1.150/index.php"

params={'do':'user','view':'scanpromevent','scan_event':'1'}

data=urllib.urlencode(params)  

req=urllib2.Request(url,data)

response=urllib2.urlopen(req)

res=response.read()

if bool(res) :
   file_object=open("/var/log/scan_prom_event.log","a")
   try :
     now = time.strftime('%Y-%m-%d %H-%M-%S')
     file_object.writelines("\n============================"+now+"==================================\n")
     file_object.writelines(res)
     file_object.writelines("\n=================================================================================")
     file_object.flush()
   finally :
     file_object.close()

三、代码分析

       代码实现了这样的功能:发送请求到目的页面,最终的url会是这样的形式:http://WEBIP/index.php?do=prom&view=scan_prom_event,Discuz会将它解析到指定文件,执行查询和更新数据库操作,在php处理页面对数据库操作进行try{...}catch(){}捕捉,如果抛出异常了则将异常打印出来,如果一切正常就不做处理。这里对日常进行了日志处理,将打印的异常和当前时间保存在log文件中。

四、Linux定时任务

       采用Linux自带的crontab,这里就不啰嗦了。

       这里仅仅是开个头提供一个思路方法,将来肯定还有很多地方会用到。加油,坚持每天的学习!!