最近有个将文件上传到内部web服务器上的任务,于是参考了网上部分源码用python写了这个小程序,代码如下:
[python] view plain copy
#coding:utf-8
'''''
Created on 2015.3.19
@author: damofy
'''
import os
import time
import sys
import urllib2
'''''
filename 待上传的文件
fieldname 表单域中的name属性
'''
def CreateBody(filename, fieldname, strBoundary):
bRet = False
sData = []
sData.append('--%s' % strBoundary)
#'Content-Disposition: form-data name="uploadfile" filename="XX-Net-1.3.6.zip"'
sData.append('Content-Disposition: form-data name="嫌差%s"' % fieldname + 'filename="%s"' % os.path.basename(filename))
sData.append('Content-Type: %s\r\n' % 'application/octet-stream')
try:
pFile = open(filename, 'rb'祥旦)
sData.append(pFile.read())
sData.append('--%s--\r\n' % strBoundary)
bRet = True
finally:
pFile.close()
return bRet, sData
def uploadfile(http_url, filename, fieldname):
if os.path.exists(filename):
filesize = os.path.getsize(filename)
print('file:' + filename + ' is %d bytes!' % filesize)
else:
print('file:' + filename + ' isn\'t exists!')
return False
strBoundary = '---------------------------%s' % hex(int(time.time() * 1000))
bRet, sBodyData 谨者扰= CreateBody(filename, fieldname, strBoundary)
if True == bRet:
http_body = '\r\n'.join(sBodyData)
stReq = urllib2.Request(http_url, http_body)
stReq.add_header('User-Agent','Mozilla/5.0')
stReq.add_header('Content-Length:', '%d' % filesize)
stReq.add_header('Content-Type', 'multipart/form-data boundary=%s' % strBoundary)
resp = urllib2.urlopen(stReq, timeout=5)
# get response
msg = resp.read()
print("Response content:\n" + msg)
else:
print("CreateBody failed!")
return bRet
if __name__ == '__main__':
if len(sys.argv) > 2:
http_url = sys.argv[1]
filename = sys.argv[2]
else:
print('python upload.py http://10.20.131.23/upload ./test.dat')
sys.exit()
# 参数3 "uploadfile" 是post表单中的name属性,需要与服务端保持一致
uploadfile(http_url, filename, 'uploadfile')
以下实例是一个完整的代码,实现了从博客获取内容发布至百度,分别实践抓取博客内容、模拟登录、表单提交这空洞拿几步;#注意,以下程序是一个完全程序,如果只需要实现模拟登录,提交表单,删除抓取部分即可,相关的代码已经清楚标注,可以根据自己实际情况修改。
代码如下:
# -*- coding: utf-8 -*-
import re
import urllib
斗搭 import urllib2
import cookielib
#第一步,获取博客标题和正文 ,“IP”可以改为实际地址;
url = "IP"
sock = urllib.urlopen(url)
html = sock.read()
sock.close()
content = re.findall('(?<=blogstory">).*(?=<p class="right artical)', html, re.S)
content = re.findall('<script.*>.*</script>(.*)', content[0], re.S)
title = re.findall('(?<=<title>)(.*)-.* - CSDN.*(?=</title>)', html, re.S)
#根据文章获取内容新建表单值
blog = {'spBlogTitle': title[0].decode('utf-8').encode('gbk'), #文章标题
'spBlogText': content[0].decode('utf-8').encode('gbk'),#文章内容
'ct': "1",
'cm': "1"}
del content
del title
#第二步,模拟登录百度;
cj = cookielib.CookieJar()
#登陆百度的用户名和密码
post_data = urllib.urlencode({'username': '[username]', 'password': '[password]', 'pwd': '1'})
#登录地址路径
path = 'https://passport.baidu.com/?login'
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
opener.addheaders = [('User-agent', 'Opera/9.23')]
urllib2.install_opener(opener)
req = urllib2.Request(path, post_data)
conn = urllib2.urlopen(req)
#获取百度登陆认证令牌
bd = urllib2.urlopen(urllib2.Request('http://hi.baidu.com/[username]/creat/blog')).read()
bd = re.findall('(?<=bdstoken\" value=\").*(?=ct)', bd, re.S)
blog['bdstoken'] = bd[0][:32]
#设置分类名
blog['spBlogCatName'] = 'php'
#第四步,比较表单,提交表单;req2 = urllib2.Request('http://hi.baidu.com/[username]/commit', urllib.urlencode(blog))
#最后,查看表单颤戚提交后返回内容,检验;
print urllib2.urlopen(req2).read()
#注意:将[username]/[password]替换为自己真实用户名和密码
可以使用Python的requests库来实碰拍现:
1. 首先,使用requests.get()方笑团羡法获取第一家网店的form表单信息;
2. 然后,使用requests.post()方法将form表单信息发送到另一家店;
3. 最后,使用requests.post()方法将form表单信息提交到另一家店,完成商品上传。
或数
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)