發現問題
今天覆原一個古老項目時,一直遇到了一個問題,Scrapy一直提示下載某鏈接時出錯了,報錯信息如下:
[<twisted.python.failure.Failure twisted.internet.error.ConnectionDone: Connection was closed cleanly.>]
這個錯誤以前也遇到過,但是並不知道如何去解決,去Google,有人說是加UA頭,有人說是代理問題,專門用curl去測試代理,發現代理是OK的。
然後去檢查UserAgent,試過各種發現均不行,
headers = { 'User-Agent': "xxxxx", 'Content-Type': "text/plain; charset=UTF-8", 'Host': "xxxx", 'Cache-Control': "no-cache",}
最後發現是Host不對,註釋Host之後,發現就可以正常的採集數據了。然後重新抓包看了下該請求,發現Host已經更換,由於對Host不熟,所以專門寫一篇來記錄下,順便複習下HTTP協議。
Host 字段
Host說明
服務器的域名(用於虛擬主機 ),以及服務器所監聽的傳輸控制協議端口號。如果所請求的端口是對應的服務的標準端口,則端口號可被省略。自超文件傳輸協議版本1.1(HTTP/1.1)開始便是必需字段。
Host 示例
Host: en.wikipedia.org:80 Host: en.wikipedia.org
狀態爲:常設
來源:HTTP頭字段
這篇文章講的很清楚:網絡---一篇文章詳解請求頭Host的概念
https://blog.csdn.net/netdxy/article/details/51195560
總結
- host字段可以是域名,也可以是ip地址。host字段域名/ip後可以跟端口號,如Host: www.6san.com:8080
- host可以由程序自定義,某些程序爲了防止運營商或防火牆攔截會定義虛假host
- http1.1中host字段可以是空值,http1.0中可以缺失host字段
- http響應頭中不包含host字段,所以wireshark中http.host過濾到的都是請求包
- 因爲http頭中的host字段可以由程序自定義,所以host字段的值就會有很多特殊情況,如包含多個’/'字符的HOST頭信息,結尾含有”.”等
在http 1.1中不能缺失host字段,如果缺失,,服務器返回400 bad request,http1.1中不能缺失host字段,但host字段可以是空值。