第一章:爬蟲前奏(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的網站,可以使用上述方法先儲存後加載