首頁>技術>

第一章:爬蟲前奏(1)網路爬蟲A:爬蟲

通俗理解,就是一個模擬人類請求網站行為的程式,可以自動請求網頁,並抓取資料,然後進行一定分析,提取有用有價值的的資料

B:通用爬蟲和聚焦爬蟲

通用爬蟲:是搜尋引擎抓取系統(比如百度,谷歌)的重要組成部分。主要是將網際網路上的網頁下載到本地,形成一個網際網路內容的映象備份。也就是不管三七二十一,把網頁抓取下來

聚焦爬蟲:是面向特定需求的一種網路爬蟲程式,與通用爬蟲區別在於:聚焦爬蟲在實施網頁抓取的時候會內容進行篩選和處理,儘量保證只抓取與需求相關的網頁資訊

C:為什麼用Python寫爬蟲程式

語法優美,程式碼簡潔,開發效率高,採集模組多。相關的HTTP請求模組和HTML解析模組非常豐富。還有Scrapy和Scrapy-redis框架讓我們開發爬蟲變得異常簡單

(2)HTTP協議和Chrome抓包工具A:http和https協議

HTTP協議:超文字傳輸協議,是一種釋出和接受HTML頁面的方法。伺服器埠號是80埠

HTTPS協議:是HTTP協議的加密版本,在HTTP下加入了SSL層,伺服器埠號443

B:瀏覽器傳送http請求的過程

1:使用者在瀏覽器位址列中輸入了一個URL後並按回車鍵之後,瀏覽器會向HTTP伺服器傳送HTTP請求。HTTP請求主要分為“Get”和“Post”兩種方法

2:比如輸入百度的網址。瀏覽器就會發送一個Request請求獲取百度的html檔案,伺服器把Response檔案物件傳送給瀏覽器

3:瀏覽器分析Response中的html,發現其中引用了很多檔案,比如umage,css,js檔案。瀏覽器就會自動在此傳送Request獲取這些檔案

4:所有檔案下載成功之後,網頁根據HTML語法結構,完整顯示

C:URL詳解

URL:統一資源定位符

需要注意的是瀏覽器中請求一個URL,瀏覽器會對這個URL進行編碼。除了英文字母,數字和部分符號外,其他的全部使用百分號+十六進位制進行編碼

(3)抓包工具的使用和網路請求A:常用的請求方法

HTTP協議共定義了八種請求方法

這裡只使用兩種

有時網站和伺服器為了做反爬蟲機制,也經常會不按常理出牌,有可能應該使用get方法請求而一定要求改成post,要視情況而定

檢視網頁請求方式如下

B:請求頭常見引數

在http協議中,向伺服器傳送一個請求,資料分為三部分,第一個是把資料放在url中,第二資料放在body中(post請求),第三個把資料放在head中。

【user-Agent】是瀏覽器名稱,在爬蟲中經常用到,請求一個網頁的時候,伺服器透過這個引數就可以知道這個請求是由哪種瀏覽器傳送的。如果是透過爬蟲請求的,那麼這個值就是“Python”,對於那些有反爬蟲機制的網站來說,可以輕易封了你的請求

【Referer】表明當前這個請求是從哪個url過來的,一般也用作反爬蟲技術,如果不是從指定頁面過來的,那麼就不做相關相應。比如說“第二頁”按照常理應該是從第一頁或者其他頁跳轉過來的,而不是直接請求第二頁的URL

【cookie】http協議是無狀態的,也就是同一個人傳送了兩次請求,伺服器沒有能力直接知道這兩個

請求是否來自同一人所以這時就要用cookie做標識了。所以後期在爬取必須登入才能返回資訊的網站時,就要使用cookie了。

C:常見響應狀態碼

需要注意狀態碼200不意味資料正常,它只標示請求正常。因為有時伺服器如果發現了你的爬蟲程式,它會故意給你返回錯誤的資料

D:Chrome抓包工具第二章:網路請求-urllib庫(1)urlopen函式使用方法A:Urllib庫

urllib是Python中一個基本的網路請求庫,可以模擬瀏覽器行為,向指定伺服器傳送一個請求,並且可以儲存伺服器返回的資料

B:urlopen函式

在urllib庫中,所有和網路請求的相關方法,都被繼承到了urllib.request模組面了,下面是其基本使用方法

urlopen函式其中的三個引數經常使用

【url】就是我們請求的網址

【data】如果設定了這個值,那麼將變成post請求

該函式返回值是一個類檔案控制代碼物件,可用以下方法讀取

【read(size)】表示讀取幾個字元

【readline】表示讀取一行

【readlines】表示以行讀取

【getcode】獲取當前的狀態碼

(2)urlretrieve函式

該函式作用是將網頁檔案儲存到本地,第二個引數是儲存的檔案的名字

(3)解碼函式和編碼函式A:編碼函式urlencode

在瀏覽器裡,如果url裡面有中文,那麼瀏覽器會幫我們自動編碼(百分號+十六進位制),但是在Python中我們用程式碼請求,就只能用手動編碼的方式進行

要使用urlencode,那麼就要從urllib中匯入parse模組

下面是urlencode的基本用法

比如百度搜索成龍,使用程式碼請求伺服器時,不能直接把中文放上,所以我們要進行手動編碼。而現在的編譯器會自動編碼。手動編碼時我們只需將“wd=成龍”轉換為字典即可

B:解碼函式parse_qs

解碼函式編碼函式正好相反

(4)urlparse函式

前面說過一個url分為幾部分,而urlparse函式就是用來分割這個url,幫助我們獲取到url不同資訊

(5)request.Request類

如果想要在請求時增加一些請求頭,那麼就必須使用request.Request來實現,譬如增加一個User-Agent那麼程式碼如下

一般來說加一個請求頭往往達不到效果,因為伺服器會透過很多種方式去反爬蟲,所以在遇到一些“錯誤”時,可以嘗試多加請求頭,當然headers裡面也有其他屬性

(6)ProxyHandler實現代理IP

很多網站會監測某一時段某IP的訪問次數,如果訪問次數異常,就會禁止這個IP的訪問。所以我們可以設定一些代理伺服器,經常去換代理,就不怕IP封禁

urllib中透過ProxyHandler來設定使用代理伺服器

下面是使用代理的方法:

1:使用ProxyHandler,傳入代理構建一個handler

2:使用上面建立的handle構建一個opener

3:使用opener發請求

4:可以使用快代理

5:http://httpbin.org/ip此網址可以返回你的外網IP

下面不使用代理

(7)cookie原理和格式詳解

在網站中,http請求是無狀態的,也就說即使第一次和伺服器連線並且登入成功後,第二次請求依然不能知道當前請求是哪個使用者。cookie的出現就是為了解決這個問題,第一次登入伺服器返回一些資料(cookie)給瀏覽器,然後瀏覽器儲存在本地,當該使用者傳送第二次請求時,就會自動把上次存的cookie資料攜帶給伺服器,伺服器透過瀏覽器攜帶的資料就可以判斷當前使用者是哪個了。cookie儲存的資料量是有限的,一般不超過4kb。

cookie基本格式如下

【NAME】:cookie的名字

【VALUE】:cookie的值

【Expires】:cookie的過期時間

【Path】:cookie作用的路徑(就是表示是否能在子域名下作用)

【Domain】:cookie作用的域名

【SECURE】:是否只在http協議下起作用

如下,cookie資訊存在於反應頭裡(Response Headers)

(8)使用cookielib庫

這裡以人人網為例,人人網中想要訪問某人主頁,必須登入,也就是必須請求頭中要有cookie資訊,所以第一種就是方式就是在瀏覽器中登入,然後複製其cooke資訊,貼上到headers中

下面是沒有使用cookie資訊的,可以發現最終返回的網頁是登入頁面,而不是我們要的頁面

我們在請求頭中加入cookie

(9)利用http.cookiejar和request.HTTPCookieProcessor登入

執行後雖然返回了結果,但是總是提示登入錯誤,可能是因為在post時,除了賬號和密碼外,應該還要傳入其他值,被其檢測為了爬蟲,目前尚不知道原因

(10)cookie資訊的載入與儲存

cookie資訊可以儲存在本地,使用cookiejar的save方法,並且要指定一個檔名

cookie資訊可以儲存在本地,也可以儲存後再載入進來

舉例:這裡使用httpbin.org設定cookie資訊

需要注意,其cookie資訊在瀏覽器關閉後就會過期,也就程式碼走完就過期,所以save方法向下要傳入一個"ignore_discard"的引數

所以此時要載入cookie的話,我們就可以使用load函式,注意cookie過期

所以對於要反覆需要cookie的網站,可以使用上述方法先儲存後加載

15
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 寫春聯:py+requests+PIL+matplotlib