天天看點

Python網絡爬蟲基礎第一章 網絡爬蟲入門

已寫章節

第一章 網絡爬蟲入門

第二章 基本庫的使用

第三章 解析庫的使用

第四章 資料存儲

第五章 動态網頁的抓取

文章目錄

      • 已寫章節
  • 第一章 網絡爬蟲入門
    • 1.1 為什麼要學習爬蟲
      • 1.1.1 爬蟲是什麼
      • 1.1.2 網絡爬蟲能幹什麼
      • 1.1.3 能獲得什麼樣的資料
    • 1.2 網絡爬蟲的限制
      • 1.2.1 網絡爬蟲的合法性
      • 1.2.2 Robots協定
      • 1.2.3 網絡爬蟲限制
    • 1.3 爬蟲基本知識
      • 1.3.1 HTTP基本原理
        • 1.3.1.1 URI和URL
        • 1.3.1.2. 超文本
        • 1.3.1.3. HTTP和HTTPS
        • 1.3.1.4 HTTP請求過程
        • 1.3.1.5 請求
          • 1. 請求方法
          • 2. 請求的網址
          • 3. 請求頭
        • 1.3.1.6 響應
          • 1. 響應狀态碼
          • 2. 響應頭
          • 3. 響應體
      • 1.3.2 Python爬蟲爬取網頁流程
      • 1.3.3 Python爬蟲的技術實作

第一章 網絡爬蟲入門

1.1 為什麼要學習爬蟲

1.1.1 爬蟲是什麼

爬蟲又被稱為網頁蜘蛛、網頁機器人,爬蟲是一種按照一定的規則,自動的抓取網際網路資訊的程式或腳本。網絡爬蟲是搜尋引擎系統中十分重要的組成部分,它負責從網際網路中收集網頁,采集資訊,這些網頁資訊用于建立索引,進而為搜尋引擎提供支援,它決定了整個搜尋引擎的内容是否豐富,資訊是否及時,是以爬蟲的性能的高低直接決定了搜尋引擎的效果。

1.1.2 網絡爬蟲能幹什麼

  • 興趣愛好
  • 了解競争對手
  • 抓取某個網站或應用中的内容,提取有用的價值
  • 提取資料,幫助做出更好的決策

1.1.3 能獲得什麼樣的資料

  • 電影排名及詳細資訊
  • 社交媒體的文章
  • 購物網站的商品價格和點評
  • 招聘網站的招聘資訊

1.2 網絡爬蟲的限制

1.2.1 網絡爬蟲的合法性

一般來說,在網際網路中展示的資訊可以說是公共的,不能被爬取的資訊都寫在網站的Robots協定中了,但并不代表遵守Robots協定就一定沒有問題,爬蟲的行為還要“類似人的操作”,不能不限制爬蟲的速度。

1.2.2 Robots協定

Robots協定(爬蟲協定)的全稱是“網絡爬蟲排除标準”(Robots Exclusion Protocol),網站通過Robots協定告訴搜尋引擎哪些頁面可以抓取,哪些頁面不能抓取。該協定是國際網際網路界通行的道德規範,雖然沒有寫入法律,但是每一個爬蟲都應該遵守該協定。

下面是淘寶網的Robots協定:

打開https://www.taobao.com/robots.txt:

Python網絡爬蟲基礎第一章 網絡爬蟲入門

京東的robots協定:

Python網絡爬蟲基礎第一章 網絡爬蟲入門

1.2.3 網絡爬蟲限制

爬蟲除了要遵守Robots協定外,我們使用網絡爬蟲時還要對自己進行限制:

  • 過于快速的爬取或者爬取頻繁都會對伺服器造成巨大的壓力
  • 有些伺服器上的資料有産權歸屬,爬取後用資料來牟利将帶來法律風險
  • 網絡爬蟲具有一定的突防能力,使用爬蟲擷取被保護的資料會導緻資訊洩露

1.3 爬蟲基本知識

1.3.1 HTTP基本原理

1.3.1.1 URI和URL

URI (Uniform Resource Identifier) :統一資源标志符

URL (Universar Resource Locator) : 統一資源定位符

例如:https://github.com/favicon.ico即是一個URl,也是一個URL,即有這樣一個圖示資源,用URL/URI來唯一指定了它的通路方式,這其中包含了通路協定HTTPS、通路路徑(即根目錄)和資源名稱favicon.ico。通過這個連結,我們就可以在網際網路中找到這樣一個資源。

url格式:

基本格式如下:

schema://host[:port#]/path/…/[?query-string][#anchor]

schema: 協定(例如:http,https,ftp)

host:伺服器的IP或域名

port#:伺服器的端口

path:通路資源的路徑

query:string參數,發送給http伺服器的資料

anchor:錨(跳轉到網頁的指定錨點位置)

下面給個例子:http://localhost:8888/hello

http是協定,localhost是伺服器的主機名,8888是端口号,hello是資源的路徑

URL是URI的一個子集,也就是說每一個URL都是URI,但不是每一個 URI都是URL,URI還包括一個子類叫做URN(Universal Resource Name),它是統一資源名稱:

URN:隻命名資源而不指定如何定位資源,比如:

urn:isbn:1203102348

它隻是指定了一本書的ISBN,可以唯一辨別這本書,但是沒有指定到哪裡定位這本書

URI包括URL和URN。

現在的URN用得比較少,幾乎所有的URI是URL,是以,一般的網頁連結可以認為是URI,也可以認為是URL。

1.3.1.2. 超文本

超文本(Hypertext):浏覽器裡看到的網頁就是超文本解析而成的,其網頁源代碼是一系列的HTML代碼,裡面包含了一系列的标簽,比如:

  • img 标簽顯示圖檔
  • p 标簽指定顯示段落
  • a标簽指定連結

浏覽器将解析這些标簽後,便形成了我們平常看到的網頁,而網頁的源代碼HTML就可以稱作超文本。在浏覽器中打開任意網頁界面,滑鼠在任意位置右擊,點選“檢查”,在彈出的界面上方的選項框中點選“Elements”就可以檢視網頁的源代碼了,那一個個标簽就是超文本。

  1. 檢視網頁源代碼的功能幾乎是每一個浏覽器必備的功能,前端人員可以利用該功能檢視網頁效果、找bug。
  2. 在浏覽器中,也使用F12(有些電腦是Fn+F2)快捷鍵來打開調試界面
  3. 你學會了這個調試功能,下次遇到某些網頁禁止複制網頁内容,你想到了解決辦法嗎?

1.3.1.3. HTTP和HTTPS

在https://www.baidu.com這個連結中,URL的開頭會有https或http,這個就是通路資源所需要的協定類型,有時還會看到ftp、sftp、smb開頭的URL,這些也是協定類型,常用的協定是HTTP和HTTPS。

HTTP(Hyper Text Transfer Protocol)的中文名字叫超文本傳輸協定,用于從網絡傳輸超文本資料到本地浏覽器的傳輸協定,能保證高效而準确的傳送超文本文檔。由網際網路協會(World Wide Web Consortium)和Internet工作小組IETF(Internet Engineering Task Force)共同合作和制定的規範。

HTTPS(Hyper Test Transfer protocol over Secure Socket Layer)是以安全為目标的HTTP通道,簡單講是HTTP的安全版,即HTTP下加入SSL層,簡稱為HTTPS,安全基礎是SSL,是以通過它傳輸的内容都是經過SSL加密。

HTTPS的主要作用分為兩種:

  • 建立一個資訊安全通道,來保證資料傳輸的安全
  • 确認網站的真實性

越來越多的網站和App都在向HTTPS方向發展,是以,HTTPS流行是大勢所趨。

1.3.1.4 HTTP請求過程

在浏覽器中輸入一個url,回車之後便可以在浏覽器中觀察到頁面内容,這個過程是浏覽器向網站所在的伺服器發送了一個請求,網站的伺服器接收到這個請求後進行處理和解析,然後将對應的響應傳回給浏覽器。

在浏覽器的調試界面檢視請求的詳細資訊:

Python網絡爬蟲基礎第一章 網絡爬蟲入門

下面是點選請求資源清單中任意一個後展示的更詳細的資訊,其中包括General(總覽),Response Headers(傳回頭),**Request Headers(請求頭)**這三部分。各個部分下都是它的詳細資訊:

Python網絡爬蟲基礎第一章 網絡爬蟲入門

1.3.1.5 請求

請求大緻包含4部分:

  • 請求方法(Request Method)
  • 請求的網址(Request URL)
  • 請求頭 (Request Headers)
  • 請求體 (Request Body)
1. 請求方法

請求方法有很多,但最常見的請求隻有

GET

POST

:

GET:

在浏覽器中直接輸入URL并回車,便發起了一個

GET

請求,請求的參數會包含在URL中,例如:在百度中搜尋Python,這就是一個

GET

請求,請求連結為

https://www.baidu.com/s?wd=Python

,URL中包含了請求的參數資訊,這裡wd(word)參數表示要搜尋的關鍵字,它的值(Python)就是搜尋的内容。

POST:

POST

請求大多數在表單送出時發起,例如:對于一個登入表單,輸入使用者名和密碼後,點選“登入”按鈕,這通常會發起一個

POST

請求,起資料通常以表單的形式傳輸,而不會展現在URL中。

GET和POST的差別:

  • GET

    請求中的參數包含在URL中,資料可以在URL中看到,而

    POST

    請求的URL不會包含這些資料,資料都是通過表單的形式傳輸的,會包含在請求體中
  • GET

    請求送出的資料最多隻有1024位元組,而

    POST

    請求沒有限制

常用請求彙總:

方法 描述
GET 請求頁面,并傳回頁面内容
HEAD 類似于GET請求,隻不過傳回的響應體中沒有具體的内容,用于擷取報頭
POST 大多用在送出表單或上傳檔案,資料包含在請求體中
PUT 從用戶端向伺服器傳送的資料取代指定文檔中的内容
DELETE 請求伺服器删除指定的頁面
CONNECT 把伺服器當作跳闆,讓伺服器代替用戶端通路其它頁面
OPTIONS 允許用戶端檢視伺服器的性能
TRACE 回顯伺服器收到的請求,主要用于測試或診斷
2. 請求的網址

請求的網址:即統一資源定位符URL,可以唯一确定我們想要請求的資源

3. 請求頭

請求頭:用來說明伺服器要使用的附加資訊,比較重要的資訊有Cookie、Referer、User-Agent

下面是一些常用的請求頭的資訊:

  • Accept:請求報頭域,用于指定用戶端可接受那些類型的資訊。
  • Accept-Language:指定用戶端可接受的語言類型。
  • Accept-Encoding:指定用戶端可接受的内容編碼。
  • Host:用于指定請求資源的主機IP和端口号,其内容為請求URL的原始伺服器或網關的位置,從HTTP1.1開始,請求必須包含此項内容。
  • Cookie:也常用複數形式Cookies,這是網站為了辨識使用者進行會話跟蹤而存儲在本地的資料,它的主要功能是維持目前通路會話。例如:我們輸入使用者名和密碼成功登陸到某個網站後,伺服器會用會話儲存登陸狀态資訊,後面我們每次重新整理或請求該站點的其它頁面時,會發現都是登陸狀态,這就是Cookie的功勞。Cookies裡面有資訊辨別了我們所對應的伺服器的會話,每次在請求該站點時,都會在請求頭長加上Cookies并将其發送給伺服器,伺服器通過Cookies識别出是我們自己,并且查出目前狀态是登陸狀态,是以傳回結果就是登陸之後才能看到的網頁内容。
  • Referer:此内容用來識别這個請求是從哪個頁面發過來的,伺服器可以拿到這一資訊并做相應的處理,如做來源統計、防盜鍊處理等
  • User-Agent:簡稱UA,它是一個特殊的字元串頭,可以使伺服器識别客戶使用的作業系統及版本、浏覽器及版本資訊等。在做爬蟲是加上此資訊,可以将爬蟲僞裝成浏覽器,如果不加,将會是預設的爬蟲的UA,很有可能會被識别為爬蟲。
  • Content-Type:也叫做網際網路媒體資訊(Internet Media Type)或者MIME類型,在HTTP協定消息頭中,它用來表示具體請求中的媒體類型資訊。例如,text/html代表HTML格式,image/gif代表GIF圖檔,application/json代表JSON類型,更多的對應關系大家可以檢視這張表:http://tool.oschina.net/commons
    伺服器和用戶端的互動僅限于請求/響應過程,結束之後便斷開,在下一次請求伺服器會認為是新的用戶端,為了維護它們之間的聯系,讓伺服器知道這次請求和上一次請求是同一個使用者,必須在一個地方儲存用戶端的資訊,
    • Cookie通過在用戶端記錄資訊确定使用者身份
    • Session通過在伺服器端記錄資訊确定使用者身份

是以,請求頭是請求中的重要組成部分,一般爬蟲都要處理請求頭。

1.3.1.6 響應

響應由伺服器端傳回給用戶端,可以分為三部分:

  • 響應狀态碼(Response Status Code)
  • 響應頭(Response Headers)
  • 響應體(Response Body)
1. 響應狀态碼

響應狀态碼表示伺服器的響應狀态:

響應狀态碼 含義
200 正常
301 本網頁永久性轉移達到另一個位址
302 請求的資源暫時駐留在不同的URI下
304 伺服器已近執行了GET,但檔案未變化
400 請求出現文法錯誤
403 用戶端未能獲得授權
404 在指定位置不存在所申請的資源
500 伺服器遇到了意料不到的情況
503 伺服器由于維護或者負載過重未能應答
2. 響應頭

響應頭包含了伺服器對請求的應答資訊,如

Content-Type

Server

Set-Cookie

等,下面是一些常用的響應頭資訊:

  • Date:辨別響應産生的時間
  • Last-Modified:指定資源最後修改時間
  • Content-Encoding:指定響應内容的編碼
  • Server:包含伺服器的資訊,比如名稱、版本号等
  • Content-Type:文檔類型,指定放回的資料類型是什麼,如text/jepg這代表圖檔
  • Set-Cookie:設定Cookie。響應頭中的Set-Cookie告訴浏覽器需要将此内容放在Cookie中,下次請求攜帶Cookie請求
  • Exprice:指定響應的過期時間,可以使代理伺服器或浏覽器将所加載的内容更新到緩存中,如果再次通路時,就可以直接從緩存中加載,降低伺服器負載,縮短加載時間
3. 響應體

響應中最重要的當屬響應體的内容,響應的正文資料都在響應體中,

比如:

  • 請求網頁時,它的響應體就是HTML代碼
  • 請求一張圖檔時,它的響應體就是圖檔的二進制資料

在爬蟲中,我們獲得的就是HTML代碼,通過解析HTML代碼來擷取我們想要的内容。

1.3.2 Python爬蟲爬取網頁流程

網絡爬蟲的流程主要分為以下三步:

  • 擷取網頁
  • 解析網頁
  • 存儲資料

擷取網頁:給一個網址發送請求,該網址就會傳回網頁資料,類似于在浏覽器中輸入一個網址後按下回車出現網頁。

解析網頁:從傳回的頁面資料中提取想要的資訊。類似于在網頁中找到商品的價格。

存儲資料:把提取出的資訊儲存下來,可以儲存為檔案,也可以存儲到資料庫中。

1.3.3 Python爬蟲的技術實作

擷取頁面:urllib、requests(重點),selenium(重點)、多線程、登入抓取、突破IP封禁

解析網頁:re(重點)、BeautifulSoup、lxml(重點)、pyquare

存儲資料:txt檔案(重點)、csv檔案(重點)、圖檔檔案、MySQL資料庫(重點)

架構:Selenium、Scrapy

繼續閱讀