今天給大家出一個關于Python爬蟲面試題的總結,相對于來說出現頻率比較高的一些!
1. 為什么 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)
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。
3. 寫一個郵箱地址的正則表達式?
[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$
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消息后,會對信息進行相應處理,然后顯示
下期會繼續為大家更新更多關于Python爬蟲的面試題總結!
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
