1. 程式人生 > 實用技巧 >爬蟲簡介 與 request 庫

爬蟲簡介 與 request 庫

1. 爬蟲簡介

2. requests 爬取豆瓣短評

1. 爬蟲簡介

爬蟲的定義

網路爬蟲(又被稱為網頁蜘蛛,網路機器人,在FOAF社群中間,更經常的稱為網頁追逐者),是一種按照一定的規則,自動地抓取全球資訊網資訊的程式或者指令碼

爬蟲有什麼用

  • 市場分析:電商分析、商圈分析、一二級市場分析等
  • 市場監控:電商、新聞、房源監控等
  • 商機發現:招投標情報發現、客戶資料發掘、企業客戶發現等

認識網址的構成

一個網站的網址一般由域名+自己編寫的頁面所構成。我們在訪問同一網站的網頁時,域名一般是不會改變的,因此我們爬蟲所需要解析的就是網站自己所編寫的不同頁面的入口url,只有解析出來各個頁面的入口,才能開始我們的爬蟲。

瞭解網頁的兩種載入方法

只有同步載入的資料才能直接在網頁原始碼中直接檢視到,非同步載入的資料直接檢視網頁原始碼是看不到的。

  • 同步載入:改變網址上的某些引數會導致網頁發生改變,例如:www.itjuzi.com/company?page=1(改變page=後面的數字,網頁會發生改變)。
  • 非同步載入:改變網址上的引數不會使網頁發生改變,例如:www.lagou.com/gongsi/(翻頁後網址不會發生變化)。
    • 同步任務:在主執行緒上排隊執行的任務,只有前一個任務執行完畢,才能執行後一個任務。
    • 非同步任務:不進入主執行緒、而進入"任務佇列"(task queue)的任務,只有等主執行緒任務執行完畢,"任務佇列"開始通知主執行緒,請求執行任務,該任務才會進入主執行緒執行(如回撥函式)。
驗證網頁是同步還是非同步載入的方法:把JavaScript由“允許”改為“阻止”,重新重新整理頁面。若網頁正常載入,說明該網頁的載入方式是同步載入,若網頁沒有正常載入,說明該網頁的載入方式是非同步載入。

認識網頁原始碼的構成

在網頁中右鍵點選檢視網頁原始碼,可以檢視到網頁的原始碼資訊。 原始碼一般由三個部分組成,分別是:
  • html:描述網頁的內容結構
  • css:描述網頁的樣式排版佈局
  • JavaScript:描述網頁的事件處理,即滑鼠或鍵盤在網頁元素上的動作後的程式

檢視網頁請求

以chrome瀏覽器為例,在網頁上點選滑鼠右鍵,檢查(或者直接F12),選擇network,重新整理頁面,選擇ALL下面的第一個連結,這樣就可以看到網頁的各種請求資訊。

請求頭(Request Headers):

  • Accept: text/html,image/*(瀏覽器可以接收的型別)
  • Accept-Charset: ISO-8859-1(瀏覽器可以接收的編碼型別)
  • Accept-Encoding: gzip,compress(瀏覽器可以接收壓縮編碼型別)
  • Accept-Language: en-us,zh-cn(瀏覽器可以接收的語言和國家型別)
  • Host: www.it315.org:80(瀏覽器請求的主機和埠)
  • If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT(某個頁面快取時間)
  • Referer: http://www.it315.org/index.jsp(請求來自於哪個頁面)
  • User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)(瀏覽器相關資訊)
  • Cookie:(瀏覽器暫存伺服器傳送的資訊)
  • Connection: close(1.0)/Keep-Alive(1.1)(HTTP請求的版本的特點)
  • Date: Tue, 11 Jul 2000 18:23:51 GMT(請求網站的時間)

響應頭(Response Headers):

  • Location: http://www.it315.org/index.jsp(控制瀏覽器顯示哪個頁面)
  • Server:apache tomcat(伺服器的型別)
  • Content-Encoding: gzip(伺服器傳送的壓縮編碼方式)
  • Content-Length: 80(伺服器傳送顯示的位元組碼長度)
  • Content-Language: zh-cn(伺服器傳送內容的語言和國家名)
  • Content-Type: image/jpeg; charset=UTF-8(伺服器傳送內容的型別和編碼型別)
  • Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT(伺服器最後一次修改的時間)
  • Refresh: 1;url=http://www.it315.org(控制瀏覽器1秒鐘後轉發URL所指向的頁面)
  • Content-Disposition: attachment; filename=aaa.jpg(伺服器控制瀏覽器下載方式開啟檔案)
  • Transfer-Encoding: chunked(伺服器分塊傳遞資料到客戶端)
  • Set-Cookie: SS=Q0=5Lb_nQ; path=/search(伺服器傳送Cookie相關的資訊)
  • Expires: -1(伺服器控制瀏覽器不要快取網頁,預設是快取)
  • Cache-Control: no-cache(伺服器控制瀏覽器不要快取網頁)
  • Pragma: no-cache(伺服器控制瀏覽器不要快取網頁)
  • Connection: close/Keep-Alive(HTTP請求的版本的特點)
  • Date: Tue, 11 Jul 2000 18:23:51 GMT(響應網站的時間)

通用的網路爬蟲框架

  1. 挑選種子URL;
  2. 將這些URL放入待抓取的URL佇列;
  3. 取出待抓取的URL,下載並存儲進已下載網頁庫中。此外,將這些URL放入已抓取URL佇列;
  4. 分析已抓取佇列中的URL,並且將URL放入待抓取URL佇列,從而進入下一迴圈。

2. requests 爬取豆瓣短評

Requests庫的主要方法

requests.get方法:

1 # 使用get方法傳送請求,返回包含網頁資料的Response並存儲到Response物件r中
2 r = requests.get(url)
Response物件的屬性:
  • r.status_code:http請求的返回狀態,200表示連線成功(HTTP狀態碼)
  • r.text:返回物件的文字內容
  • r.content:猜測返回物件的二進位制形式
  • r.encoding:分析返回物件的編碼方式
  • r.apparent_encoding:響應內容編碼方式(備選編碼方式)

示例:分析豆瓣短評網頁

1 import requests
2 
3 url = ' https://book.douban.com/subject/27147922/?icn=index-editionrecommend'
4 r = requests.get(url, timeout=20)  # 設定超時時間為20秒
5 # #print(r.text) # 列印返回文字
6 # 丟擲異常
7 print(r.raise_for_status())  # None