# 2.1.5 請求
## Request
Request,即請求,由客戶端向服務端發出。
Request 有四部分內容:
* Request Method\(請求方式\)
* Request URL\(請求鏈接\)
* Request Headers\(請求頭\)
* Request Body\(請求體\)
## Request Method
請求方式中有兩種常見的類型:GET和POST
_GET:_從指定的資源請求數據。比如在谷歌中直接搜索花,這便發起了一個get請求,請求的參數會直接包含到url中,如:[https://www.google.com.hk/search?q=花&oq=花&aqs=chrome..69i57j69i60l4.5466j0j7&sourceid=chrome&ie=UTF-8,url中包含了請求的參數信息,這里的參數q就是搜索的關鍵字](https://www.google.com.hk/search?q=花&oq=花&aqs=chrome..69i57j69i60l4.5466j0j7&sourceid=chrome&ie=UTF-8,url中包含了請求的參數信息,這里的參數q就是搜索的關鍵字)
_POST:_向指定的資源提交要被處理的數據。POST 請求大多為表單提交發起,如一個登錄表單,輸入用戶名密碼,點擊登錄按鈕,這通常會發起一個 POST 請求,其數據通常以 Form Data 即表單的形式傳輸,不會體現在 URL 中。
GET 和 POST 請求方法有如下區別:
* GET 方式請求中參數是包含在 URL 里面的,數據可以在 URL 中看到,而 POST 請求的 URL 不會包含這些數據,數據都是通過表單的形式傳輸,會包含在 Request Body 中。
* GET 方式請求提交的數據最多只有 1024 字節,而 POST 方式沒有限制。
請求方式以及描述
| 方法 |
| :--- |
| | 描述 |
| :--- | :--- |
| GET | 請求指定的頁面信息,并返回實體主體。 |
| HEAD | 類似于 GET 請求,只不過返回的響應中沒有具體的內容,用于獲取報頭。 |
| POST | 向指定資源提交數據進行處理請求,數據被包含在請求體中。 |
| PUT | 從客戶端向服務器傳送的數據取代指定的文檔的內容。 |
| DELETE | 請求服務器刪除指定的頁面。 |
| CONNECT | HTTP/1.1 協議中預留給能夠將連接改為管道方式的代理服務器。 |
| OPTIONS | 允許客戶端查看服務器的性能。 |
| TRACE | 回顯服務器收到的請求,主要用于測試或診斷。 |
本表參考:[http://www.runoob.com/http/http-methods.html](http://www.runoob.com/http/http-methods.html)
### Request URL {#request-url}
請求的網址,即統一資源定位符,用 URL 可以唯一確定我們想請求的資源。
### Request Headers {#request-headers}
請求頭,用來說明服務器要使用的附加信息,比較重要的信息有 Cookie、Referer、User-Agent 等,下面將一些常用的頭信息說明如下:
* Accept,請求報頭域,用于指定客戶端可接受哪些類型的信息。
* Accept-Language,指定客戶端可接受的語言類型。
* Accept-Encoding,指定客戶端可接受的內容編碼。
* Host,用于指定請求資源的主機 IP 和端口號,其內容為請求 URL 的原始服務器或網關的位置。從 HTTP 1.1 版本開始,Request 必須包含此內容。
* Cookie,也常用復數形式 Cookies,是網站為了辨別用戶進行 Session 跟蹤而儲存在用戶本地的數據。Cookies 的主要功能就是維持當前訪問會話。
* Referer,此內容用來標識這個請求是從哪個頁面發過來的,服務器可以拿到這一信息并做相應的處理,如做來源統計、做防盜鏈處理等。
* User-Agent,簡稱 UA,它是一個特殊字符串頭,使得服務器能夠識別客戶使用的操作系統及版本、瀏覽器及版本等信息。在做爬蟲時加上此信息可以偽裝為瀏覽器,如果不加很可能會被識別出為爬蟲。
* Content-Type,即 Internet Media Type,互聯網媒體類型,也叫做 MIME 類型,在 HTTP 協議消息頭中,使用它來表示具體請求中的媒體類型信息。例如 text/html 代表 HTML 格式,image/gif 代表 GIF 圖片,application/json 代表 Json 類型,更多對應關系可以查看此對照表:[http://tool.oschina.net/commons](http://tool.oschina.net/commons)。
Request Headers 是 Request 等重要組成部分,在寫爬蟲的時候大部分情況都需要設定 Request Headers。
### Request Body {#request-body}
即請求體,一般承載的內容是 POST 請求中的 Form Data,即表單數據,而對于 GET 請求 Request Body 則為空。
下面列出了 Content-Type 和 POST 提交數據方式的關系:
| Content-Type | 提交數據方式 |
| :--- | :--- |
| application/x-www-form-urlencoded | Form 表單提交 |
| multipart/form-data | 表單文件上傳提交 |
| application/json | 序列化 Json 數據提交 |
| text/xml | XML 數據提交 |
在爬蟲中如果我們要構造 POST 請求需要注意這幾種 Content-Type,了解各種請求庫的各個參數設置時使用的是哪種 Content-Type,不然可能會導致 POST 提交后得不到正常的 Response。
- 介紹
- 1.開發環境配置
- 1.1 python3的安裝
- 1.1.1 windows下的安裝
- 1.1.2 Linux下的安裝
- 1.1.3 Mac下的安裝
- 1.2 請求庫的安裝
- 1.2.1 requests的安裝
- 1.2.2 selenium的安裝
- 1.2.3 ChromeDriver的安裝
- 1.2.4 GeckoDriver 的安裝
- 1.2.5 PhantomJS的安裝
- 1.2.6 aiohttp的安裝
- 1.3 解析庫的安裝
- 1.3.1 lxml的安裝
- 1.3.2 Beautiful Soup的安裝
- 1.3.3 pyquery的安裝
- 1.3.4 tesserocr的安裝
- 1.4 數據庫的安裝
- 1.4.1 MySQL的安裝
- 1.4.2 MongoDB的安裝
- 1.4.3 Redis的安裝
- 1.5 存儲庫的安裝
- 1.5.1 PyMySQL的安裝
- 1.5.2 PyMongo的安裝
- 1.5.3 redis-py的安裝
- 1.5.4 RedisDump的安裝
- 1.6 Web庫的安裝
- 1.6.1 Flask的安裝
- 1.6.2 Tornado的安裝
- 1.7 App爬取相關庫的安裝
- 1.7.1 Charles的安裝
- 1.7.2 mitmproxy的安裝
- 1.7.3 Appium的安裝
- 1.8 爬蟲框架的安裝
- 1.8.1 pyspider的安裝
- 1.8.2 Scrapy的安裝
- 1.8.3 Scrapy-Splash的安裝
- 1.8.4 ScrapyRedis的安裝
- 1.9 布署相關庫的安裝
- 1.9.1 Docker的安裝
- 1.9.2 Scrapyd的安裝
- 1.9.3 ScrapydClient的安裝
- 1.9.4 ScrapydAPI的安裝
- 1.9.5 Scrapyrt的安裝
- 1.9.6-Gerapy的安裝
- 2.爬蟲基礎
- 2.1 HTTP 基本原理
- 2.1.1 URI和URL
- 2.1.2 超文本
- 2.1.3 HTTP和HTTPS
- 2.1.4 HTTP請求過程
- 2.1.5 請求
- 2.1.6 響應
- 2.2 網頁基礎
- 2.2.1網頁的組成
- 2.2.2 網頁的結構
- 2.2.3 節點樹及節點間的關系
- 2.2.4 選擇器
- 2.3 爬蟲的基本原理
- 2.3.1 爬蟲概述
- 2.3.2 能抓怎樣的數據
- 2.3.3 javascript渲染的頁面
- 2.4 會話和Cookies
- 2.4.1 靜態網頁和動態網頁
- 2.4.2 無狀態HTTP
- 2.4.3 常見誤區
- 2.5 代理的基本原理
- 2.5.1 基本原理
- 2.5.2 代理的作用
- 2.5.3 爬蟲代理
- 2.5.4 代理分類
- 2.5.5 常見代理設置
- 3.基本庫使用
- 3.1 使用urllib
- 3.1.1 發送請求
- 3.1.2 處理異常
- 3.1.3 解析鏈接
- 3.1.4 分析Robots協議
- 3.2 使用requests
- 3.2.1 基本用法
- 3.2.2 高級用法
- 3.3 正則表達式
- 3.4 抓取貓眼電影排行
- 4.解析庫的使用
- 4.1 使用xpath
- 4.2 使用Beautiful Soup
- 4.3 使用pyquery
- 5.數據存儲
- 5.1 文件存儲
- 5.1.1 TXT 文件存儲
- 5.1.2 JSON文件存儲
- 5.1.3 CSV文件存儲
- 5.2 關系型數據庫存儲
- 5.2.1 MySQL的存儲
- 5.3 非關系數據庫存儲
- 5.3.1 MongoDB存儲
- 5.3.2 Redis存儲
- 6.Ajax數據爬取
- 6.1 什么是Ajax
- 6.2 Ajax分析方法
- 6.3 Ajax結果提取
- 6.4 分析Ajax爬取今日頭條街拍美圖
- 7.動態渲染頁面爬取
- 7.1 Selenium的使用
- 7.2 Splash的使用
- 7.3 Splash負載均衡配置
- 7.4 使用selenium爬取淘寶商品
- 8.驗證碼的識別
- 8.1 圖形驗證碼的識別
- 8.2 極驗滑動驗證碼的識別
- 8.3 點觸驗證碼的識別
- 8.4微博宮格驗證碼的識別
- 9.代理的使用
- 9.1 代理的設置
- 9.2 代理池的維護
- 9.3 付費代理的使用
- 9.4 ADSL撥號代理
- 9.5 使用代理爬取微信公總號文章
- 10.模擬登錄
- 10.1 模擬登陸并爬去GitHub
- 10.2 Cookies池的搭建
- 11.App的爬取
- 11.1 Charles的使用
- 11.2 mitmproxy的使用
- 11.3 mitmdump“得到”App電子書信息
- 11.4 Appium的基本使用
- 11.5 Appnium爬取微信朋友圈
- 11.6 Appium+mitmdump爬取京東商品
- 12.pyspider框架的使用
- 12.1 pyspider框架介紹
- 12.2 pyspider的基本使用
- 12.3 pyspider用法詳解
- 13.Scrapy框架的使用
- 13.1 scrapy框架介紹
- 13.2 入門
- 13.3 selector的用法
- 13.4 spider的用法
- 13.5 Downloader Middleware的用法
- 13.6 Spider Middleware的用法
- 13.7 Item Pipeline的用法
- 13.8 Scrapy對接Selenium
- 13.9 Scrapy對接Splash
- 13.10 Scrapy通用爬蟲
- 13.11 Scrapyrt的使用
- 13.12 Scrapy對接Docker
- 13.13 Scrapy爬取新浪微博
- 14.分布式爬蟲
- 14.1 分布式爬蟲原理
- 14.2 Scrapy-Redis源碼解析
- 14.3 Scrapy分布式實現
- 14.4 Bloom Filter的對接
- 15.分布式爬蟲的部署
- 15.1 Scrapyd分布式部署
- 15.2 Scrapyd-Client的使用
- 15.3 Scrapyd對接Docker
- 15.4 Scrapyd批量部署
- 15.5 Gerapy分布式管理
- 微信公總號文章實戰
- 源碼
- other