'Python爬蟲面試總結「值得一看」'

"

1. 寫一個郵箱地址的正則表達式?

[A-Za-z0-9\\\一-\\\龥]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$

2. 談一談你對 Selenium 和 PhantomJS 瞭解

Selenium 是一個Web 的自動化測試工具,可以根據我們的指令,讓瀏覽器自動加載頁面,獲取需要的數據,甚至頁面截屏,或者判斷網站上某些動作是否發生。Selenium 自己不帶瀏覽器,不支持瀏覽器的功能,它需要與第三方瀏覽器結合在一起才能使用。但是我們有時候需要讓它內嵌在代碼中運行,所以我們可以用一個叫 PhantomJS 的工具代替真實的瀏覽器。Selenium庫裡有個叫 WebDriver 的API。WebDriver 有點兒像可以加載網站的瀏覽器,但是它也可以像BeautifulSoup 或者其他Selector 對象一樣用來查找頁面元素,與頁面上的元素進行交互 (發送文本、點擊等),以及執行其他動作來運行網絡爬蟲。

PhantomJS是一個基於 Webkit 的“無界面”(headless)瀏覽器,它會把網站加載到內存並執行頁面上的 JavaScript,因為不會展示圖形界面,所以運行起來比完整的瀏覽器要高效。相比傳統的Chrome或 Firefox 瀏覽器等,資源消耗會更少。

如果我們把 Selenium 和 PhantomJS 結合在一起,就可以運行一個非常強大的網絡爬蟲了,這個爬蟲可以處理 JavaScrip、Cookie、headers,以及任何我們真實用戶需要做的事情。主程序退出後,selenium 不保證 phantomJS 也成功退出,最好手動關閉 phantomJS 進程。(有可能會導致多個 phantomJS 進程運行,佔用內存)。WebDriverWait 雖然可能會減少延時,但是目前存在 bug(各種報錯),這種情況可以採用 sleep。phantomJS爬數據比較慢,可以選擇多線程。如果運行的時候發現有的可以運行,有的不能,可以嘗試將 phantomJS 改成 Chrome。

"

1. 寫一個郵箱地址的正則表達式?

[A-Za-z0-9\\\一-\\\龥]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$

2. 談一談你對 Selenium 和 PhantomJS 瞭解

Selenium 是一個Web 的自動化測試工具,可以根據我們的指令,讓瀏覽器自動加載頁面,獲取需要的數據,甚至頁面截屏,或者判斷網站上某些動作是否發生。Selenium 自己不帶瀏覽器,不支持瀏覽器的功能,它需要與第三方瀏覽器結合在一起才能使用。但是我們有時候需要讓它內嵌在代碼中運行,所以我們可以用一個叫 PhantomJS 的工具代替真實的瀏覽器。Selenium庫裡有個叫 WebDriver 的API。WebDriver 有點兒像可以加載網站的瀏覽器,但是它也可以像BeautifulSoup 或者其他Selector 對象一樣用來查找頁面元素,與頁面上的元素進行交互 (發送文本、點擊等),以及執行其他動作來運行網絡爬蟲。

PhantomJS是一個基於 Webkit 的“無界面”(headless)瀏覽器,它會把網站加載到內存並執行頁面上的 JavaScript,因為不會展示圖形界面,所以運行起來比完整的瀏覽器要高效。相比傳統的Chrome或 Firefox 瀏覽器等,資源消耗會更少。

如果我們把 Selenium 和 PhantomJS 結合在一起,就可以運行一個非常強大的網絡爬蟲了,這個爬蟲可以處理 JavaScrip、Cookie、headers,以及任何我們真實用戶需要做的事情。主程序退出後,selenium 不保證 phantomJS 也成功退出,最好手動關閉 phantomJS 進程。(有可能會導致多個 phantomJS 進程運行,佔用內存)。WebDriverWait 雖然可能會減少延時,但是目前存在 bug(各種報錯),這種情況可以採用 sleep。phantomJS爬數據比較慢,可以選擇多線程。如果運行的時候發現有的可以運行,有的不能,可以嘗試將 phantomJS 改成 Chrome。

Python爬蟲面試總結「值得一看」

3. 為什麼 requests 請求需要帶上 header?

原因是:模擬瀏覽器,欺騙服務器,獲取和瀏覽器一致的內容 header 的形式:字典

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}

用法: requests.get(url,headers=headers)

4. 你遇到的反爬蟲策略有哪些?及應對策略有什麼?

  • 通過headers反爬蟲
  • 基於用戶行為的發爬蟲:例如同一IP短時間內多次訪問同一頁面,或者同一賬戶短時間內多次進行相同操作
  • 動態網頁反爬蟲,例如:我們需要爬取的數據是通過ajax請求得到,或者通過JavaScript生成的
  • 對部分數據進行加密處理的,例如:我們要抓的數據部分能夠抓到,另外的部分加密處理了,是亂碼 應對策略:
對於基本網頁的抓取可以自定義headers,添加headers的數據,代理來解決
有些網站的數據抓取必須進行模擬登陸才能抓取到完整的數據,所以要進行模擬登陸。
對於限制抓取頻率的,可以設置抓取的頻率降低一些,
對於限制ip抓取的可以使用多個代理ip進行抓取,輪詢使用代理
針對動態網頁的可以使用selenium+phantomjs進行抓取,但是比較慢,所以也可以使用查找接口的方式進行抓取。
對部分數據進行加密的,可以使用selenium進行截圖,飯後使用python自帶的 pytesseract庫進行識別,但是比較慢最直接的方法是找到加密的方法進行逆向推理。

5. 分佈式爬蟲原理?

scrapy-redis實現分佈式,其實從原理上來說很簡單,這裡為描述方便,我們把自己的核心服務器稱為 master,而把用於跑爬蟲程序的機器稱為 slave。

我們知道,採用 scrapy 框架抓取網頁,我們需要首先給定它一些 start_urls,爬蟲首先訪問 start_urls裡面的 url,再根據我們的具體邏輯,對裡面的元素、或者是其他的二級、三級頁面進行抓取。而要實現分佈式,我們只需要在這個 starts_urls 裡面做文章就行了。

我們在 master 上搭建一個 redis 數據庫(注意這個數據庫只用作 url 的存儲,不關心爬取的具體數據,不要和後面的 mongodb 或者 mysql 混淆),並對每一個需要爬取的網站類型,都開闢一個單獨的列表字段。通過設置 slave 上 scrapy-redis 獲取 url 的地址為 master 地址。這樣的結果就是,儘管有多個 slave,然而大家獲取 url 的地方只有一個,那就是服務器 master 上的 redis 數據庫。並且,由於 scrapy-redis 自身的隊列機制,slave 獲取的鏈接不會相互衝突。這樣各個 slave 在完成抓取任務之後,再把獲取的結果彙總到服務器上(這時的數據存儲不再在是 redis,而是 mongodb 或者mysql等存放具體內容的數據庫了)這種方法的還有好處就是程序移植性強,只要處理好路徑問題,把 slave 上的程序移植到另一臺機器上運行,基本上就是複製粘貼的事情。

6. pythoon2.x 中urllib和urllib2的區別?

異同:都是做url請求的操作的,但是區別很明顯。
urllib2可以接受一個Request類的實例來設置URL請求的headers,urllib僅可以接受URL。這意味著,你不可以通過urllib模塊偽裝你的User Agent字符串等(偽裝瀏覽器)。
urllib提供urlencode方法用來GET查詢字符串的產生,而urllib2沒有。這是為何urllib常和urllib2一起使用的原因。
模塊比較優勢的地方是urlliburllib2.urlopen可以接受Request對象作為參數,從而可以控制HTTP Request的header部。
但是urllib.urlretrieve函數以及urllib.quote等一系列quote和unquote功能沒有被加入urllib2中,因此有時也需要urllib的輔助。

7.robots協議是什麼?

Robots協議(也稱為爬蟲協議、爬蟲規則、機器人協議等)也就是robots.txt,網站通過robots協議告訴搜索引擎哪些頁面可以抓取,哪些頁面不能抓取。

Robots協議是網站國際互聯網界通行的道德規範,其目的是保護網站數據和敏感信息、確保用戶個人信息和隱私不被侵犯。因其不是命令,故需要搜索引擎自覺遵守。

8.什麼是爬蟲?

爬蟲是請求網站並提取數據的自動化程序

9.爬蟲的基本流程?

1、通過http庫向目標站點發起請求,即發送一個Request,請求可以包含額外的headers等信息,等待服務器響應
2、如果服務器能正常響應,會得到一個Response,Response的內容比啊是索要獲取的頁面內容
3、解析內容:正則表達式、頁面解析庫、json
4、保存數據:文本或者存入數據庫

10.什麼是Request和Response?

本地 向 服務器 發送Request,服務器根據請求返回一個Response,頁面就顯示在頁面上了

1、瀏覽器就發送消息給該網址所在的服務器,這個過程叫做Http Request
2、服務器收到瀏覽器發送的消息後,能夠根據瀏覽器發送消息的內容,做相應處
理,然後把消息回傳給瀏覽器,這個過程叫做HTTP Response
3、瀏覽器收到服務器的Response消息後,會對信息進行相應處理,然後顯示

11.Request中包含什麼呢?

1、請求方式:主要有GET和POST兩種方式,POST請求的參數不會包含在url裡面
2、請求URL
URL:統一資源定位符,如一個網頁文檔、一張圖片、一個視頻等都可以用URL來唯一確定
3、請求頭信息,包含了User-Agent(瀏覽器請求頭)、Host、Cookies信息
4、請求體,GET請求時,一般不會有,POST請求時,請求體一般包含form-data

12.Response中包含什麼信息?

1、響應狀態:狀態碼 正常響應200 重定向
2、響應頭:如內容類型、內容長度、服務器信息、設置cookie等
3、響應體信息:響應源代碼、圖片二進制數據等等

13.常見的http狀態碼

200狀態碼 服務器請求正常
301狀態碼:被請求的資源已永久移動到新位置。服務器返回此響應(對 GET 或 HEAD 請求的響應)時,會自動將請求者轉到新位置。
302狀態碼:請求的資源臨時從不同的URI響應請求,但請求者應繼續使用原有位置來進行以後的請求
401狀態碼:請求要求身份驗證。 對於需要登錄的網頁,服務器可能返回此響應。
403狀態碼:服務器已經理解請求,但是拒絕執行它。與401響應不同的是,身份驗證並不能提供任何幫助,而且這個請求也不應該被重複提交。
404狀態碼:請求失敗,請求所希望得到的資源未被在服務器上發現。
500狀態碼:服務器遇到了一個未曾預料的狀況,導致了它無法完成對請求的處理。一般來說,這個問題都會在服務器的程序碼出錯時出現。
503狀態碼:由於臨時的服務器維護或者過載,服務器當前無法處理請求。

14.HTTP 的請求和響應都包含哪些內容

HTTP請求頭
Accept:瀏覽器能夠處理的內容類型
Accept-Charset:瀏覽器能夠顯示的字符集
Accept-Encoding:瀏覽器能夠處理的壓縮編碼
Accept-Language:瀏覽器當前設置的語言
Connection:瀏覽器與服務器之間連接的類型
Cookie:當前頁面設置的任何Cookie
Host:發出請求的頁面所在的域
Referer:發出請求的頁面的URL
User-Agent:瀏覽器的用戶代理字符串
HTTP響應頭部信息:
Date:表示消息發送的時間,時間的描述格式由rfc822定義
server:服務器名字。
Connection:瀏覽器與服務器之間連接的類型
content-type:表示後面的文檔屬於什麼MIME類型
Cache-Control:控制HTTP緩存

15. mysql的索引在什麼情況下失效

1.如果條件中有or,即使其中有條件帶索引也不會使用(這也是為什麼儘量少用or的原因)
要想使用or,又想讓索引生效,只能將or條件中的每個列都加上索引
2.對於多列索引,不是使用的第一部分,則不會使用索引
3.like查詢以%開頭
4.如果列類型是字符串,那一定要在條件中將數據使用引號引用起來,否則不使用索引
5.如果mysql估計使用全表掃描要比使用索引快,則不使用索引
"

1. 寫一個郵箱地址的正則表達式?

[A-Za-z0-9\\\一-\\\龥]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$

2. 談一談你對 Selenium 和 PhantomJS 瞭解

Selenium 是一個Web 的自動化測試工具,可以根據我們的指令,讓瀏覽器自動加載頁面,獲取需要的數據,甚至頁面截屏,或者判斷網站上某些動作是否發生。Selenium 自己不帶瀏覽器,不支持瀏覽器的功能,它需要與第三方瀏覽器結合在一起才能使用。但是我們有時候需要讓它內嵌在代碼中運行,所以我們可以用一個叫 PhantomJS 的工具代替真實的瀏覽器。Selenium庫裡有個叫 WebDriver 的API。WebDriver 有點兒像可以加載網站的瀏覽器,但是它也可以像BeautifulSoup 或者其他Selector 對象一樣用來查找頁面元素,與頁面上的元素進行交互 (發送文本、點擊等),以及執行其他動作來運行網絡爬蟲。

PhantomJS是一個基於 Webkit 的“無界面”(headless)瀏覽器,它會把網站加載到內存並執行頁面上的 JavaScript,因為不會展示圖形界面,所以運行起來比完整的瀏覽器要高效。相比傳統的Chrome或 Firefox 瀏覽器等,資源消耗會更少。

如果我們把 Selenium 和 PhantomJS 結合在一起,就可以運行一個非常強大的網絡爬蟲了,這個爬蟲可以處理 JavaScrip、Cookie、headers,以及任何我們真實用戶需要做的事情。主程序退出後,selenium 不保證 phantomJS 也成功退出,最好手動關閉 phantomJS 進程。(有可能會導致多個 phantomJS 進程運行,佔用內存)。WebDriverWait 雖然可能會減少延時,但是目前存在 bug(各種報錯),這種情況可以採用 sleep。phantomJS爬數據比較慢,可以選擇多線程。如果運行的時候發現有的可以運行,有的不能,可以嘗試將 phantomJS 改成 Chrome。

Python爬蟲面試總結「值得一看」

3. 為什麼 requests 請求需要帶上 header?

原因是:模擬瀏覽器,欺騙服務器,獲取和瀏覽器一致的內容 header 的形式:字典

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}

用法: requests.get(url,headers=headers)

4. 你遇到的反爬蟲策略有哪些?及應對策略有什麼?

  • 通過headers反爬蟲
  • 基於用戶行為的發爬蟲:例如同一IP短時間內多次訪問同一頁面,或者同一賬戶短時間內多次進行相同操作
  • 動態網頁反爬蟲,例如:我們需要爬取的數據是通過ajax請求得到,或者通過JavaScript生成的
  • 對部分數據進行加密處理的,例如:我們要抓的數據部分能夠抓到,另外的部分加密處理了,是亂碼 應對策略:
對於基本網頁的抓取可以自定義headers,添加headers的數據,代理來解決
有些網站的數據抓取必須進行模擬登陸才能抓取到完整的數據,所以要進行模擬登陸。
對於限制抓取頻率的,可以設置抓取的頻率降低一些,
對於限制ip抓取的可以使用多個代理ip進行抓取,輪詢使用代理
針對動態網頁的可以使用selenium+phantomjs進行抓取,但是比較慢,所以也可以使用查找接口的方式進行抓取。
對部分數據進行加密的,可以使用selenium進行截圖,飯後使用python自帶的 pytesseract庫進行識別,但是比較慢最直接的方法是找到加密的方法進行逆向推理。

5. 分佈式爬蟲原理?

scrapy-redis實現分佈式,其實從原理上來說很簡單,這裡為描述方便,我們把自己的核心服務器稱為 master,而把用於跑爬蟲程序的機器稱為 slave。

我們知道,採用 scrapy 框架抓取網頁,我們需要首先給定它一些 start_urls,爬蟲首先訪問 start_urls裡面的 url,再根據我們的具體邏輯,對裡面的元素、或者是其他的二級、三級頁面進行抓取。而要實現分佈式,我們只需要在這個 starts_urls 裡面做文章就行了。

我們在 master 上搭建一個 redis 數據庫(注意這個數據庫只用作 url 的存儲,不關心爬取的具體數據,不要和後面的 mongodb 或者 mysql 混淆),並對每一個需要爬取的網站類型,都開闢一個單獨的列表字段。通過設置 slave 上 scrapy-redis 獲取 url 的地址為 master 地址。這樣的結果就是,儘管有多個 slave,然而大家獲取 url 的地方只有一個,那就是服務器 master 上的 redis 數據庫。並且,由於 scrapy-redis 自身的隊列機制,slave 獲取的鏈接不會相互衝突。這樣各個 slave 在完成抓取任務之後,再把獲取的結果彙總到服務器上(這時的數據存儲不再在是 redis,而是 mongodb 或者mysql等存放具體內容的數據庫了)這種方法的還有好處就是程序移植性強,只要處理好路徑問題,把 slave 上的程序移植到另一臺機器上運行,基本上就是複製粘貼的事情。

6. pythoon2.x 中urllib和urllib2的區別?

異同:都是做url請求的操作的,但是區別很明顯。
urllib2可以接受一個Request類的實例來設置URL請求的headers,urllib僅可以接受URL。這意味著,你不可以通過urllib模塊偽裝你的User Agent字符串等(偽裝瀏覽器)。
urllib提供urlencode方法用來GET查詢字符串的產生,而urllib2沒有。這是為何urllib常和urllib2一起使用的原因。
模塊比較優勢的地方是urlliburllib2.urlopen可以接受Request對象作為參數,從而可以控制HTTP Request的header部。
但是urllib.urlretrieve函數以及urllib.quote等一系列quote和unquote功能沒有被加入urllib2中,因此有時也需要urllib的輔助。

7.robots協議是什麼?

Robots協議(也稱為爬蟲協議、爬蟲規則、機器人協議等)也就是robots.txt,網站通過robots協議告訴搜索引擎哪些頁面可以抓取,哪些頁面不能抓取。

Robots協議是網站國際互聯網界通行的道德規範,其目的是保護網站數據和敏感信息、確保用戶個人信息和隱私不被侵犯。因其不是命令,故需要搜索引擎自覺遵守。

8.什麼是爬蟲?

爬蟲是請求網站並提取數據的自動化程序

9.爬蟲的基本流程?

1、通過http庫向目標站點發起請求,即發送一個Request,請求可以包含額外的headers等信息,等待服務器響應
2、如果服務器能正常響應,會得到一個Response,Response的內容比啊是索要獲取的頁面內容
3、解析內容:正則表達式、頁面解析庫、json
4、保存數據:文本或者存入數據庫

10.什麼是Request和Response?

本地 向 服務器 發送Request,服務器根據請求返回一個Response,頁面就顯示在頁面上了

1、瀏覽器就發送消息給該網址所在的服務器,這個過程叫做Http Request
2、服務器收到瀏覽器發送的消息後,能夠根據瀏覽器發送消息的內容,做相應處
理,然後把消息回傳給瀏覽器,這個過程叫做HTTP Response
3、瀏覽器收到服務器的Response消息後,會對信息進行相應處理,然後顯示

11.Request中包含什麼呢?

1、請求方式:主要有GET和POST兩種方式,POST請求的參數不會包含在url裡面
2、請求URL
URL:統一資源定位符,如一個網頁文檔、一張圖片、一個視頻等都可以用URL來唯一確定
3、請求頭信息,包含了User-Agent(瀏覽器請求頭)、Host、Cookies信息
4、請求體,GET請求時,一般不會有,POST請求時,請求體一般包含form-data

12.Response中包含什麼信息?

1、響應狀態:狀態碼 正常響應200 重定向
2、響應頭:如內容類型、內容長度、服務器信息、設置cookie等
3、響應體信息:響應源代碼、圖片二進制數據等等

13.常見的http狀態碼

200狀態碼 服務器請求正常
301狀態碼:被請求的資源已永久移動到新位置。服務器返回此響應(對 GET 或 HEAD 請求的響應)時,會自動將請求者轉到新位置。
302狀態碼:請求的資源臨時從不同的URI響應請求,但請求者應繼續使用原有位置來進行以後的請求
401狀態碼:請求要求身份驗證。 對於需要登錄的網頁,服務器可能返回此響應。
403狀態碼:服務器已經理解請求,但是拒絕執行它。與401響應不同的是,身份驗證並不能提供任何幫助,而且這個請求也不應該被重複提交。
404狀態碼:請求失敗,請求所希望得到的資源未被在服務器上發現。
500狀態碼:服務器遇到了一個未曾預料的狀況,導致了它無法完成對請求的處理。一般來說,這個問題都會在服務器的程序碼出錯時出現。
503狀態碼:由於臨時的服務器維護或者過載,服務器當前無法處理請求。

14.HTTP 的請求和響應都包含哪些內容

HTTP請求頭
Accept:瀏覽器能夠處理的內容類型
Accept-Charset:瀏覽器能夠顯示的字符集
Accept-Encoding:瀏覽器能夠處理的壓縮編碼
Accept-Language:瀏覽器當前設置的語言
Connection:瀏覽器與服務器之間連接的類型
Cookie:當前頁面設置的任何Cookie
Host:發出請求的頁面所在的域
Referer:發出請求的頁面的URL
User-Agent:瀏覽器的用戶代理字符串
HTTP響應頭部信息:
Date:表示消息發送的時間,時間的描述格式由rfc822定義
server:服務器名字。
Connection:瀏覽器與服務器之間連接的類型
content-type:表示後面的文檔屬於什麼MIME類型
Cache-Control:控制HTTP緩存

15. mysql的索引在什麼情況下失效

1.如果條件中有or,即使其中有條件帶索引也不會使用(這也是為什麼儘量少用or的原因)
要想使用or,又想讓索引生效,只能將or條件中的每個列都加上索引
2.對於多列索引,不是使用的第一部分,則不會使用索引
3.like查詢以%開頭
4.如果列類型是字符串,那一定要在條件中將數據使用引號引用起來,否則不使用索引
5.如果mysql估計使用全表掃描要比使用索引快,則不使用索引
Python爬蟲面試總結「值得一看」

16.MySQL 有什麼引擎,各引擎之間有什麼區別?

主要 MyISAM 與 InnoDB 兩個引擎,其主要區別如下:
1、InnoDB 支持事務,MyISAM 不支持,這一點是非常之重要。事務是一種高級的處理方式,如在一些列增刪改中只要哪個出錯還可以回滾還原,而 MyISAM就不可以了;
2、MyISAM 適合查詢以及插入為主的應用,InnoDB 適合頻繁修改以及涉及到安全性較高的應用;
3、InnoDB 支持外鍵,MyISAM 不支持;
4、MyISAM 是默認引擎,InnoDB 需要指定;
5、InnoDB 不支持 FULLTEXT 類型的索引;
6、InnoDB 中不保存表的行數,如 select count() from table 時,InnoDB;需要掃描一遍整個表來計算有多少行,但是 MyISAM 只要簡單的讀出保存好的行數即可。注意的是,當 count()語句包含 where 條件時 MyISAM 也需要掃描整個表;
7、對於自增長的字段,InnoDB 中必須包含只有該字段的索引,但是在 MyISAM表中可以和其他字段一起建立聯合索引;
8、清空整個表時,InnoDB 是一行一行的刪除,效率非常慢。MyISAM 則會重建表;
9、InnoDB 支持行鎖(某些情況下還是鎖整表,如 update table set a=1 where user like '%lee%'

17.Scrapy優缺點:

優點:
scrapy 是異步的
採取可讀性更強的xpath代替正則
強大的統計和log系統
同時在不同的url上爬行
支持shell方式,方便獨立調試
寫middleware,方便寫一些統一的過濾器
通過管道的方式存入數據庫
缺點:基於python的爬蟲框架,擴展性比較差
基於twisted框架,運行中的exception是不會幹掉reactor,並且異步框架出錯後是不會停掉其他任務的,數據出錯後難以察覺。

18.HTTPS 是如何實現安全傳輸數據的

客戶端(通常是瀏覽器)先向服務器發出加密通信的請求
服務器收到請求,然後響應
客戶端收到證書之後會首先會進行驗證
服務器收到使用公鑰加密的內容,在服務器端使用私鑰解密之後獲得隨機數pre-master secret,然後根據radom1、radom2、pre-master secret通過一定的算法得出session Key和MAC算法祕鑰,作為後面交互過程中使用對稱祕鑰。同時客戶端也會使用radom1、radom2、pre-master secret,和同樣的算法生成session Key和MAC算法的祕鑰。
然後再後續的交互中就使用session Key和MAC算法的祕鑰對傳輸的內容進行加密和解密。

19.描述下scrapy 框架運行的機制?

從start_urls裡獲取第一批url併發送請求,請求由引擎交給調度器入請求隊列,獲取完畢後,調度器將請求隊列裡的請求交給下載器去獲取請求對應的響應資源,並將響應交給自己編寫的解析方法做提取處理:
如果提取出需要的數據,則交給管道文件處理;
如果提取出url,則繼續執行之前的步驟(發送url請求,並由引擎將請求交給調度器入隊列...),直到請求隊

最後,我自己是一名從事了多年開發的Python老程序員,辭職目前在做自己的Python私人定製課程,今年年初我花了一個月整理了一份最適合2019年學習的Python學習乾貨,可以送給每一位喜歡Python的小夥伴,想要獲取的可以關注我的頭條號並在後臺私信我:01,即可免費獲取。

"

相關推薦

推薦中...