爬蟲面試題


scrapy框架的工作流程?

  a、spider解析下載器下下來的response,返回item或是links
  b、item或者link經過spidermiddleware的process_spider_out( )方法,交給engine
  c、engine將item交給item pipeline ,將links交給調度器
  d、在調度器中,先將requests對象利用scrapy內置的指紋函數生成一個指紋對象
  e、如果requests對象中的don't filter參數設置為False,並且該requests對象的指紋不在信息指紋的隊列中,那么就把該request對象放到優先級隊列中
  f、從優先級隊列中獲取request對象,交給engine
  g、engine將request對象交給下載器下載,期間會通過downloadmiddleware的process_request方法
  h、下載器完成下載,獲得response對象,將該對象交給engine,期間會經過downloadmiddleware的            process_response( )方法
  i、engine將獲得的response對象交給spider進行解析,期間會經過spidermiddleware的process_spider_input()的方法
  j、從a開始循環
 

1,你了解的反爬機制,如何處理?

通過headers反爬蟲

ip的訪問頻率

動態加載數據,通過ajax請求數據,或者通過js代碼生成數據

部分數據加密處理

解決方法:  

對於基本網頁的抓取可以自定義headers,添加headers的數據
使用多個代理ip進行抓取或者設置抓取的頻率降低一些,
動態網頁的可以使用selenium + phantomjs 進行抓取
對部分數據進行加密的,可以使用selenium進行截圖,使用python自帶的pytesseract庫進行識別,但是比較慢最直接的方法是找到加密的方法進行逆向推理。

2,scrapy的基本架構

Scrapy Engine(引擎): 負責Spider、ItemPipeline、Downloader、Scheduler中間的通訊,信號、數據傳遞等。

Scheduler(調度器): 它負責接受引擎發送過來的Request請求,並按照一定的方式進行整理排列,入隊,當引擎需要時,交還給引擎。

Downloader(下載器):負責下載Scrapy Engine(引擎)發送的所有Requests請求,並將其獲取到的Responses交還給Scrapy Engine(引擎),由引擎交給Spider來處理,

Spider(爬蟲):它負責處理所有Responses,從中分析提取數據,獲取Item字段需要的數據,並將需要跟進的URL提交給引擎,再次進入Scheduler(調度器),

Item Pipeline(管道):它負責處理Spider中獲取到的Item,並進行進行后期處理(詳細分析、過濾、存儲等)的地方.

Downloader Middlewares(下載中間件):你可以當作是一個可以自定義擴展下載功能的組件。

Spider Middlewares(Spider中間件):你可以理解為是一個可以自定擴展和操作引擎和Spider中間通信的功能組件(比如進入Spider的Responses;和從Spider出去的Requests)

3,scrapy的去重原理

1.找到Request類:需要將dont_filter設置為False開啟去重,默認是True,沒有開啟去重;

2.對於每一個url的請求,調度器都會根據請求得相關信息加密得到一個指紋信息,並且將指紋信息和set()集合中的指紋信息進行比對,如果set()集合中已經存在這個數據,就不在將這個Request放入隊列中。如果set()集合中沒有存在這個加密后的數據,就將這個Request對象放入隊列中,等待被調度。

4,scrapy中間件有哪幾種類,你用過哪些?

下載中間件,爬蟲中間件

5,scrapy中間件在哪起的作用

爬蟲中間件:爬蟲發起請求request的時候調用,列如更換修改代理ip,修改UA,

下載器中間件:瀏覽器返回響應response的時候調用,無效的數據,特殊情況進行重試

6,為什么會用到代理?

如果你一直用同一個代理IP爬取這個網頁,很有可能IP會被禁止訪問網頁,所以,基本上做爬蟲的都躲不過去IP的問題。

7,代理怎么使用?

1,可以使用urllib2中的ProxyHandler來設置代理ip

 1 import urllib2
 2 
 3 # 構建了兩個代理Handler,一個有代理IP,一個沒有代理IP
 4 httpproxy_handler = urllib2.ProxyHandler({"http" : "124.88.67.81:80"})
 5 nullproxy_handler = urllib2.ProxyHandler({})
 6 #定義一個代理開關
 7 proxySwitch = True 
 8 # 通過 urllib2.build_opener()方法使用這些代理Handler對象,創建自定義opener對象
 9 # 根據代理開關是否打開,使用不同的代理模式
10 if proxySwitch:  
11     opener = urllib2.build_opener(httpproxy_handler)
12 else:
13     opener = urllib2.build_opener(nullproxy_handler)
14 
15 request = urllib2.Request("http://www.baidu.com/")
16 
17 # 使用opener.open()方法發送請求才使用自定義的代理,而urlopen()則不使用自定義代理。
18 response = opener.open(request)
19 
20 # 就是將opener應用到全局,之后所有的,不管是opener.open()還是urlopen() 發送請求,都將使用自定義代理。
21 # urllib2.install_opener(opener)
22 # response = urlopen(request)
23 
24 print response.read()
uillib2代理ip

2,使用requets代理

 1 import requests
 2 
 3 # 根據協議類型,選擇不同的代理
 4 proxies = {
 5   "http": "http://12.34.56.79:9527",
 6   "https": "http://12.34.56.79:9527",
 7 }
 8 
 9 response = requests.get("http://www.baidu.com", proxies = proxies)
10 print response.text
requests代理

8,代理失效了怎么處理?

1 1、將代理IP及其協議載入ProxyHandler賦給一個opener_support變量;2、將opener_support載入build_opener方法,創建opener;3、安裝opener。具體代碼如下:from urllib import requestdef ProxySpider(url, proxy_ip, header):opener_support = request.ProxyHandler({'http': proxy_ip}) opener = request.build_opener(opener_support) request.install_opener(opener) req = request.Request(url, headers=header)rsp = request.urlopen(req).read()return rsp
View Code

 

9,爬取過程中,登錄驗證碼如何處理?

抓取驗證碼圖,對接打碼平台進行處理返回
10,爬取速度過快,出現的驗證碼如何處理?

抓取驗證碼圖,對接打碼平台進行處理返回

11,如何用機器識別驗證碼?

對接打碼平台

12,cookie如何處理?

requests.session

13,如何處理網站加密傳參的情況?

簡單加密可以使用selenium,或者執行js,存儲cookie,手動修改cookie的值

也可以下載它們相關的APP

14,分布式的原理?

捅過重寫scheduler和spider類,實現了調度、spider啟動和redis的交互。實現新的dupefilter和queue類,達到了判重和調度容器和redis的交互,因為每個主機上的爬蟲進程都訪問同一個redis數據庫,所以調度和判重都統一進行統一管理,達到了分布式爬蟲的目的。

15,分布式如何判斷爬蟲已經停止了?

1 spider.getStatus();//獲取爬蟲狀態
2 spider.getStatus().equals(Spider.Status.Init);//運行中
View Code

16,爬取下來的數據如何選擇什么存儲方式會更好

針對數據而定。

18,動態加載的數據如何提取?

動態網頁的可以使用selenium + phantomjs 進行抓取

19,json數據如何提取?

json.loads, json.dumps

20,Python里面深拷貝,淺拷貝的區別?

淺拷貝不管幾層只會拷貝第一層

拷貝就是在內存中重新開辟一塊空間,不管數據結構多么復雜,只要遇到可能發生改變的數據類型,就重新開辟一塊內存空間把內容復制下來,直到最后一層,不再有復雜的數據類型,就保持其原引用。這樣,不管數據結構多么的復雜,數據之間的修改都不會相互影響

21,是否了解線程的同步和異步?

線程同步是多個線程同時訪問同一資源,等待資源訪問結束,浪費時間,效率低   

線程異步:訪問資源時在空閑等待時同時訪問其他資源,實現多線程機制

22,鏈表和順序表存儲時各自有什么特點?

順序表的優點是可以隨機訪問數據元素;

缺點是大小固定,不利於增刪結點。

鏈表的優點是采用指針方式增減結點,非常方便(只需要改變指針指向,不移動結點);

缺點是不能進行隨機訪問,另外,每個結點上增加指針域,造成額外存儲空間增大。

23,使用redis搭建分布式系統時如何處理網絡延遲和網絡異常?

由於網絡異常的存在,分布式系統中請求結果存在“三態”的概念,即三種狀態:“成功”、“失敗”、“超時(未知)”

當出現“超時”時可以通過發起讀取數據的操作以驗證 RPC 是否成功(例如銀行系統的做法)

另一種簡單的做法是,設計分布式協議時將執行步驟設計為可重試的,即具有所謂的“冪等性”

24,數據倉庫是什么?

數據倉庫是一個面向主題的、集成的、穩定的、反映歷史變化的、隨着時間的流逝發生變化的數據集合。它主要支持管理人員的決策分析。

數據倉庫收集了企業相關內部和外部各個業務系統數據源、歸檔文件等一系列歷史數據,最后轉化成企業需要的戰略決策信息。

  • 特點:

面向主題:根據業務的不同而進行的內容划分;
集成特性:因為不同的業務源數據具有不同的數據特點,當業務源數據進入到數據倉庫時,需要采用統一的編碼格式進行數據加載,從而保證數據倉庫中數據的唯一性;
非易失性:數據倉庫通過保存數據不同歷史的各種狀態,並不對數據進行任何更新操作。
歷史特性:數據保留時間戳字段,記錄每個數據在不同時間內的各種狀態。

25,假設有一個爬蟲程序,從網絡上的獲取的頻率快,本地寫入數據的頻率慢,使用什么數據結構比較好?

26,你是否了解谷歌的無頭瀏覽器?

無頭瀏覽器即headless browser,是一種沒有界面的瀏覽器。既然是瀏覽器那么瀏覽器該有的東西它都應該有,只是看不到界面而已。

Python中selenium模塊中的PhantomJS即為無界面瀏覽器(無頭瀏覽器):是基於QtWebkit的無頭瀏覽器,

27,你是否了解mysql數據庫的幾種引擎?

  • InnoDB:

InnoDB是一個健壯的事務型存儲引擎,這種存儲引擎已經被很多互聯網公司使用,為用戶操作非常大的數據存儲提供了一個強大的解決方案。

在以下場合下,使用InnoDB是最理想的選擇:

1.更新密集的表。InnoDB存儲引擎特別適合處理多重並發的更新請求。

2.事務。InnoDB存儲引擎是支持事務的標准MySQL存儲引擎。

3.自動災難恢復。與其它存儲引擎不同,InnoDB表能夠自動從災難中恢復。

4.外鍵約束。MySQL支持外鍵的存儲引擎只有InnoDB。

5.支持自動增加列AUTO_INCREMENT屬性。

一般來說,如果需要事務支持,並且有較高的並發讀取頻率,InnoDB是不錯的選擇。

  • MEMORY:

使用MySQL Memory存儲引擎的出發點是速度。為得到最快的響應時間,采用的邏輯存儲介質是系統內存。

雖然在內存中存儲表數據確實會提供很高的性能,但當mysqld守護進程崩潰時,所有的Memory數據都會丟失。

獲得速度的同時也帶來了一些缺陷。

一般在以下幾種情況下使用Memory存儲引擎:

1.目標數據較小,而且被非常頻繁地訪問。在內存中存放數據,所以會造成內存的使用,可以通過參數max_heap_table_size控制Memory表的大小,設置此參數,就可以限制Memory表的最大大小。

2.如果數據是臨時的,而且要求必須立即可用,那么就可以存放在內存表中。

3.存儲在Memory表中的數據如果突然丟失,不會對應用服務產生實質的負面影響。

28,redis數據庫有哪幾種數據結構?

5種數據結構

string 

使用string時,redis**大多數情況下**並不會理解或者解析其含義,無論使用json、xml還是純文本在redis看來都是一樣的,只是一個字符串,只能進行strlen、append等對字符串通用的操作,無法針對其內容進一步操作。其基本操作命令有set、get、strlen、getrange、append:

?
1
2
3
4
5
SET key value
GET key
STRLEN key
GETRANGE key start end
APPEND key value

在大多數情況之外,就是string中存儲的為純數字的情況,redis可以將字符串當做數字進行進一步操作,這些操作包括decr、decrby、incr、incrby和incrbyfloat。

hash

使用hash時,在我看來,就是value本身就是一組key-value對,不過redis將這里的key稱為field(但是hkeys命令為什么不叫hfields命令呢哈哈),也就是value是一組field-value對。其基本操作命令有hset、hget、hmset、hmget、hgetall、hkeys和hdel:

?
1
2
3
4
5
6
7
HSET key field value
HGET key field
HMSET key field value [field value ...]
HMGET key field [field ...]
HGETALL key
HKEYS key
HDEL key field [field ...]

list

使用list時,value就是一個string數組,操作這組string時,可以像對待棧一樣使用pop和push操作,但是這個棧兩端都能進行操作;也可以像對待數組一樣使用一個index參數來操作。list的操作命令略雜,主要分為兩類:L開頭的和R開頭的,L代表LEFT或者LIST,進行一些從列表左端進行的操作,或者一些與端無關的操作;R代表RIGHT,進行一些從列表右端進行的操作。 

set

set用於存儲一組不重復的值,也可以進行一些集合的操作,就像數學上的集合,它是無序的。基本操作有sadd和sismember:

 
1
2
SADD key member [member ...]
SISMEMBER key member

集合操作有:求交sinter、求並sunion和求差sdiff:

1
2
3
SINTER key [key ...]
SUNION key [key ...]
SDIFF key [key ...]

sorted set

sorted set類似set,但是sorted set里每個元素都有一個score,這個score可用於排序和排名。基本操作有zadd、zcount、zrank:

 
1
2
3
ZADD key score member [score member ...]
ZCOUNT key min max
ZRANK key member

29,對 __name__=='main'的理解

__name__是當前模塊名,當模塊被直接運行時模塊名為_main_,也就是當前的模塊,當模塊被導入時,模塊名就不是__main__,即代碼將不會執行。

30,python是如何進行內存管理的?

a、對象的引用計數機制
python內部使用引用計數,來保持追蹤內存中的對象,Python內部記錄了對象有多少個引用,即引用計數,當對象被創建時就創建了一個引用計數,當對象不再需要時,這個對象的引用計數為0時,它被垃圾回收。
b、垃圾回收
1>當一個對象的引用計數歸零時,它將被垃圾收集機制處理掉。
2>當兩個對象a和b相互引用時,del語句可以減少a和b的引用計數,並銷毀用於引用底層對象 的名稱。然而由於每個對象都包含一個對其他對象的應用,因此引用計數不會歸零,對象也不會銷毀。(從而導致內存泄露)。為解決這一問題,解釋器會定期執行一個循環檢測器,搜索不可訪問對象的循環並刪除它們。
c、內存池機制
Python提供了對內存的垃圾收集機制,但是它將不用的內存放到內存池而不是返回給操作系統。
1>Pymalloc機制。為了加速Python的執行效率,Python引入了一個內存池機制,用於管理 對小塊內存的申請和釋放。
2>Python中所有小於256個字節的對象都使用pymalloc實現的分配器,而大的對象則使用 系統的malloc。
3>對於Python對象,如整數,浮點數和List,都有其獨立的私有內存池,對象間不共享他們的內存池。也就是說如果你分配又釋放了大量的整數,用於緩存這些整數的內存就不能再分配給浮點數。

31,__new)_和__init__的區別

__new__:它是創建對象時調用,會返回當前對象的一個實例,可以用_new_來實現單例 

__init__:它是創建對象后調用,對當前對象的一些實例初始化,無返回值

32,常用的網絡爬取方法

  • 正則表達式

  • Beautiful Soup

  • Lxml

33,urllib 和urllib2的區別?

urllib 和urllib2都是接受URL請求的相關模塊,但是urllib2可以接受一個Request類的實例來設置URL請求的headers,urllib僅可以接受URL。urllib不可以偽裝你的User-Agent字符串。
urllib提供urlencode()方法用來GET查詢字符串的產生,而urllib2沒有。這是為何urllib常和urllib2一起使用的原因。

34,列舉爬蟲用到的網絡數據包,解析包?

  • 網絡數據包 urllib、urllib2、requests

  • 解析包 re、xpath、beautiful soup、lxml

35,手寫一個單列模式?

 1 lass Singleton(object):
 2     _instance = None
 3     def __new__(cls, *args, **kw):
 4         if not cls._instance:
 5             cls._instance = super(Singleton, cls).__new__(cls, *args, **kw)  
 6         return cls._instance  
 7 class MyClass(Singleton):  
 8     a = 1
 9 one = MyClass()
10 two = MyClass()
11 id(one) = id(two)
12 >>> True
單列模式

36,常用的網絡爬取方法?

urllib2 , Beautiful Soup  正則 xpath

37,代碼實現刪除list里面的重復元素

set

38,手寫代碼二分查找

39,python2和python3的區別

40,python的裝飾器 ,手寫

41,python常用的內置庫,

42,如何做增量式爬取?

去爬帖子列表頁, 每次都把當前頁的 url 和數據庫中的對比,如果沒有重復的說明,這一夜都是新的 URL,然后下一頁,直到出現部分重復或完全重復的頁面

43,簡述beautifulsoup模塊的作用及基本使用?

BeautifulSoup是一個模塊,該模塊用於接收一個HTML或XML字符串,然后將其進行格式化,之后遍可以使用他提供的方法進行快速查找指定元素,從而使得在HTML或XML中查找指定元素變得簡單。

44,seleniun模塊的作用及基本使用?

操作瀏覽器

45,scrapy如何實現大文件的下載?

當使用requests的get下載大文件/數據時,建議使用使用stream模式。

當把get函數的stream參數設置成False時,它會立即開始下載文件並放到內存中,如果文件過大,有可能導致內存不足。

當把get函數的stream參數設置成True時,它不會立即開始下載,當你使用iter_content或iter_lines遍歷內容或訪問內容屬性時才開始下載。需要注意一點:文件沒有下載之前,它也需要保持連接。

iter_content:一塊一塊的遍歷要下載的內容
iter_lines:一行一行的遍歷要下載的內容
使用上面兩個函數下載大文件可以防止占用過多的內存,因為每次只下載小部分數據。

示例代碼:

1 r = requests.get(url_file, stream=True)
2 f = open("file_path", "wb")
3 # chunk是指定每次寫入的大小,每次只寫了512byte
4 for chunk in r.iter_content(chunk_size=512):
5     if chunk:
6         f.write(chunk)
View Code

 

46,scrapy如何實現限速?

在settings里面, 
DOWNLOAD_DELAY = 0.25 # 250 ms of delay 

47,scrapy如何實現暫停爬蟲程序?

實現暫停與重啟記錄狀態

方法一:

1、首先cd進入到scrapy項目里(當然你也可以通過編寫腳本Python文件直接在pycharm中運行)

2、在scrapy項目里創建保存記錄信息的文件夾

3、執行命令:

  scrapy crawl 爬蟲名稱 -s JOBDIR=保存記錄信息的路徑

  如:scrapy crawl cnblogs -s JOBDIR=zant/001

  執行命令會啟動指定爬蟲,並且記錄狀態到指定目錄

爬蟲已經啟動,我們可以按鍵盤上的ctrl+c停止爬蟲,停止后我們看一下記錄文件夾,會多出3個文件,其中的requests.queue文件夾里的p0文件就是URL記錄文件,這個文件存在就說明還有未完成的URL,當所有URL完成后會自動刪除此文件

當我們重新執行命令:scrapy crawl cnblogs -s JOBDIR=zant/001  時爬蟲會根據p0文件從停止的地方開始繼續爬取。

方法二:

在settings.py文件里加入下面的代碼: 

JOBDIR='sharejs.com'
使用命令scrapy crawl somespider,就會自動生成一個sharejs.com的目錄,然后將工作列表放到這個文件夾里 

48,scrapy如何進行自定制指令?

單爬蟲運行

代碼:

1 import sys
2 from scrapy.cmdline import execute
3  
4 if __name__ == '__main__':
5     execute(["scrapy","crawl","chouti","--nolog"])
View Code

同時運行多個爬蟲

步驟如下:

- 在spiders同級創建任意目錄,如:commands
- 在其中創建 crawlall.py 文件 (此處文件名就是自定義的命令)
- 在settings.py 中添加配置 COMMANDS_MODULE = '項目名稱.目錄名稱'
- 在項目目錄執行命令:scrapy crawlall

代碼:

 1 from scrapy.commands import ScrapyCommand
 2     from scrapy.utils.project import get_project_settings
 3  
 4     class Command(ScrapyCommand):
 5  
 6         requires_project = True
 7  
 8         def syntax(self):
 9             return '[options]'
10  
11         def short_desc(self):
12             return 'Runs all of the spiders'
13  
14         def run(self, args, opts):
15             spider_list = self.crawler_process.spiders.list()
16             for name in spider_list:
17                 self.crawler_process.crawl(name, **opts.__dict__)
18             self.crawler_process.start()
19  
20 crawlall.py
View Code

49,scrapy如何實現記錄爬蟲的深度?

通過scrapy.CrawlSpider

50,scrapy中的pipelines工作原理?

當Item在Spider中被收集之后,它將會被傳遞到Item Pipeline,這些Item Pipeline組件按定義的順序處理Item。

每個Item Pipeline都是實現了簡單方法的Python類,比如決定此Item是丟棄而存儲。以下是item pipeline的一些典型應用:

  • 驗證爬取的數據(檢查item包含某些字段,比如說name字段)
  • 查重(並丟棄)
  • 將爬取結果保存到文件或者數據庫中

51,簡述scrapy爬蟲中間件和下載中間件的作用?

52,scrapy-redis組件的作用?

  • scheduler - 調度器
  • dupefilter - URL去重規則(被調度器使用)
  • pipeline   - 數據持久化

53,scrapy-redis組件中如何實現任務的去重?

  • dupefilter - URL去重規則(被調度器使用)

54,scrapy-redis的調度器如何實現任務的深度優先和廣度優先?

55,手寫正則匹配郵箱,手機號,一段html內容

56,robots協議是什么?

Robots協議(也稱為爬蟲協議、機器人協議等)的全稱是“網絡爬蟲排除標准”(Robots Exclusion Protocol),網站通過Robots協議告訴搜索引擎哪些頁面可以抓取,哪些頁面不能抓取。

57,常見的http狀態碼?

 1 一些常見的狀態碼為:
 2 200 - 服務器成功返回網頁
 3 404 - 請求的網頁不存在
 4 503 - 服務不可用
 5 詳細分解:
 6 1xx(臨時響應)
 7 表示臨時響應並需要請求者繼續執行操作的狀態代碼。
 8 
 9 代碼 說明
10 100 (繼續) 請求者應當繼續提出請求。服務器返回此代碼表示已收到請求的第一部分,正在等待其余部分。 
11 101 (切換協議) 請求者已要求服務器切換協議,服務器已確認並准備切換。
12 
13 2xx (成功)
14 表示成功處理了請求的狀態代碼。
15 
16 代碼 說明
17 200 (成功) 服務器已成功處理了請求。通常,這表示服務器提供了請求的網頁。
18 201 (已創建) 請求成功並且服務器創建了新的資源。
19 202 (已接受) 服務器已接受請求,但尚未處理。
20 203 (非授權信息) 服務器已成功處理了請求,但返回的信息可能來自另一來源。
21 204 (無內容) 服務器成功處理了請求,但沒有返回任何內容。
22 205 (重置內容) 服務器成功處理了請求,但沒有返回任何內容。
23 206 (部分內容) 服務器成功處理了部分 GET 請求。
24 3xx (重定向)
25 表示要完成請求,需要進一步操作。 通常,這些狀態代碼用來重定向。
26 
27 代碼 說明
28 300 (多種選擇) 針對請求,服務器可執行多種操作。服務器可根據請求者 (user agent) 選擇一項操作,或提供操作列表供請求者選擇。
29 301 (永久移動) 請求的網頁已永久移動到新位置。服務器返回此響應(對 GET 或 HEAD 請求的響應)時,會自動將請求者轉到新位置。
30 302 (臨時移動) 服務器目前從不同位置的網頁響應請求,但請求者應繼續使用原有位置來進行以后的請求。
31 303 (查看其他位置) 請求者應當對不同的位置使用單獨的 GET 請求來檢索響應時,服務器返回此代碼。
32 304 (未修改) 自從上次請求后,請求的網頁未修改過。服務器返回此響應時,不會返回網頁內容。
33 305 (使用代理) 請求者只能使用代理訪問請求的網頁。如果服務器返回此響應,還表示請求者應使用代理。
34 307 (臨時重定向) 服務器目前從不同位置的網頁響應請求,但請求者應繼續使用原有位置來進行以后的請求。
35 4xx(請求錯誤)
36 這些狀態代碼表示請求可能出錯,妨礙了服務器的處理。
37 
38 代碼 說明
39 400 (錯誤請求) 服務器不理解請求的語法。
40 401 (未授權) 請求要求身份驗證。 對於需要登錄的網頁,服務器可能返回此響應。
41 403 (禁止) 服務器拒絕請求。
42 404 (未找到) 服務器找不到請求的網頁。
43 405 (方法禁用) 禁用請求中指定的方法。
44 406 (不接受) 無法使用請求的內容特性響應請求的網頁。
45 407 (需要代理授權) 此狀態代碼與 401(未授權)類似,但指定請求者應當授權使用代理。
46 408 (請求超時) 服務器等候請求時發生超時。
47 409 (沖突) 服務器在完成請求時發生沖突。服務器必須在響應中包含有關沖突的信息。
48 410 (已刪除) 如果請求的資源已永久刪除,服務器就會返回此響應。
49 411 (需要有效長度) 服務器不接受不含有效內容長度標頭字段的請求。
50 412 (未滿足前提條件) 服務器未滿足請求者在請求中設置的其中一個前提條件。
51 413 (請求實體過大) 服務器無法處理請求,因為請求實體過大,超出服務器的處理能力。
52 414 (請求的 URI 過長) 請求的 URI(通常為網址)過長,服務器無法處理。
53 415 (不支持的媒體類型) 請求的格式不受請求頁面的支持。
54 416 (請求范圍不符合要求) 如果頁面無法提供請求的范圍,則服務器會返回此狀態代碼。
55 417 (未滿足期望值) 服務器未滿足"期望"請求標頭字段的要求.
56 5xx(服務器錯誤)
57 這些狀態代碼表示服務器在嘗試處理請求時發生內部錯誤。 這些錯誤可能是服務器本身的錯誤,而不是請求出錯。
58 
59 代碼 說明
60 500 (服務器內部錯誤) 服務器遇到錯誤,無法完成請求。
61 501 (尚未實施) 服務器不具備完成請求的功能。例如,服務器無法識別請求方法時可能會返回此代碼。
62 502 (錯誤網關) 服務器作為網關或代理,從上游服務器收到無效響應。
63 503 (服務不可用) 服務器目前無法使用(由於超載或停機維護)。通常,這只是暫時狀態。
64 504 (網關超時) 服務器作為網關或代理,但是沒有及時從上游服務器收到請求。
65 505 (HTTP 版本不受支持) 服務器不支持請求中所用的 HTTP 協議版本。
66 HttpWatch狀態碼Result is
67 200 - 服務器成功返回網頁,客戶端請求已成功。 
68 302 - 對象臨時移動。服務器目前從不同位置的網頁響應請求,但請求者應繼續使用原有位置來進行以后的請求。
69 304 - 屬於重定向。自上次請求后,請求的網頁未修改過。服務器返回此響應時,不會返回網頁內容。
70 401 - 未授權。請求要求身份驗證。 對於需要登錄的網頁,服務器可能返回此響應。
71 404 - 未找到。服務器找不到請求的網頁。
72 2xx - 成功。表示服務器成功地接受了客戶端請求。
73 3xx - 重定向。表示要完成請求,需要進一步操作。客戶端瀏覽器必須采取更多操作來實現請求。例如,瀏覽器可能不得不請求服務器上的不同的頁面,或通過代理服務器重復該請求。
74 4xx - 請求錯誤。這些狀態代碼表示請求可能出錯,妨礙了服務器的處理。
75 5xx - 服務器錯誤。表示服務器在嘗試處理請求時發生內部錯誤。 這些錯誤可能是服務器本身的錯誤,而不是請求出錯。
View Code

58,http的請求和響應都包含哪些內容?

 1 每個HTTP請求和響應都會帶有相應的頭部信息。默認情況下,在發送XHR請求的同時,還會發送下列頭部信息:
 2 
 3 Accept:瀏覽器能夠處理的內容類型
 4 Accept-Charset:瀏覽器能夠顯示的字符集
 5 Accept-Encoding:瀏覽器能夠處理的壓縮編碼
 6 Accept-Language:瀏覽器當前設置的語言
 7 Connection:瀏覽器與服務器之間連接的類型
 8 Cookie:當前頁面設置的任何Cookie
 9 Host:發出請求的頁面所在的域
10 Referer:發出請求的頁面的URL
11 User-Agent:瀏覽器的用戶代理字符串
12 例如:chrome下的請求頭信息:
13 
14 15 
16 雖然不同瀏覽器實際發送的頭部信息會有所不同,但以上列出的基本上是瀏覽器都會發送的,用setRequestHeader()方法也可以設置請求頭信息,該函數接受兩個參數:頭部字段的名稱和頭部字段的值。要成功發送請求頭部信息,需在調用open方法之后且調用send方法之前調用。
17 
18  
19 
20 HTTP響應頭部信息:
21 
22 Date:表示消息發送的時間,時間的描述格式由rfc822定義
23 server:服務器名字。
24 Connection:瀏覽器與服務器之間連接的類型
25 content-type:表示后面的文檔屬於什么MIME類型
26 Cache-Control:控制HTTP緩存
27 以上是基本常見的信息
28 
29 
30 
31  以上Expires 頭部字段提供一個日期和時間,響應在該日期和時間后被認為失效
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM