爬蟲基礎(chǔ)復(fù)習(xí)

爬蟲

1. 請(qǐng)闡述通用爬蟲和聚焦爬蟲的概念

通常情況下,我們將搜索引擎使用的爬蟲我們稱之為通用爬蟲,就像谷歌
和百度的爬蟲,它的作用是把整個(gè)互聯(lián)網(wǎng)上的網(wǎng)頁下載到本地,形成一個(gè)互聯(lián)
網(wǎng)內(nèi)容的鏡像備份,在對(duì)這些網(wǎng)頁進(jìn)行一定的處理(例如提取關(guān)鍵字、去掉廣
告等)之后,就可以提供一個(gè)用戶檢索內(nèi)容的接口。一般的網(wǎng)站都會(huì)通過
robots 協(xié)議來告訴通用爬蟲,哪些那些頁面可以抓取,那些不可以抓取。
我們做 Python 爬蟲開發(fā)通常是開發(fā)聚焦爬蟲,聚焦爬蟲會(huì)針對(duì)某種特定
的內(nèi)容進(jìn)行爬取,因此會(huì)對(duì)爬取的內(nèi)容進(jìn)行篩選和處理,而且只是抓取與特
定主題需求有相關(guān)性的內(nèi)容。

2. 完整的一個(gè) url 都包含哪些內(nèi)容

一個(gè)完整的 url 包含協(xié)議、主機(jī)地址、端口、路徑和資源。其中不同的協(xié)
議代表不同的資源查找方式、資源傳輸方式;主機(jī)地址指的是存放資源的主
機(jī)(服務(wù)器)的 IP 地址(域名),端口是用來區(qū)分不同的服務(wù)的,路徑是指資
源在主機(jī)中的具體位置。

3. 請(qǐng)闡述 http 協(xié)議和 https 協(xié)議的區(qū)別和聯(lián)系

HTTPS 協(xié)議需要到證書頒發(fā)機(jī)構(gòu)(CA)申請(qǐng)證書,一般免費(fèi)證書很少,
需要向證書頒發(fā)機(jī)構(gòu)支付費(fèi)用。 HTTP 協(xié)議是超文本傳輸協(xié)議,信息是明文傳
輸,HTTPS 則是具有安全性的 SSL 加密傳輸協(xié)議。采用 HTTP 協(xié)議傳輸數(shù)據(jù)
的客戶端和服務(wù)器,客服端給服務(wù)器發(fā)送請(qǐng)求,服務(wù)器接收到請(qǐng)求會(huì)直接將
數(shù)據(jù)返回。采用 HTTPS 協(xié)議的時(shí)候,客服端給服務(wù)器發(fā)送請(qǐng)求,服務(wù)器接收
到請(qǐng)求后不會(huì)馬上將數(shù)據(jù)返回,而是將一個(gè)證書傳遞給客服端(這個(gè)證書中
包含了公鑰),客戶端信任這個(gè)證書后,客戶端發(fā)出的信息會(huì)經(jīng)過加密然后再
發(fā)送給服務(wù)器。服務(wù)器接收到信息后會(huì)使用服務(wù)器的私鑰進(jìn)行解密。同樣
的,服務(wù)器發(fā)送給客戶端的信息也會(huì)通過私鑰進(jìn)行加密,在客戶端通過公鑰
進(jìn)行解密。

4. robots 協(xié)議是什么

Robots 協(xié)議,有時(shí)候也稱為“爬蟲協(xié)議” 或“網(wǎng)絡(luò)機(jī)器人協(xié)議” ,它的
全稱是“網(wǎng)絡(luò)爬蟲排除標(biāo)準(zhǔn)” (Robots Exclusion Protocol),網(wǎng)站通過
Robots 協(xié)議告訴搜索引擎哪些頁面可以抓取,哪些頁面不能抓取。 Robots
協(xié)議對(duì)應(yīng)的文本 robots.txt 通常保存在網(wǎng)站的根目錄下,是一個(gè)使用 ASCII 碼
字符的純文本文件,例如我們?cè)L問HTTP://www.taobao.com/robots.txt就可以查看到淘寶的 robots 協(xié)議文件。 Robots 協(xié)議并不是一個(gè)強(qiáng)制執(zhí)行的
法律法規(guī),而是約定俗成的道德規(guī)范,所以它并不能保證網(wǎng)站的隱私。
目前爬蟲領(lǐng)域仍屬于拓荒階段,因?yàn)榕廊〉臄?shù)據(jù)就是瀏覽器中能夠讓用戶
看到的東西,所以“法不禁止即為許可” 。但是在使用其他網(wǎng)站提供的數(shù)據(jù)
時(shí),必須要尊重網(wǎng)站的知識(shí)產(chǎn)權(quán),即便是網(wǎng)站上的數(shù)據(jù)都由使用網(wǎng)站的用戶
提供的,但是網(wǎng)站平臺(tái)是投入了運(yùn)營成本的,當(dāng)用戶在注冊(cè)和發(fā)布內(nèi)容時(shí),
平臺(tái)通常就已經(jīng)獲得了對(duì)數(shù)據(jù)的所有權(quán)、使用權(quán)和分發(fā)權(quán)。如果侵犯知識(shí)產(chǎn)
權(quán)或者有損害動(dòng)產(chǎn)的行為,在打官司時(shí)敗訴的可能性是相當(dāng)高的。

5. 請(qǐng)說出 http 請(qǐng)求包含哪幾部分,至少 4 個(gè)常見的請(qǐng)求頭以及含義

HTTP 請(qǐng)求包含請(qǐng)求頭和請(qǐng)求體兩個(gè)部分。請(qǐng)求頭包含對(duì)客戶端的環(huán)境描
述和客戶端請(qǐng)求信息等。請(qǐng)求體就是客戶端要發(fā)送給服務(wù)器的數(shù)據(jù)。

比如登錄注冊(cè)的時(shí)候,客服端需要將賬號(hào)密碼發(fā)送給服務(wù)器,那么這個(gè)時(shí)候的賬號(hào)
密碼數(shù)據(jù)就可以作為請(qǐng)求體發(fā)送給服務(wù)器。
常見的請(qǐng)求頭:
Host: 客戶端想訪問的服務(wù)器主機(jī)地址
User-Agent: 客戶端的類型,客戶端的軟件環(huán)境
Accept: 客戶端所能接收的數(shù)據(jù)類型
Accept-Language: 客戶端的語言環(huán)境
Accept-Encoding: 客戶端支持的數(shù)據(jù)壓縮格式

6.請(qǐng)說出 http 響應(yīng)包含哪幾部分,至少 4 個(gè)常見狀態(tài)碼以及含義

HTTP 響應(yīng)包含響應(yīng)頭和響應(yīng)體。響應(yīng)頭包含了對(duì)服務(wù)器的描述和對(duì)返回
數(shù)據(jù)的描述,響應(yīng)體就是服務(wù)器要給客戶端返回的數(shù)據(jù)。
200:請(qǐng)求被成功接收
304:再次請(qǐng)求時(shí),請(qǐng)求的內(nèi)容沒有發(fā)生改變
403:客戶端錯(cuò)誤,沒有權(quán)限,拒絕訪問
404:服務(wù)器無法根據(jù)客戶端請(qǐng)求找到資源
500:服務(wù)器內(nèi)部錯(cuò)誤,無法完成請(qǐng)求

7.用過的爬蟲模塊和爬蟲框架都有哪些,簡(jiǎn)述優(yōu)缺點(diǎn)

  1. 下載數(shù)據(jù) - urllib / requests / aioHTTP。
  2. 解析數(shù)據(jù) - re / lxml / beautifulsoup4(bs4)/ pyquery。
  3. 緩存和持久化 - pymysql / sqlalchemy / peewee/ redis /
    pymongo。
  4. 生成數(shù)字簽名 - hashlib。5. 序列化 - pickle / json。
  5. 壓縮 - zlib。
  6. 調(diào)度器 - 進(jìn)程(multiprocessing) / 線程(threading) / 協(xié)程
    (coroutine)。
  7. 框架 - Scrapy 和 PySpider。

8.講述模擬登陸流程和爬蟲中如何使用 cookie

模擬登陸可以分為兩種方式,第一種使用自動(dòng)化測(cè)試框架 Selenium,
Selenium 調(diào)用 Chrome 瀏覽器來模擬人的行為,通過 Chrome 瀏覽器打開
登陸頁面,并通過獲取輸入賬號(hào)密碼的輸入框,并自動(dòng)的填入賬號(hào)密碼內(nèi)
容,并模擬點(diǎn)擊登陸,即可實(shí)現(xiàn)登錄操作。第二種使用模擬 Ajax 請(qǐng)求,分析
頁面中登錄的 URL 地址,傳遞參數(shù),使用這種方式模擬 API 接口進(jìn)行登錄。

9.圖片防盜鏈技術(shù)是如何實(shí)現(xiàn)的以及如何實(shí)現(xiàn)下載防盜鏈圖片

網(wǎng)站防圖片盜鏈接通常是檢查獲取圖片的 HTTP 請(qǐng)求頭中的 Referer
段,該字段的作用是告訴服務(wù)器獲取圖片的請(qǐng)求是從哪個(gè)頁面鏈接過來的,
如果沒有該字段或者該字段中的頁面并不是本網(wǎng)站,那就可以認(rèn)定為盜鏈接
行為,從而通過攔截過濾器(在 Django 中是中間件)加以拒絕。知道了這
一點(diǎn)也破解防盜鏈接也非常簡(jiǎn)單,就是在 HTTP 請(qǐng)求的請(qǐng)求頭中添加 Referer
字段,并指定為提供圖片的網(wǎng)站的某個(gè)有效的 URL 即可。

10.常見的 html 文件解析方式都有哪些

正則表達(dá)式解析, 速度快, 如: re
XPath 解析, 速度快, 如:lxml
CSS 選擇器解析, 速度慢, 如: bs4 , pyquery

11.什么是懶加載技術(shù),如何爬取懶加載的圖片

在很多網(wǎng)站中,如果頁面中的圖片內(nèi)容非常多,那當(dāng)用戶在訪問該頁面
時(shí),頁面中的圖片不用全部都加載出來,只用加載在瀏覽器框中的展示的部
分圖片即可,因此懶加載就是當(dāng)用戶瀏覽到該圖片信息時(shí),才加載 img 中的
src 屬性。實(shí)現(xiàn)懶加載關(guān)鍵點(diǎn)如下:1 頁面中的 img 元素,如果沒有 src 屬性,
瀏覽器就不會(huì)發(fā)出請(qǐng)求去下載圖片(也就沒有請(qǐng)求,也就提高性能),一旦通
過 javascript 設(shè)置了圖片路徑,瀏覽器才會(huì)送請(qǐng)求。 2 如何獲取真正的路徑,
真正的路徑存在元素的“data-url” 屬性里,當(dāng)瀏覽器在訪問到該圖片時(shí),將
data-url 地址設(shè)置到 src 屬性中即可。

12.如果爬取的數(shù)據(jù)為 json 數(shù)據(jù),如何解析

通過 Python 內(nèi)置的 json 模塊中的 loads 函數(shù)可以將 JSON 格式的數(shù)據(jù)解析
成 Python 的字典或數(shù)組。

13.selenium+phantomjs 是什么,有什么作用

首先 Selenium 是一個(gè)自動(dòng)化測(cè)試工具,利用它可以驅(qū)動(dòng)瀏覽器執(zhí)行特定
的動(dòng)作,如點(diǎn)擊、表單操作等,同時(shí)還可以獲取瀏覽器上呈現(xiàn)的頁面源代碼,
做到可見即可爬。
對(duì)于一些 Javascript 動(dòng)態(tài)渲染的頁面來說,此種抓取方式非常有效。
PhantomJS 是一個(gè)無頭瀏覽器(headless browser),也稱無界面瀏覽器,
它是一個(gè)支持腳本編程的 Webkit 瀏覽器引擎。由于 PhantomJS 是無界面瀏
覽器,爬取時(shí)不需要開界面,占用的內(nèi)存較小,所以運(yùn)行起來比打開界面的
爬取方式更高效。除了 PhantomJS 支持無頭瀏覽器模式,目前主流的瀏覽器
如 Chrome 和 Firefox 也已支持 headless 瀏覽器模式進(jìn)行無界面爬取。

14.闡述 scrapy 基本結(jié)構(gòu)和工作原理

Scrapy 是一個(gè)為了爬取網(wǎng)站數(shù)據(jù)、提取結(jié)構(gòu)性數(shù)據(jù)而編寫的應(yīng)用框架。
Scrapy Engine(Scrapy 引擎):Scrapy Engine 是用來控制整個(gè)爬蟲系
統(tǒng)的數(shù)據(jù)處理流。
Scheduler(調(diào)度器):Scheduler 維護(hù)著待爬取的 URL 隊(duì)列,當(dāng)調(diào)度程
序從 Scrapy Engine 接受到請(qǐng)求時(shí),會(huì)從待爬取的 URL 隊(duì)列中取出下一個(gè)
URL 返還給他們。
Downloader(下載器):Downloader 從 Scrapy Engine 那里得到需要
下載的 URL,并向該網(wǎng)址發(fā)送網(wǎng)絡(luò)請(qǐng)求進(jìn)行頁面網(wǎng)頁,最后再將網(wǎng)頁內(nèi)容傳遞
到 Spiders 來處理。如果需要定制更復(fù)雜的網(wǎng)絡(luò)請(qǐng)求,可以通過 Downloader
中間件來實(shí)現(xiàn),
Spiders(蜘蛛):Spiders 是用戶需要編輯的代碼的部分。用戶通過編寫
spider.py 這個(gè)類實(shí)現(xiàn)指定要爬取的網(wǎng)站地址、定義網(wǎng)址過濾規(guī)則、解析目標(biāo)
數(shù)據(jù)等。 Spider 發(fā)出請(qǐng)求,并處理 Scrapy Engine 返回給它下載器響應(yīng)數(shù)
據(jù),把解析到的數(shù)據(jù)以 item 的形式傳遞給 Item Pipeline,把解析到的鏈接傳
遞給 Scheduler。
Item Pipeline(項(xiàng)目管道):Item 定義了爬蟲要抓取的數(shù)據(jù)的字段,類
似于關(guān)系型數(shù)據(jù)庫中表的字段名,用戶編寫 item.py 文件來實(shí)現(xiàn)這一功能。
Pipeline 主要負(fù)責(zé)處理 Spider 從網(wǎng)頁中抽取的 item,對(duì) item 進(jìn)行清洗、驗(yàn)
證,并且將數(shù)據(jù)持久化,如將數(shù)據(jù)存入數(shù)據(jù)庫或者文件。用戶編寫pipeline.py 實(shí)現(xiàn)這一功能。
Downloader middlewares(下載器中間件):Downloader
middlewares 是位于 Scrapy Engine 和 Downloader 之間的鉤子框架,主要
處理 Scrapy Engine 與 Downloader 之間的請(qǐng)求及響應(yīng)??梢源娼邮照?qǐng)
求、處理數(shù)據(jù)的下載以及將結(jié)果響應(yīng)給 Scrapy Engine。
Spider middlewares(蜘蛛中間件):Spider middlewares 是介于
Scrapy Engine 和 Spiders 之間的鉤子框架,主要是處理 Spiders 的響應(yīng)輸
入和請(qǐng)求輸出。可以插入自定義的代碼來處理發(fā)送給 Spiders 的請(qǐng)求和返回
Spider 獲取的響應(yīng)內(nèi)容和項(xiàng)目。

15.怎么理解進(jìn)程和線程

進(jìn)程是指在系統(tǒng)中 正在運(yùn)行的一個(gè)應(yīng)用程序。 進(jìn)程之間是獨(dú)立的,每個(gè)
進(jìn)程均運(yùn)行在其專用且受保護(hù)的內(nèi)存空間內(nèi)。所有的應(yīng)用程序都是通過代碼
來實(shí)現(xiàn)的(不管是什么語言),所以應(yīng)用程序就可以看成是我們寫好的一個(gè)代
碼,進(jìn)程就是我們正在執(zhí)行這個(gè)代碼。代碼中我們避免不了要聲明很多的變
量去保存各種各樣的數(shù)據(jù),那么這些數(shù)據(jù)就是保存在這個(gè)進(jìn)程對(duì)應(yīng)的內(nèi)存空
間中的。當(dāng)進(jìn)程對(duì)應(yīng)的代碼執(zhí)行結(jié)束了,進(jìn)程就結(jié)束,其對(duì)應(yīng)的內(nèi)存空間也
會(huì)被釋放。進(jìn)程要想執(zhí)行任務(wù),必須得有線程(每個(gè)進(jìn)程至少要有一條線
程)。 一個(gè)進(jìn)程(程序)的所有任務(wù)都在線程中執(zhí)行。如果把進(jìn)程可以看成
是一個(gè)車間,線程就是車間里面的工人。車間的特點(diǎn)就是,每一個(gè)車間都有
一個(gè)屬于自己專有的空間。并且一個(gè)車間里面可以有多個(gè)工人。但是車間想
要生產(chǎn),那么車間中至少要一個(gè)工人。

16.如何理解同步、異步、并行、并發(fā)

同步: 多任務(wù), 多個(gè)任務(wù)之間執(zhí)行的時(shí)候要求有先后順序,必須一個(gè)先
執(zhí)行完成之后,另一個(gè)才能繼續(xù)執(zhí)行, 只有一個(gè)主線。
異步: 多任務(wù), 多個(gè)任務(wù)之間執(zhí)行沒有先后順序,可以同時(shí)運(yùn)行,執(zhí)行
的先后順序不會(huì)有什么影響,存在的多條運(yùn)行主線
并行和并發(fā)都可以看成是多個(gè)任務(wù)可以同時(shí)執(zhí)行。但是他們之間有差別,并行
才是指真正的同時(shí)執(zhí)行但是要真正做到并行需要多核的支撐,并發(fā)是通過時(shí)間
切片,讓 cpu 快速在多個(gè)任務(wù)之間切換造成的同時(shí)執(zhí)行的假象。

17.scrapy 和 scrapy-redis 有什么區(qū)別

Scrapy 是一個(gè)通用的爬蟲框架,但是本身不支持分布式。 Scrapy-Redis
是為了更方便地實(shí)現(xiàn) Scrapy 分布式爬取,提供了以 Redis 為基礎(chǔ)的組件。
通過 Scrapy-Redis 組件可以提供的主要功能包括:- 爬取隊(duì)列的功能

  • 去重過濾的功能
  • 和中斷后重新爬取的功能

18.爬取過程中碰到驗(yàn)證碼如何解決

關(guān)于這個(gè)問題,可以參考《你遇到過哪些反爬措施以及應(yīng)對(duì)的手段是什么》這
個(gè)問題的答案。

19.闡述 crawlspider 的定義以及用法

CrawlSpider 是 Spider 的派生類,Spider 類的設(shè)計(jì)原則是只爬取
start_url 列表中的網(wǎng)頁,而 CrawlSpider 類定義了一些規(guī)則來提供跟進(jìn)網(wǎng)址
的方便的機(jī)制,從爬取的網(wǎng)頁中獲取網(wǎng)址并繼續(xù)爬取的工作更適合。
CrawlSpider 的基本用法如下所示。
首先生成 scrawlspider 的命令為 :
[ scrapy genspider -t crawl 爬蟲名 網(wǎng)站域名 ]
然后修改生成的 crawlspider 類,CrawlSpider 繼承于蜘蛛類,除了繼承
過來的屬性外,還提供了新的屬性和方法,如:LinkExtractors 功能為提取鏈
接,LinkExtractors 要實(shí)例化一次,并且它的 extract_links 方法會(huì)根據(jù)不同
的響應(yīng)多次調(diào)用提取鏈接;rule 屬性,在規(guī)則中包含一個(gè)或多個(gè)規(guī)則對(duì)象。
每個(gè)規(guī)則對(duì)爬取網(wǎng)站的動(dòng)作定義了特定操作,如果多個(gè)規(guī)則匹配了相同的鏈
接,則根據(jù)規(guī)則在本集合中被定義的順序,第一個(gè)會(huì)被使用。在 rule 里需要
定義 callback 方法,但由于 CrawlSpider 使用 parse 方法來實(shí)現(xiàn)其內(nèi)部邏
輯, callback 方法不能命名為 parse。

20.闡述代理是什么以及你如何使用代理

當(dāng)我們需要大量的爬取網(wǎng)站信息時(shí),除了切換 User-Agent 之外,另外一
個(gè)重要的方式就是設(shè)置 IP 代理,以防止我們的爬蟲被拒絕。設(shè)置 IP 代理通常
情況下可以使用第三方的接口,也可以自己做 IP 代理池。通常情況下,一些
代理網(wǎng)站會(huì)提供一些免費(fèi)的 ip 代理,但是其穩(wěn)定性和可用性很難得到保證。
另外一個(gè)代理就是設(shè)置 User-Agent,用以模擬不同的瀏覽器的訪問行為。

21.scrapy 在爬取過程中出現(xiàn)斷網(wǎng)如何保證數(shù)據(jù)完整

任何程序在運(yùn)行的過程中都有可能會(huì)崩潰,爬蟲也不例外。當(dāng)我們需要爬
取的數(shù)據(jù)量很大很大的時(shí)候,爬取的過程中難免會(huì)出現(xiàn)各種各樣的問題導(dǎo)致程
序崩潰斷掉,這個(gè)時(shí)候我們就需要記錄爬蟲的狀態(tài),當(dāng)爬蟲掛掉的時(shí)候可以恢
復(fù)原來的狀態(tài)繼續(xù)跑。 Scrapy 簡(jiǎn)單易用,效率極高,自帶多線程機(jī)制。但是也
正因?yàn)樗亩嗑€程機(jī)制導(dǎo)致在用 Scrapy 寫爬蟲的時(shí)候處理斷點(diǎn)續(xù)爬很惱火。當(dāng)請(qǐng)求中加入了優(yōu)先級(jí)屬性的時(shí)候,每次 Scrapy 從請(qǐng)求隊(duì)列中取請(qǐng)求的時(shí)候
就會(huì)判斷優(yōu)先級(jí),先取出優(yōu)先級(jí)高的去訪問。由于 Scrapy 默認(rèn)啟動(dòng)十個(gè)線程。
這時(shí)優(yōu)先級(jí)為 100 的就會(huì)在優(yōu)先級(jí)為 90 之前被取出請(qǐng)求隊(duì)列,這樣呢我們就
能大體上保證爬取網(wǎng)頁的順序性。保證了順序性之后呢,我們就要記錄已經(jīng)爬
取的頁數(shù)。由于發(fā)送請(qǐng)求、下載頁面、存取數(shù)據(jù)這幾個(gè)動(dòng)作是順序執(zhí)行的,也
就是說程序發(fā)送了這個(gè)請(qǐng)求不代表此時(shí)已經(jīng)爬取到這一頁了,只有當(dāng)收到響應(yīng)
的時(shí)候我們才能確定我們已經(jīng)獲取到了數(shù)據(jù),這時(shí)我們才能記錄爬取位置

22.要爬取的內(nèi)容為動(dòng)態(tài)加載,如何實(shí)現(xiàn)爬取

為了加速頁面的加載速度,頁面的很多部分都是用 JavaScript 生成的,
而對(duì)于用 scrapy 爬蟲來說就是一個(gè)很大的問題,因?yàn)?Scrapy 本身并沒有
JavaScript 引擎,所以爬取的都是靜態(tài)頁面。如何分析網(wǎng)站上動(dòng)態(tài)加載出來
的內(nèi)容,可以通過查看管理員工具獲得網(wǎng)站發(fā)送的 Ajax 請(qǐng)求,通過調(diào)用 Ajax
請(qǐng)求拿到返回的 JSON 數(shù)據(jù),返回的 JSON 數(shù)據(jù)就是網(wǎng)頁中動(dòng)態(tài)渲染的數(shù)
據(jù)。另外一種方式是使用自動(dòng)化測(cè)試工具 Selenium 加載 PhantomJS 或
ChromeDriver 等瀏覽器來加載動(dòng)態(tài)內(nèi)容。

23.請(qǐng)闡述分布式爬蟲實(shí)現(xiàn)的原理

分布式爬蟲實(shí)際上就是在多臺(tái)主機(jī)上同時(shí)運(yùn)行爬蟲任務(wù)協(xié)同爬取,協(xié)同爬
取的前提是共享同一個(gè)爬取請(qǐng)求隊(duì)列,各臺(tái)主機(jī)不需要維護(hù)自己的爬取請(qǐng)求隊(duì)
列,而是從共享隊(duì)列存取請(qǐng)求。但每臺(tái)主機(jī)有各自的調(diào)度器和下載器,所以調(diào)
度和下載功能分別完成,這樣就可以多臺(tái)主機(jī)協(xié)同爬取,爬取效率成倍提高。
我們可以通過使用 Redis 的數(shù)據(jù)結(jié)構(gòu)(如列表,集合,有序集合)來實(shí)現(xiàn)
共享爬取請(qǐng)求隊(duì)列
通過利用 Redis 的集合來實(shí)現(xiàn)分布式請(qǐng)求的去重
通過調(diào)度器對(duì) Redis 的爬取請(qǐng)求隊(duì)列進(jìn)行判斷,當(dāng) Redis 隊(duì)列為空時(shí),爬蟲重
新爬取,如果不為空,爬蟲接著上次中斷處繼續(xù)爬取。

24.你都遇到過哪些反爬措施以及解決方式

  1. 檢查 HTTP 請(qǐng)求頭。
  • Accept

  • User-Agent - 三方庫 fake-useragent

  • Referer

  • Accept-Encoding

  • Accept-Language2. 檢查網(wǎng)站的 Cookie。

  • 有用的插件:EditThisCookie

    2.如何處理腳本動(dòng)態(tài)生成的 Cookie

  • 構(gòu)建 Cookie 池

  1. 動(dòng)態(tài)生成頁面內(nèi)容。
  • JavaScript 逆向。
  • Selenium + PhantomJS。
  1. 對(duì)訪問頻率進(jìn)行限制。
  • 對(duì)爬蟲進(jìn)行限速。
  • 隱藏身份
  • IP 代理 - 快代理 / 訊代理 / 芝麻代理 / 蘑菇代理。
  • TOR - 洋蔥路由,基本不考慮。
  1. 填寫表單或輸入驗(yàn)證碼。
  • 用 RoboBrowser 這樣的工具輔助提交表單。
  • OCR(Tesseract)+ 機(jī)器學(xué)習(xí)訓(xùn)練,商業(yè)項(xiàng)目一般不考慮 。
  • 專業(yè)識(shí)別平臺(tái) - 超級(jí)鷹 / 云打碼。
  1. 爬蟲陷阱(蜜罐)。
  • 網(wǎng)頁上有誘使爬蟲爬取的爬取的隱藏鏈接(陷阱或蜜罐),可以通過自
    動(dòng)化測(cè)試工具 Selenium 調(diào)用 PhantomJS 或 ChromeDriver 來判斷鏈接是否可
    見或者是否出現(xiàn)在可視區(qū)域來避開。

25.使用過 Scrapy 中間件嗎, 使用場(chǎng)景有哪些

Scrapy 中有以下幾個(gè)中間件,分別為蜘蛛中間件(spider
middleware)和下載器中間件(downloader middleware)。蜘蛛中間件是
在運(yùn)行過程中進(jìn)行一些處理,而下載器中間件是在頁面被下載時(shí)進(jìn)行的一些處
理。
蜘蛛中間件有以下幾個(gè)函數(shù)被管理:process_spider_input 接收一個(gè)
response 對(duì)象并處理,process_spider_exception 在爬蟲出現(xiàn)的異常時(shí)被
調(diào)用,process_spider_output 當(dāng) Spider 處理 response 返回 result 時(shí),該
方法被調(diào)用,process_start_requests 當(dāng) spider 發(fā)出請(qǐng)求時(shí)被調(diào)用。
下載中間件有以下幾個(gè)函數(shù)被管理:proc ess_request 在請(qǐng)求通過下載中
間件時(shí)被調(diào)用,process_response 在下載結(jié)果經(jīng)過中間件時(shí)被調(diào)用,
process_exception 在下載出現(xiàn)異常時(shí)被調(diào)用

Scrapy.png

Scrapy框架使用過程:

1.首先Spiders(爬蟲)將需要發(fā)送請(qǐng)求的url(requests)經(jīng)ScrapyEngine(引擎)交給Scheduler(調(diào)度器)。

2.Scheduler(排序,入隊(duì))處理后,經(jīng)ScrapyEngine,DownloaderMiddlewares(可選,主要有User_Agent, Proxy代理)交給Downloader。

3.Downloader向互聯(lián)網(wǎng)發(fā)送請(qǐng)求,并接收下載響應(yīng)(response)。將響應(yīng)(response)經(jīng)ScrapyEngine,SpiderMiddlewares(可選)交給Spiders。

4.Spiders處理response,提取數(shù)據(jù)并將數(shù)據(jù)經(jīng)ScrapyEngine交給ItemPipeline保存(可以是本地,可以是數(shù)據(jù)庫)。

提取url重新經(jīng)ScrapyEngine交給Scheduler進(jìn)行下一個(gè)循環(huán)。直到無Url請(qǐng)求程序停止結(jié)束。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容