Python爬蟲面試總結

Python爬蟲面試總結

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

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

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

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

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

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

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)ajax

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

  • 經過headers反爬蟲
  • 基於用戶行爲的發爬蟲:例如同一IP短期內屢次訪問同一頁面,或者同一帳戶短期內屢次進行相同操做
  • 動態網頁反爬蟲,例如:咱們須要爬取的數據是經過ajax請求獲得,或者經過JavaScript生成的
  • 對部分數據進行加密處理的,例如:咱們要抓的數據部分可以抓到,另外的部分加密處理了,是亂碼

應對策略:正則表達式

對於基本網頁的抓取能夠自定義headers,添加headers的數據,代理來解決

有些網站的數據抓取必須進行模擬登錄才能抓取到完整的數據,因此要進行模擬登錄。


對於限制抓取頻率的,能夠設置抓取的頻率下降一些,


對於限制ip抓取的可使用多個代理ip進行抓取,輪詢使用代理


針對動態網頁的可使用selenium+phantomjs進行抓取,可是比較慢,因此也可使用查找接口的方式進行抓取。


對部分數據進行加密的,可使用selenium進行截圖,飯後使用python自帶的 pytesseract庫進行識別,可是比較慢最直接的方法是找到加密的方法進行逆向推理。

5. 分佈式爬蟲原理?

scrapy-redis實現分佈式,其實從原理上來講很簡單,這裏爲描述方便,咱們把本身的核心服務器稱爲 master,而把用於跑爬蟲程序的機器稱爲 slave。redis

咱們知道,採用 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 上的程序移植到另外一臺機器上運行,基本上就是複製粘貼的事情。sql

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協議告訴搜索引擎哪些頁面能夠抓取,哪些頁面不能抓取。mongodb

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

8.什麼是爬蟲?

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

9.爬蟲的基本流程?

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

10.什麼是Request和Response?

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

一、瀏覽器就發送消息給該網址所在的服務器,這個過程叫作Http Request

二、服務器收到瀏覽器發送的消息後,可以根據瀏覽器發送消息的內容,作相應處
理,而後把消息回傳給瀏覽器,這個過程叫作HTTP Response

三、瀏覽器收到服務器的Response消息後,會對信息進行相應處理,而後顯示

11.Request中包含什麼呢?

一、請求方式:主要有GET和POST兩種方式,POST請求的參數不會包含在url裏面
二、請求URL
URL:統一資源定位符,如一個網頁文檔、一張圖片、一個視頻等均可以用URL來惟一肯定
三、請求頭信息,包含了User-Agent(瀏覽器請求頭)、Host、Cookies信息
四、請求體,GET請求時,通常不會有,POST請求時,請求體通常包含form-data

12.Response中包含什麼信息?

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

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估計使用全表掃描要比使用索引快,則不使用索引

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

主要 MyISAM 與 InnoDB 兩個引擎,其主要區別以下:

一、InnoDB 支持事務,MyISAM 不支持,這一點是很是之重要。事務是一種高級的處理方式,如在一些列增刪改中只要哪一個出錯還能夠回滾還原,而 MyISAM就不能夠了;
二、MyISAM 適合查詢以及插入爲主的應用,InnoDB 適合頻繁修改以及涉及到安全性較高的應用;
三、InnoDB 支持外鍵,MyISAM 不支持;
四、MyISAM 是默認引擎,InnoDB 須要指定;
五、InnoDB 不支持 FULLTEXT 類型的索引;
六、InnoDB 中不保存表的行數,如 select count() from table 時,InnoDB;須要掃描一遍整個表來計算有多少行,可是 MyISAM 只要簡單的讀出保存好的行數便可。注意的是,當 count()語句包含 where 條件時 MyISAM 也須要掃描整個表;
七、對於自增加的字段,InnoDB 中必須包含只有該字段的索引,可是在 MyISAM表中能夠和其餘字段一塊兒創建聯合索引;
八、清空整個表時,InnoDB 是一行一行的刪除,效率很是慢。MyISAM 則會重建表;
九、InnoDB 支持行鎖(某些狀況下仍是鎖整表,如 update table set a=1 where user like '%lee%'

16.Scrapy優缺點:

優勢:


scrapy 是異步的


採起可讀性更強的xpath代替正則


強大的統計和log系統


同時在不一樣的url上爬行


支持shell方式,方便獨立調試


寫middleware,方便寫一些統一的過濾器


經過管道的方式存入數據庫


缺點:基於python的爬蟲框架,擴展性比較差


基於twisted框架,運行中的exception是不會幹掉reactor,而且異步框架出錯後是不會停掉其餘任務的,數據出錯後難以察覺。

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

客戶端(一般是瀏覽器)先向服務器發出加密通訊的請求


服務器收到請求,而後響應


客戶端收到證書以後會首先會進行驗證


服務器收到使用公鑰加密的內容,在服務器端使用私鑰解密以後得到隨機數pre-master secret,而後根據radom一、radom二、pre-master secret經過必定的算法得出session Key和MAC算法祕鑰,做爲後面交互過程當中使用對稱祕鑰。同時客戶端也會使用radom一、radom二、pre-master secret,和一樣的算法生成session Key和MAC算法的祕鑰。


而後再後續的交互中就使用session Key和MAC算法的祕鑰對傳輸的內容進行加密和解密。

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

從start_urls裏獲取第一批url併發送請求,請求由引擎交給調度器入請求隊列,獲取完畢後,調度器將請求隊列裏的請求交給下載器去獲取請求對應的響應資源,並將響應交給本身編寫的解析方法作提取處理:

若是提取出須要的數據,則交給管道文件處理;
若是提取出url,則繼續執行以前的步驟(發送url請求,並由引擎將請求交給調度器入隊列...),直到請求隊列裏沒有請求,程序結束。

請繼續關注我

圖片描述

相關文章
相關標籤/搜索