• python发起post请求获取json数据使用requests方法


      最普通的答案

      我一直就觉得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 
     44 class UnknownField(object):
     45     def __init__(self, *_, **__): pass
     46 
     47 
     48 class BaseModel(Model):
     49     class Meta:
     50         database = database
     51 
     52 
     53 class Region(BaseModel):
     54     name = CharField()
     55     parent_id = IntegerField(constraints=[SQL("DEFAULT 0")])
     56     rank = IntegerField(constraints=[SQL("DEFAULT 0")], null=True)
     57 
     58     class Meta:
     59         table_name = 'region'
     60 
     61 
     62 class Scens(BaseModel):
     63     address = CharField(null=True)
     64     baidu_lat = DecimalField(constraints=[SQL("DEFAULT 0.0000000000")], null=True)
     65     baidu_lng = DecimalField(constraints=[SQL("DEFAULT 0.0000000000")], null=True)
     66     business_hours = CharField(null=True)
     67     characteristic_landscape = TextField(null=True)
     68     cid = IntegerField()
     69     cname = CharField()
     70     consumer_hotline = CharField(null=True)
     71     interpreter_description = CharField(null=True)
     72     management_agency = CharField(null=True)
     73     pid = IntegerField()
     74     pname = CharField()
     75     price = CharField(null=True)
     76     price_description = CharField(null=True)
     77     scenic_cover = CharField(null=True)
     78     scenic_introduction = TextField(null=True)
     79     scenic_level = IntegerField(null=True)
     80     scenic_site = CharField(null=True)
     81     scenic_spot_description = CharField(null=True)
     82     scenic_title = CharField(null=True)
     83     scenic_type = CharField(null=True)
     84     sid = AutoField()
     85     sname = CharField()
     86     supporting_facilities = TextField(null=True)
     87     tickets_incentives = TextField(null=True)
     88     tour_route = TextField(null=True)
     89     tour_time = CharField(null=True)
     90     tourist_service_center = TextField(null=True)
     91     traffic_guide = TextField(null=True)
     92     xid = IntegerField(constraints=[SQL("DEFAULT 0")], null=True)
     93     xname = CharField(constraints=[SQL("DEFAULT 'unkown'")], null=True)
     94 
     95     class Meta:
     96         table_name = 'scens'
     97 
     98 #图片处理
     99 def save_img(url):
    100     file_name = url.split('/')[-1]
    101 
    102     try:
    103         r = requests.get(url)
    104     except:
    105         print('远程连接错误')
    106         return -1
    107 
    108     try:
    109         with open(file_name, 'wb') as f:
    110             f.write(r.content)
    111     except:
    112         print('文件保存错误')
    113         return -1
    114 
    115 
    116 def upload_img(url):
    117     import os
    118     file_name = url.split('/')[-1]
    119 
    120     im = Image.open(file_name)
    121     w, h = im.size
    122     # print('Original image size: %sx%s' % (w, h))
    123     if w > 640:
    124         im.thumbnail((640, int(math.floor(640.00/w*h))))
    125         file_name = 'thumbnail.jpg'
    126         im.save(file_name, 'jpeg')
    127 
    128     # print os.getcwd()
    129     # os.chdir('%s/scenic_cover' % os.getcwd())
    130     folder = datetime.datetime.now().strftime('%Y%m/')
    131     data = {
    132         'ticket': 'EA8D6730-321B-4B11-9AA2-A925D6E0E91F',
    133         'dir': folder
    134     }
    135     new_file_name = '%s.%s' % (str(uuid.uuid4()), (file_name.split('.')[-1]).lower())
    136     files = {'myfile': (new_file_name, open(file_name, 'rb'), 'application/octet-stream', {})}
    137     r = requests.post('127.0.0.1/upload/save_remote', data=data, files=files)
    138     if r.text == 'true':
    139         return '%s%s' % (folder, new_file_name)
    140     else:
    141         print(r.text)
    142         return -1
    143 def qs(url):
    144     query = urlparse.urlparse(url).query
    145     return dict([(k, urlparse.unquote(v[0])) for k, v in urlparse.parse_qs(query).items()])
    146 #获取城市景区链接数据
    147 def get_city(city_index=0, pg=0, i=0, times=1):
    148     global city_id_sx, city_names
    149     #print city_id_sx
    150     print('33[0;31m')
    151     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)
    152     print('33[0m')
    153     print '---------------------->'
    154     url = 'http://www.uhenan.com/Interface/getData.ashx'
    155     #请求头
    156     headers = {
    157         'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36',
    158         'Referer':'http://www.uhenan.com/ScenicArea/List?t1=0&t2=1&t3=%200',
    159         'Host':'www.uhenan.com',
    160         'Origin':'http://www.uhenan.com',
    161         'Content-Type': 'application/x-www-form-urlencoded',
    162         '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'
    163     }
    164     try:
    165         #发送post请求
    166         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)
    167         print payload
    168         response = requests.post(url=url, headers=headers, timeout=10,data=payload)
    169         response.raise_for_status()
    170     except requests.exceptions.ConnectTimeout:
    171         print('get_city ConnectTimeout')
    172         exit(0)
    173     except requests.exceptions.Timeout:
    174         print('get_city Timeout')
    175         exit(0)
    176     except requests.exceptions.ConnectionError:
    177         print('get_city ConnectionError')
    178         exit(0)
    179     except requests.RequestException as e:
    180         if requests.status_code == 404:
    181             print('-' * 20)
    182             print(' 没有此页。')
    183             print('-' * 20)
    184         else:
    185             print 'get error:', e
    186             if item > 4:
    187                 exit(0)
    188             else:
    189                 tiems.sleep(1)
    190                 get_detail(cname, city, id, pg, times+1)
    191     else:
    192         #print response.content
    193         json_obj = json.loads(response.content)
    194         if len(json_obj['data']) == 0:
    195             print '<--- end: city_id:%d, city_name:%s' % (city_id_sx[city_index], city_names[city_index])
    196             if city_index < len(city_id_sx) - 1:
    197                 print '进入下一个市 ===>'
    198                 get_city(city_index+1, 0, 0, 1)
    199             else:
    200                 print '<=== 本省结束 ===>'
    201                 exit(0)
    202         for_i = 0
    203         for item in json_obj['data']:
    204             if i > for_i:
    205                 for_i = for_i + 1
    206                 continue
    207             #获取子链接
    208             #ID        = item['ID']
    209             #获取景区名字
    210             Title     = item['Title']
    211             #获取景区电话
    212             Phone     = item['Phone']
    213             #获取景区价格
    214             Ticket    = item['Ticket']
    215             str_first = re.sub('<.*?>',"",Ticket)
    216             str_enfin = str_first.replace('/n',"") 
    217             #获取景区介绍
    218             Introduction = item['Introduction']
    219             str_first = re.sub('<.*?>',"",Introduction)
    220             str_enfin_1 = str_first.replace('', '')
    221             str_enfin_2 = str_enfin_1.replace(' ', '')
    222             #获取景区地址
    223             Address   = item['Address']
    224             #获取百度坐标
    225             PointLng  = item['PointLng']
    226             PointLat  = item['PointLat']
    227             #获取图片地址:
    228             Logo      = item['Logo']
    229             http      = 'http://www.uhenan.com'
    230             url       = http + Logo
    231             print Title, str_enfin, Phone, Address, str_enfin_2, PointLng, PointLat, url
    232             # 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']
    233             #get_detail(city_names[city_index], city_ids[city_index], ID, pg, 1)
    234             time.sleep(1)
    235             for_i = for_i + 1
    236         get_city(city_index, pg+1, 0, 1)
    237 global city
    238 
    239 if __name__ == '__main__':
    240     city_index = 0
    241     page = 0
    242     index = 0
    243 
    244     if len(sys.argv) >= 3:
    245         city_index = int(sys.argv[1])
    246     if len(sys.argv) >= 4:
    247         page = int(sys.argv[2])
    248     if len(sys.argv) == 5:
    249         index = int(sys.argv[3])
    250     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

  • 相关阅读:
    nginx安装http2.0协议
    nginx内置变量 大全
    nginx全局查看进程
    Nginx1.14.2新增tcp/udp代理stream
    Nginx Location指令配置及常用全局变量
    Nginx配置udp/tcp代理
    ps -ef|grep详解
    centos7安装nginx(基础篇)
    js转义字符
    redis win连接以及配置连接密码
  • 原文地址:https://www.cnblogs.com/liuyu2014/p/11865502.html
Copyright © 2020-2023  润新知