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标准对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,是正常的。⽹上的东西,哪怕是Wikipedia上的,也不能信。
2.服务器。URL长了,对服务器处理也是⼀种负担。原本⼀个会话就没有多少数据,现在如果有⼈恶意地构造⼏个⼏M⼤⼩的URL,并不停地访问你的服务器。服务器的最
⼤并发数显然会下降。另⼀种攻击⽅式是,把告诉服务器Content-Length是⼀个很⼤的数,然后只给服务器发⼀点⼉数据,嘿嘿,服务器你就傻等着去吧。哪怕你有超时设置,这种故意的次次访问超时也能让服务器吃不了兜着⾛。有鉴于此,多数服务器出于安全啦、稳定啦⽅⾯的考虑,会给URL长度加限制。但是这个限制是针对所有HTTP 请求的,与GET、POST没有关系。
好了关于 GET 和 POST 就说这些。
接下来我们爬取某个⽹站⽹站的数据。⾸先我们分析⼀些⽹站的结构,发现该⽹站使⽤ajax请求post提交⽅式获取数据。
1# coding=utf-8
2import requests
3import json
4import time
5import re
6import datetime
7import time
8import sys
9import math
10import shutil
11import urlparse
12from pyquery import PyQuery as pq
13from peewee import *
14
15 sys.setrecursionlimit(100000)
16 reload(sys)
17 sys.setdefaultencoding('utf8')
18 str.decode('UTF-8')
19
20#定义全局变量
21global city_sx
22global city_ids
23global city_names
24global city_id_sx
25global 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
44class UnknownField(object):
45def__init__(self, *_, **__): pass
46
47
48class BaseModel(Model):
49class Meta:
50 database = database
51
52
53class Region(BaseModel):
54 name = CharField()
55 parent_id = IntegerField(constraints=[SQL("DEFAULT 0")])
56 rank = IntegerField(constraints=[SQL("DEFAULT 0")], null=True)
57
58class Meta:
59 table_name = 'region'
60
61
62class 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
95class Meta:
96 table_name = 'scens'
97
98#图⽚处理
99def save_img(url):
100 file_name = url.split('/')[-1]
101
102try:
103 r = (url)
104except:
105print('远程连接错误')
106return -1
107
108try:
109 with open(file_name, 'wb') as f:
110 f.t)
111except:
112print('⽂件保存错误')
113return -1
114
115
116def upload_img(url):
117import 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))
123if 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# wd()
129# os.chdir('%s/scenic_cover' % os.getcwd())
130 folder = w().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)
== 'true':
139return'%s%s' % (folder, new_file_name)
140else:
)
142return -1
143def qs(url):
144 query = urlparse.urlparse(url).query
145return dict([(k, urlparse.unquote(v[0])) for k, v in urlparse.parse_qs(query).items()])
146#获取城市景区链接数据
147def get_city(city_index=0, pg=0, i=0, times=1):
148global city_id_sx, city_names
149#print city_id_sx
150print('\033[0;31m')
151print'当前: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) 152print('\033[0m')
153print'---------------------->'
154 url = 'www.uhenan/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':'www.uhenan/ScenicArea/List?t1=0&t2=1&t3=%200',连接apple id服务器时出错
159'Host':'www.uhenan',
160'Origin':'www.uhenan',
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 }
164try:
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)
167print payload
168 response = requests.post(url=url, headers=headers, timeout=10,data=payload)
169 response.raise_for_status()
ptions.ConnectTimeout:
171print('get_city ConnectTimeout')
172 exit(0)
ptions.Timeout:
174print('get_city Timeout')
175 exit(0)
ptions.ConnectionError:
177print('get_city ConnectionError')
178 exit(0)
179except requests.RequestException as e:
180if requests.status_code == 404:
181print('-' * 20)
182print(' 没有此页。')
183print('-' * 20)
184else:
185print'get error:', e
186if item > 4:
187 exit(0)
188else:
189 tiems.sleep(1)
190 get_detail(cname, city, id, pg, times+1)
191else:
192#t
193 json_obj = json.t)
194if len(json_obj['data']) == 0:
195print'<--- end: city_id:%d, city_name:%s' % (city_id_sx[city_index], city_names[city_index])
196if city_index < len(city_id_sx) - 1:
197print'进⼊下⼀个市 ===>'
198 get_city(city_index+1, 0, 0, 1)
199else:
200print'<=== 本省结束 ===>'
201 exit(0)
202 for_i = 0
203for item in json_obj['data']:
204if i > for_i:
205 for_i = for_i + 1
206continue
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 = place('/n',"")
217#获取景区介绍
218 Introduction = item['Introduction']
219 str_first = re.sub('<.*?>',"",Introduction)
220 str_enfin_1 = place(' ', '')
221 str_enfin_2 = str_place('', '')
222#获取景区地址
223 Address = item['Address']
224#获取百度坐标
225 PointLng = item['PointLng']
226 PointLat = item['PointLat']
227#获取图⽚地址:
228 Logo = item['Logo']
229 http = 'www.uhenan'
230 url = http + Logo
231print 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)
237global city
238
239if__name__ == '__main__':
240 city_index = 0
241 page = 0
242 index = 0
243
244if len(sys.argv) >= 3:
245 city_index = int(sys.argv[1])
246if len(sys.argv) >= 4:
247 page = int(sys.argv[2])
248if len(sys.argv) == 5:
249 index = int(sys.argv[3])
250 get_city(city_index, page, index, 1)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论