Scrapy報錯 Connection was closed 解決方法

發現問題

今天覆原一個古老項目時,一直遇到了一個問題,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

總結

  1. host字段可以是域名,也可以是ip地址。host字段域名/ip後可以跟端口號,如Host: www.6san.com:8080
  2. host可以由程序自定義,某些程序爲了防止運營商或防火牆攔截會定義虛假host
  3. http1.1中host字段可以是空值,http1.0中可以缺失host字段
  4. http響應頭中不包含host字段,所以wireshark中http.host過濾到的都是請求包
  5. 因爲http頭中的host字段可以由程序自定義,所以host字段的值就會有很多特殊情況,如包含多個’/'字符的HOST頭信息,結尾含有”.”等

在http 1.1中不能缺失host字段,如果缺失,,服務器返回400 bad request,http1.1中不能缺失host字段,但host字段可以是空值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章