最普通的答案

  我一直就觉得GET和POST没有什么除了语义之外的区别,自打我开始学习Web编程开始就是这么理解的 。

  可能很多人都已经猜到了答案是:

  1.GET 使用URL或Cookie传参。而POST将数据放在BODY中。

  2.GET 的 URL 会有长度的限制,则POST的数据则可以非常大。

  3.POST比GET安全,因为数据在地址栏上不可见。

  但是很不幸,这些区别都是错误的,更不幸的是,这个答案还在Google搜索的头版头条,然而我根本没想到这些是答案,因为在我看来都是错的。我来解释一下。

1.GET 和 POST 与数据如何传参没有关系

GET和POST是由HTTP协议定义的。在HTTP协议中,Method和Data(URL, Body, Header)是正交的两个概念,也就是说,使用哪个Method与应用层的数据如何传输是没有相互关系的。

HTTP没有要求,如果Method是POST数据就要放在BODY中。也没有要求,如果Method是GET,数据(参数)就一定要放在URL中而不能放在BODY中。

那么,网上流传甚广的这个说法是从何而来的呢?我在HTML标准中,找到了相似的描述。这和网上流传的说法一致。但是这只是HTML标准对HTTP协议的用法的约定。怎么能当成GET和POST的区别呢?

而且,现代的Web Server都是支持GET中包含BODY这样的请求。虽然这种请求不可能从浏览器发出,但是现在的Web Server又不是只给浏览器用,已经完全地超出了HTML服务器的范畴了。

知道这个有什么用?我不想解释了,有时候就得自己痛一次才记得住。

2. HTTP协议对GET和POST都没有对长度的限制

HTTP协议明确地指出了,HTTP头和Body都没有长度的要求。而对于URL长度上的限制,有两方面的原因造成:

1.浏览器。据说早期的浏览器会对URL长度做限制。据说IE对URL长度会限制在2048个字符内(流传很广,而且无数同事都表示认同)。但我自己试了一下,我构造了90K的URL通过IE9访问live.com,是正常的。网上的东西,哪怕是Wikipedia上的,也不能信。

2.服务器。URL长了,对服务器处理也是一种负担。原本一个会话就没有多少数据,现在如果有人恶意地构造几个几M大小的URL,并不停地访问你的服务器。服务器的最大并发数显然会下降。另一种攻击方式是,把告诉服务器Content-Length是一个很大的数,然后只给服务器发一点儿数据,嘿嘿,服务器你就傻等着去吧。哪怕你有超时设置,这种故意的次次访问超时也能让服务器吃不了兜着走。有鉴于此,多数服务器出于安全啦、稳定啦方面的考虑,会给URL长度加限制。但是这个限制是针对所有HTTP请求的,与GET、POST没有关系。

好了 关于 GET 和 POST 就说这些。

接下来我们爬取某个网站网站的数据。首先我们分析一些网站的结构,发现该网站使用ajax请求post提交方式 获取数据。

  1. # coding=utf-8
  2. import requests
  3. import json
  4. import time
  5. import re
  6. import datetime
  7. import time
  8. import sys
  9. import math
  10. import shutil
  11. import urlparse
  12. from pyquery import PyQuery as pq
  13. from peewee import *
  14.  
  15. sys.setrecursionlimit(100000)
  16. reload(sys)
  17. sys.setdefaultencoding('utf8')
  18. str.decode('UTF-8')
  19.  
  20. #定义全局变量
  21. global city_sx
  22. global city_ids
  23. global city_names
  24. global city_id_sx
  25. global city_time
  26. #河南省城市id
  27. #1郑州 2开封 3洛阳 4安阳 5濮阳 6新乡 7焦作 8三门峡 9鹤壁 10许昌 11漯河 12南阳 13信阳 14济源 15商丘 16周口 17驻马店 18平顶山
  28. city_id_sx = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]
  29. #数据库城市id
  30. #410000 郑州,410200 开封,410300 洛阳,410500 安阳,410900 濮阳,410700 新乡,410800 焦作,411200 三门峡,410600 鹤壁,411000 许昌,411100 漯河,411300 南阳,411500 信阳,410881 济源,
  31. #411400 商丘,411600 周口,411700 驻马店,410400 平顶山
  32. city_ids = [410000, 410200, 410300,410500,410900,410700,410800,411200,410600,411000,411100,411300,411500,410881,411400,411600,411700,410400]
  33. #城市名字
  34. city_names = ['郑州','开封','洛阳','安阳','濮阳','新乡','焦作','三门峡','鹤壁','许昌','漯河','南阳','信阳','济源','商丘','周口','驻马店','平顶山']
  35. #获取13位的时间戳
  36. # current_milli_time = lambda: int(round(time.time() * 1000))
  37. # city_time = current_milli_time()
  38. # print city_time
  39.  
  40. #链接数据库
  41. database = MySQLDatabase('bxy', **{'host': '$', 'password': '$', 'user': '$', 'use_unicode': True, 'charset': 'utf8', 'port': 3306})
  42.  
  43. class UnknownField(object):
  44. def __init__(self, *_, **__): pass
  45.  
  46. class BaseModel(Model):
  47. class Meta:
  48. database = database
  49.  
  50. class Region(BaseModel):
  51. name = CharField()
  52. parent_id = IntegerField(constraints=[SQL("DEFAULT 0")])
  53. rank = IntegerField(constraints=[SQL("DEFAULT 0")], null=True)
  54.  
  55. class Meta:
  56. table_name = 'region'
  57.  
  58. class Scens(BaseModel):
  59. address = CharField(null=True)
  60. baidu_lat = DecimalField(constraints=[SQL("DEFAULT 0.0000000000")], null=True)
  61. baidu_lng = DecimalField(constraints=[SQL("DEFAULT 0.0000000000")], null=True)
  62. business_hours = CharField(null=True)
  63. characteristic_landscape = TextField(null=True)
  64. cid = IntegerField()
  65. cname = CharField()
  66. consumer_hotline = CharField(null=True)
  67. interpreter_description = CharField(null=True)
  68. management_agency = CharField(null=True)
  69. pid = IntegerField()
  70. pname = CharField()
  71. price = CharField(null=True)
  72. price_description = CharField(null=True)
  73. scenic_cover = CharField(null=True)
  74. scenic_introduction = TextField(null=True)
  75. scenic_level = IntegerField(null=True)
  76. scenic_site = CharField(null=True)
  77. scenic_spot_description = CharField(null=True)
  78. scenic_title = CharField(null=True)
  79. scenic_type = CharField(null=True)
  80. sid = AutoField()
  81. sname = CharField()
  82. supporting_facilities = TextField(null=True)
  83. tickets_incentives = TextField(null=True)
  84. tour_route = TextField(null=True)
  85. tour_time = CharField(null=True)
  86. tourist_service_center = TextField(null=True)
  87. traffic_guide = TextField(null=True)
  88. xid = IntegerField(constraints=[SQL("DEFAULT 0")], null=True)
  89. xname = CharField(constraints=[SQL("DEFAULT 'unkown'")], null=True)
  90.  
  91. class Meta:
  92. table_name = 'scens'
  93.  
  94. #图片处理
  95. def save_img(url):
  96. file_name = url.split('/')[-1]
  97.  
  98. try:
  99. r = requests.get(url)
  100. except:
  101. print('远程连接错误')
  102. return -1
  103.  
  104. try:
  105. with open(file_name, 'wb') as f:
  106. f.write(r.content)
  107. except:
  108. print('文件保存错误')
  109. return -1
  110.  
  111. def upload_img(url):
  112. import os
  113. file_name = url.split('/')[-1]
  114.  
  115. im = Image.open(file_name)
  116. w, h = im.size
  117. # print('Original image size: %sx%s' % (w, h))
  118. if w > 640:
  119. im.thumbnail((640, int(math.floor(640.00/w*h))))
  120. file_name = 'thumbnail.jpg'
  121. im.save(file_name, 'jpeg')
  122.  
  123. # print os.getcwd()
  124. # os.chdir('%s/scenic_cover' % os.getcwd())
  125. folder = datetime.datetime.now().strftime('%Y%m/')
  126. data = {
  127. 'ticket': 'EA8D6730-321B-4B11-9AA2-A925D6E0E91F',
  128. 'dir': folder
  129. }
  130. new_file_name = '%s.%s' % (str(uuid.uuid4()), (file_name.split('.')[-1]).lower())
  131. files = {'myfile': (new_file_name, open(file_name, 'rb'), 'application/octet-stream', {})}
  132. r = requests.post('127.0.0.1/upload/save_remote', data=data, files=files)
  133. if r.text == 'true':
  134. return '%s%s' % (folder, new_file_name)
  135. else:
  136. print(r.text)
  137. return -1
  138. def qs(url):
  139. query = urlparse.urlparse(url).query
  140. return dict([(k, urlparse.unquote(v[0])) for k, v in urlparse.parse_qs(query).items()])
  141. #获取城市景区链接数据
  142. def get_city(city_index=0, pg=0, i=0, times=1):
  143. global city_id_sx, city_names
  144. #print city_id_sx
  145. print('\033[0;31m')
  146. print '当前:city_id:%d, city_name:%s, city_index:%d, pg:%d, index:%d, times:%d' % (city_id_sx[city_index], city_names[city_index], city_index, pg, i, times)
  147. print('\033[0m')
  148. print '---------------------->'
  149. url = 'http://www.uhenan.com/Interface/getData.ashx'
  150. #请求头
  151. headers = {
  152. 'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36',
  153. 'Referer':'http://www.uhenan.com/ScenicArea/List?t1=0&t2=1&t3=%200',
  154. 'Host':'www.uhenan.com',
  155. 'Origin':'http://www.uhenan.com',
  156. 'Content-Type': 'application/x-www-form-urlencoded',
  157. 'Cookie':'safedog-flow-item=; __51cke__=; __tins__19387303=%7B%22sid%22%3A%201567134818720%2C%20%22vd%22%3A%202%2C%20%22expires%22%3A%201567137385875%7D; __51laig__=20'
  158. }
  159. try:
  160. #发送post请求
  161. payload = 'order=desc&field=Top&page=%d&limit=5&method=ScenicArea&Type1=0&Type2=%d&Type3=0&Switch=true&time=' % (city_id_sx[city_index],pg*5)
  162. print payload
  163. response = requests.post(url=url, headers=headers, timeout=10,data=payload)
  164. response.raise_for_status()
  165. except requests.exceptions.ConnectTimeout:
  166. print('get_city ConnectTimeout')
  167. exit(0)
  168. except requests.exceptions.Timeout:
  169. print('get_city Timeout')
  170. exit(0)
  171. except requests.exceptions.ConnectionError:
  172. print('get_city ConnectionError')
  173. exit(0)
  174. except requests.RequestException as e:
  175. if requests.status_code == 404:
  176. print('-' * 20)
  177. print(' 没有此页。')
  178. print('-' * 20)
  179. else:
  180. print 'get error:', e
  181. if item > 4:
  182. exit(0)
  183. else:
  184. tiems.sleep(1)
  185. get_detail(cname, city, id, pg, times+1)
  186. else:
  187. #print response.content
  188. json_obj = json.loads(response.content)
  189. if len(json_obj['data']) == 0:
  190. print '<--- end: city_id:%d, city_name:%s' % (city_id_sx[city_index], city_names[city_index])
  191. if city_index < len(city_id_sx) - 1:
  192. print '进入下一个市 ===>'
  193. get_city(city_index+1, 0, 0, 1)
  194. else:
  195. print '<=== 本省结束 ===>'
  196. exit(0)
  197. for_i = 0
  198. for item in json_obj['data']:
  199. if i > for_i:
  200. for_i = for_i + 1
  201. continue
  202. #获取子链接
  203. #ID = item['ID']
  204. #获取景区名字
  205. Title = item['Title']
  206. #获取景区电话
  207. Phone = item['Phone']
  208. #获取景区价格
  209. Ticket = item['Ticket']
  210. str_first = re.sub('<.*?>',"",Ticket)
  211. str_enfin = str_first.replace('/n',"")
  212. #获取景区介绍
  213. Introduction = item['Introduction']
  214. str_first = re.sub('<.*?>',"",Introduction)
  215. str_enfin_1 = str_first.replace(' ', '')
  216. str_enfin_2 = str_enfin_1.replace(' ', '')
  217. #获取景区地址
  218. Address = item['Address']
  219. #获取百度坐标
  220. PointLng = item['PointLng']
  221. PointLat = item['PointLat']
  222. #获取图片地址:
  223. Logo = item['Logo']
  224. http = 'http://www.uhenan.com'
  225. url = http + Logo
  226. print Title, str_enfin, Phone, Address, str_enfin_2, PointLng, PointLat, url
  227. # print city_names[city_index], pg+1, for_i+1, scen_item['ID'], scen_item['Title'],scen_item['Phone'],scen_item['Address'],scen_item['PointLng'],scen_item['PointLat']
  228. #get_detail(city_names[city_index], city_ids[city_index], ID, pg, 1)
  229. time.sleep(1)
  230. for_i = for_i + 1
  231. get_city(city_index, pg+1, 0, 1)
  232. global city
  233.  
  234. if __name__ == '__main__':
  235. city_index = 0
  236. page = 0
  237. index = 0
  238.  
  239. if len(sys.argv) >= 3:
  240. city_index = int(sys.argv[1])
  241. if len(sys.argv) >= 4:
  242. page = int(sys.argv[2])
  243. if len(sys.argv) == 5:
  244. index = int(sys.argv[3])
  245. get_city(city_index, page, index, 1)

原文转载链接:https://xushanxiang.com/2019/10/python-%e8%8e%b7%e5%8f%96-post-%e5%92%8c-get-%e6%95%b0%e6%8d%ae.html

python发起post请求获取json数据使用requests方法的更多相关文章

  1. PHP/Post 提交请求获取json数据,并转化为所需要的数组

    /** * Post 提交请求获取json数据,并转化为所需要的数组 */ function request_post($url = '', $param = '') { if (empty($url ...

  2. JSONP 跨域请求 - 获取JSON数据

    如何用原生方式使用JSONP? 下边这一DEMO实际上是JSONP的简单表现形式,在客户端声明回调函数之后,客户端通过script标签向服务器跨域请求数据,然后服务端返回相应的数据并动态执行回调函数. ...

  3. android通过httpClient请求获取JSON数据并且解析

    使用.net创建一个ashx文件,并response.write  json格式 public void ProcessRequest(HttpContext context) { context.R ...

  4. Android Studio利用异步任务AsyncTask发送post请求获取json数据

    syncTask,是Android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主 ...

  5. 异步请求获取JSON数据

    json格式的数据广泛应用于异步请求中前后端的数据交互,本文主要介绍几种使用场景和使用方法. <script type="text/javascript"> funct ...

  6. post请求获取json数据 解析json数据

    <script> window.onload = function () { var str; // console.log(@ViewBag.ID); $.post("/Ser ...

  7. 通过HttpClient发起Get请求,获取Json数据,然后转为java数据,然后批量保存数据库;

    Json转java所需Jar包: commons-beanutils-1.8.0.jar,commons-collections-3.2.1.jar,commons-lang-2.5.jar,comm ...

  8. NodeJs本地搭建服务器,模拟接口请求,获取json数据

    最近在学习Node.js,虽然就感觉学了点皮毛,感觉这个语言还不错,并且也会一步步慢慢的学着的,这里实现下NodeJs本地搭建服务器,模拟接口请求,获取json数据. 具体的使用我就不写了,这个博客写 ...

  9. ajax获取json数据及实现跨域请求

    最近想练习一下ajax获取json数据 , 首先上网找一些在线的可用来测试的接口. -----------------------------------------------------这里是接口 ...

随机推荐

  1. LVS配置

    今天面试时,突然被面试官问到怎样用shell命令搞定某个文件夹下java代码行数的统计. 想了一下,基本思路就是找到这个文件夹下面的所有java文件,然后每个文件统计一下代码,外层套个for循环,叠加 ...

  2. Java-JDK-windows和linux版-百度云下载

    链接: https://pan.baidu.com/s/15vjk4PNzuItd5vHJ6deq3Q 关注以下公众号,回复[9757],获取提取码 linux:jdk-8u221-linux-x64 ...

  3. PHPstrom中关闭提示信息

    设置里面搜索parameter name hints

  4. vue路由跳转到登录页

    // 第一种 { path:'/', component: require('../components/Login.vue') }, // 第二种 { path: '/', redirect: '/ ...

  5. java初级之数组详解

    一,数组的概念: 数组是为了存储同一种数据多个元素的集合,也可以看成是一个容器,数组既可以存储基本数据类型,也可以存储引用数据类型,数组是为了存储同种数据类型的多个值. 1.1.1,一维数组重点: 数 ...

  6. Ironic 裸金属管理服务的网络模型

    目录 文章目录 目录 Bare-Metal networking in Neutron 核心网络类型 网络拓扑 抽象网络拓扑图 Neutron Implementation Neutron 了解裸金属 ...

  7. python在shell中环境变量使用

    1.用Python Shell设置或获取环境变量的方法: 设置系统环境变量 os.environ['环境变量名称']='环境变量值' #其中key和value均为string类型 os.putenv( ...

  8. 守护进程,互斥锁, IPC ,Queue队列,生产消费着模型

    1.守护进程 什么是守护进程? 进程是一个正在运行的程序 守护进程也是一个普通进程,意思是一个进程可以守护另一个进程,比如如果b是a的守护进程,a是被守护的进程,如果a进程结束,b进程也会随之结束. ...

  9. Linux常用目录名称

    目录 用途 / 虚拟目录的根文件,通常不会在这里存储文件 /bin 二进制目录,存放许多用户的GNU工具 /boot 启动目录,存放启动文件 /dev 设备目录,Linux在这里创建设备节点 /etc ...

  10. 对scrapy进行单元测试 -- 使用betamax

    使用betamax进行单元测试 爬虫代码 测试代码 对于scrapy的单元测试,官方文档并没有提到,只是说有一个Contract功能.但是相信我,这个东西真的不好用,甚至scrapy的作者在一个iss ...