import json
import requests
import pymysql
url = 'https://xueqiu.com/v4/statuses/public_timeline_by_category.json?since_id=-1&max_id=-1&count=10&category=111'
headers = {
'Cookie': 'aliyungf_tc=AQAAALoQF3p02gsAUhVFebQ3uBBNZn+H; xq_a_token=584d0cf8d5a5a9809761f2244d8d272bac729ed4; xq_a_token.sig=x0gT9jm6qnwd-ddLu66T3A8KiVA; xq_r_token=98f278457fc4e1e5eb0846e36a7296e642b8138a; xq_r_token.sig=2Uxv_DgYTcCjz7qx4j570JpNHIs; _ga=GA1.2.516718356.1534295265; _gid=GA1.2.1050085592.1534295265; u=301534295266356; device_id=f5c21e143ce8060c74a2de7cbcddf0b8; Hm_lvt_1db88642e346389874251b5a1eded6e3=1534295265,1534295722; Hm_lpvt_1db88642e346389874251b5a1eded6e3=1534295722',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
}
while True:
response = requests.get(url,headers=headers)
res_dict = json.loads(response.text)
next_id = res_dict['next_max_id']
next_url = 'https://xueqiu.com/v4/statuses/public_timeline_by_category.json?since_id=-1&max_id='+str(next_id)+'&count=10&category=111'
url = next_url
list_list = res_dict['list']
for list_item in list_list:
data_str = list_item['data']
data_str = json.loads(data_str)
s_id = data_str['id']
s_title = data_str['title']
s_description = data_str['description']
s_target = data_str['target']
#写入mysql
db = pymysql.connect(host='127.0.0.1',user='root',password='123456',port='3306',database='xueqiu',charset='utf-8')
cursor = db.cursor(www.leyouzaixian2.com)
sql = "insert into iceball values (null ,'{}','{}','{}','{}')".format(s_id,s_title,s_description,s_target)
cursor.execute(sql)
db.commit(www.yigouyule2.cn)
cursor.close()
db.close(www.hjylp178.com)
# 写入文件版本
# temp = str(s_id) + ' ' + str(s_title) + ' ' + str(s_description) + ' ' + s_target
# print(temp)
# with open('xinwen.html','a',encoding='utf-8') as f:
# f.write(temp + '\n')
---------------------
这个例子和第一个例子相比,惟一不一样就是ngx.say输出内容长了很多,咱们发现浏览器先收到全部的hello,接着又收到了"the world" 。然而若是咱们把4000改成小一点的值如2000(不一样配置这个相对大小或有不一样),那么仍然会出现先停顿3s,而后全部"hello"连同最后"the world"一块儿输出的状况。
经过以上三个例子,咱们能够得出下面的结论:
ngx.say和ngx.print的同步和异步
nginx有个输出缓冲(system send buffer),如16k。ngx.say和ngx.print默认是向这个输出缓冲写入数据,若是没有显示的调用ngx.flush,那么在content阶段结束后输出缓冲会写入客户端;
若是没有ngx.flush也没有到结束阶段,但若是输出缓冲区满了,那么也会输出到客户端;
所以ngx.say和ngx.print的默认向客户端的输出都是异步的,非实时性的,改变这一行为的是ngx.flush,能够作到同步和实时输出。这在流式输出,好比下载大文件时很是有用。
ngx.flush的同步和异步
lua-nginx也提到了ngx.flush的同步和异步。某一个ngx.say或者ngx.print调用后,这部分输出内容会写到输出缓冲区,同步的方式ngx.flush(true)会等到内容所有写到缓冲区再输出到客户端,而异步的方式ngx.flush()会将内容一边写到缓冲区,而缓冲区则一边将这些内容输出到客户端。
openresty和nginx流式输出的比较
流式输出,或者大文件的下载,nginx的upstream模块已经作得很是好,能够经过proxy_buffering|proxy_buffer_size|proxy_buffers 等指令精细调控,并且这些指令的默认值已经作了妥善处理。咱们来看看这些指令以及默认值:
proxy_buffering on;
proxy_buffer_size 4k|8k;
proxy_buffers 8 4k|8k;
proxy_busy_buffers_size 8k|16k;
proxy_temp_path proxy_temp;
proxy_buffering on表示内存作总体缓冲,内存不够时多余的存在由proxy_temp_path指定的临时文件中,off表示不作任何输出缓冲,从上游响应中接收一点就向客户端输出一点
proxy_buffer_size和proxy_buffers都是指定内存缓冲区的大小,默认为一页的大小,proxy_buffers还能够指定这样的缓冲区的个数
proxy_busy_buffers_size 这个"busy"看得出,这个指令必定是用在比较繁忙的时候了。在比较繁忙的时候(高并发或者大文件下载)时,就没有必要等到上游响应所有来了再发给客户端,能够来了一部分(proxy_busy_buffers_size)就发过去。于此同时,缓冲区的另外部分能够继续读。若是内存缓冲区不够用了,还能够开启文件缓冲区
proxy_temp_path 使用文件做为接受上游请求的缓冲区buffer,当内存不够用时启用
openresty的怎么作到过大响应的输出呢? 《OpenResty 最佳实践》 提到了两种状况:
输出内容自己体积很大,例如超过 2G 的文件下载
输出内容自己是由各类碎片拼凑的,碎片数量庞大
前面一种状况很是常见,后面一种状况好比上游已经开启Chunked的传输方式,并且每片chunk很是小。笔者就遇到了一个上游服务器经过Chunked分片传输日志,而为了节省上游服务器的内存将每片设置为一行日志,通常也就几百字节,这就太“碎片”了,通常日志总在几十到几百M,这么算下来chunk数量多大10w+。笔者用了resty.http来实现文件的下载,文件总大小48M左右。
local http = require "resty.http"
local httpc = http.new()
httpc:set_timeout(6000)
httpc:connect(host, port)
local client_body_reader, err = httpc:get_client_body_reader()
local res, err = httpc:request({
version = 1.1,
method = ngx.var.request_method,
path = ngx.var.app_uri,
headers = headers,
query = ngx.var.args,
body = client_www.dfgjpt.com body_reader
})
if not res www.hjshidpt.com then
ngx.say("Failed www.huarenyl.cn to request ".www.furong157.com. ngx.var.app_name .." server: ", err)
return
end
-- Response status
ngx.status = res.status
-- Response headers
for k, v in pairs(res.headers) do
if k ~= "Transfer-www.michenggw.com/ Encoding" then --必须删除上游Transfer-Encoding响应头
ngx.header[k] = v
end
endhtml