爬蟲面試題

scrapy框架的工做流程?html

  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,你瞭解的反爬機制,如何處理?python

經過headers反爬蟲mysql

ip的訪問頻率ajax

動態加載數據,經過ajax請求數據,或者經過js代碼生成數據正則表達式

部分數據加密處理redis

解決方法:  sql

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

2,scrapy的基本架構數據庫

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

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、urllib二、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如何實現暫停爬蟲程序?

實現暫停與重啓記錄狀態

方法一:

一、首先cd進入到scrapy項目裏(固然你也能夠經過編寫腳本Python文件直接在pycharm中運行)

二、在scrapy項目裏建立保存記錄信息的文件夾

三、執行命令:

  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
相關文章
相關標籤/搜索