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