如何在 Python 中模拟 post 表单来上传文件

如何在 Python 中模拟 post 表单来上传文件,第1张

最近有个将文件上传到内部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表单信息提交到另一家店,完成商品上传。

                 或数                


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8265279.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存