爬蟲:爬蟲基礎

通用爬蟲和聚焦爬蟲

通用爬蟲

通用網絡爬蟲 是 捜索引擎抓取系統(Baidu、Google、Yahoo等)的重要組成部分。主要目的是將互聯網上的網頁下載到本地,形成一個互聯網內容的鏡像備份。

通用搜索引擎(Search Engine)工作原理

通用網絡爬蟲 從互聯網中搜集網頁,採集信息,這些網頁信息用於爲搜索引擎建立索引從而提供支持,它決定着 整個引擎系統的內容是否豐富,信息是否即時,因此其性能的優劣直接影響着搜索引擎的效果。
在這裏插入圖片描述
搜索引擎如何獲取一個新網站的URL:

1.新網站向搜索引擎主動提交網址:

2.在其他網站上設置新網站外鏈

3.和DNS解析服務商(如DNSPod等)合作,新網站域名將被迅速抓取。

基本工作流程圖

在這裏插入圖片描述

爬蟲限制

搜索引擎蜘蛛的爬行是被輸入了一定的規則的,它需要遵從一些命令或文件的內容。

  1. rel=“nofollow”,,告訴搜索引擎爬蟲無需抓取目標頁,同時告訴搜索引擎無需將的當前頁的Pagerank傳遞到目標頁.
  2. Robots協議(也叫爬蟲協議、機器人協議等),全稱是“網絡爬蟲排除標準”(Robots Exclusion Protocol),網站通過Robots協議告訴搜索引擎哪些頁面可以抓取,哪些頁面不能抓取。
    在這裏插入圖片描述

侷限性

  1. 大多情況下,網頁裏90%的內容對用戶來說都是無用的。
  2. 搜索引擎無法提供針對具體某個用戶的搜索結果。
  3. 圖片、數據庫、音頻、視頻多媒體等不能很好地發現和獲取。
  4. 基於關鍵字的檢索,難以支持根據語義信息提出的查詢,無法準確理解用戶的具體需求。

聚焦爬蟲

聚焦爬蟲,是"面向特定主題需求"的一種網絡爬蟲程序,它與通用搜索引擎爬蟲的區別在於:聚焦爬蟲在實施網頁 抓取時會對內容進行處理篩選,儘量保證只抓取與需求相關的網頁信息。
我們後期要學習的就是聚焦爬蟲

HTTP和HTTPS

HTTP協議-80端口
HyperTextTransferProtocol, 超文本傳輸協議是一種發佈和接收HTML頁面的方法。

HTTPS-443端口
HypertextTransferProtocoloverSecureSocketLayer, 簡單講是HTTP的安全版,在HTTP下加入SSL 層。

HTTP工作原理

在這裏插入圖片描述
網絡爬蟲抓取過程可以理解爲模擬瀏覽器操作的過程。

瀏覽器發送HTTP請求的過程

  1. 當用戶在瀏覽器的地址欄中輸入一個URL並按回車鍵之後,瀏覽器會向HTTP服務器發送HTTP請求。HTTP請求主要分爲“Get”和“Post”兩種方法。
  2. 當我們在瀏覽器輸入URLhttp://www.baidu.com的時候,瀏覽器發送一個Request請求去獲取http://www.baidu.com的html文件,服務器把Response文件對象發送回給瀏覽器。
  3. 瀏覽器分析Response中的HTML,發現其中引用了很多其他文件,比如Images文件,CSS文件,JS文件。瀏覽器會自動再次發送Request去獲取圖片,CSS文件,或者JS文件。
  4. 當所有的文件都下載成功後,網頁會根據HTML語法結構,完整的顯示出來了。

URL

URL(Uniform/UniversalResourceLocator的縮寫):統一資源定位符,是用於完整地描述Internet上網頁和其他資源的地址的一種標識方法。

基本格式: scheme://host[:port#]/path/…/[?query-string][#anchor]

query-string:參數,發送給http服務器的數據
http://www.baidu.com?wd=python
anchor:錨(跳轉到網頁的指定錨點位置)

客戶端HTTP請求

請求消息

客戶端發送一個HTTP請求到服務器的請求消息,包括以下格式:
在這裏插入圖片描述
在這裏插入圖片描述

請求方法Method

根據HTTP標準,HTTP請求可以使用多種請求方法.

  • HTTP0.9:只有基本的文本GET功能。
  • HTTP1.0:完善的請求/響應模型,並將協議補充完整,定義了三種請求方法:GET,POST和HEAD方法。
  • HTTP1.1:在1.0基礎上進行更新,新增了五種請求方法:OPTIONS,PUT,DELETE,TRACE和CONNECT方法。
    在這裏插入圖片描述

Get 和 Post 詳解

  1. GET是從服務器上獲取數據,POST是向服務器傳送數據
  2. GET請求參數顯示,都顯示在瀏覽器網址上,即“Get”請求的參數是URL的一部分。
  3. POST請求參數在請求體當中,消息長度沒有限制而且以隱式的方式進行發送,通常用來向HTTP服務器提交量比較大的數據(比如請求中包含許多參數或者文件上傳操作等),請求的參數包含在“Content-Type”消息頭裏,指明該消息體的媒體類型和編碼。

常用的請求報頭

Host: 主機和端口號
Connection : 客戶端與服務連接類型, 默認爲keep-alive
User-Agent: 客戶瀏覽器的名稱
Accept: 瀏覽器或其他客戶端可以接受的MIME文件類型
Referer:表明產生請求的網頁來自於哪個URL
Accept-Encoding:指出瀏覽器可以接受的編碼方式。
Accept-Language:語言種類
Accept-Charset: 字符編碼
Cookie:瀏覽器用這個屬性向服務器發送Cookie
Content-Type:POST請求裏用來表示的內容類型。

在這裏插入圖片描述
在這裏插入圖片描述

HTTP響應

組成

HTTP響應由四個部分組成,分別是: 狀態行 、 消息報頭 、 空行 、 響應正文
在這裏插入圖片描述

響應狀態碼

在這裏插入圖片描述
常見的狀態碼:

200: 請求成功
302: 請求頁面臨時轉移至新url
307和304: 使用緩存資源
404: 服務器無法找到請求頁面
403: 服務器拒絕訪問,權限不夠
500: 服務器遇到不可預知的情況

Cookie和Session

服務器和客戶端的交互僅限於請求/響應過程,結束之後便斷開,在下一次請求時,服務器會認爲新的客戶端。爲了維護他們之間的鏈接,讓服務器知道這是前一個用戶發送的請求,必須在一個地方保存客戶端的信息。

  • Cookie:通過在客戶端記錄的信息確定用戶的身份。
  • Session:通過在服務器端記錄的信息確定用戶的身份。
    在這裏插入圖片描述

圖片下載器

製作爬蟲的基本步驟

  1. 需求分析
  2. 分析網頁源代碼,配合F12
  3. 編寫正則表達式或者其他解析器代碼
  4. 正式編寫python爬蟲代碼

需求分析:

"我想要圖片,我又不想上網搜“
“最好還能自動下載”
……

這就是需求,至少要實現兩個功能,一是搜索圖片,二是自動下載。

分析網頁源代碼:
在這裏插入圖片描述
在這裏插入圖片描述
得到圖片地址的位置規律。

編寫正則表達式解析代碼:

pic_url = re.findall('"objURL":"(.*?)",',html,re.S)

編寫爬蟲代碼:

# encoding=utf-8
"""
Date:2019-08-07 10:33
User:LiYu
Email:[email protected]

"""
import os
import re
import requests

imgDir = 'pictures'


def downloadPic(html, keyword):
    headers = {
        'User-Agent': "Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0"
    }
    pic_url = re.findall('"objURL":"(.*?)",', html, re.S)
    if not pic_url:
        print('沒有找到關鍵詞:' + keyword + ' 的圖片...')
    else:
        count = 0
        print("找到關鍵詞:" + keyword + " 的圖片, 現在開始下載圖片...")
        for i in pic_url:
            # 下載五張
            if count >= 5:
                break
            # 目錄不存在則先創建
            if not os.path.exists(imgDir):
                print('正在創建目錄:', imgDir)
                os.makedirs(imgDir)
            # 圖片重命名和目錄拼接
            name = keyword + '_' + str(count) + '.' + i.split('.')[-1]
            filename = os.path.join(imgDir, name)
            # 下載圖片
            print('正在下載第 ' + str(count + 1) + ' 張圖片', '圖片地址:' + str(i))
            try:
                response = requests.get(i, headers=headers)
            except Exception as e:
                print('[錯誤]', e)
                count -= 1
                continue
            # 保存圖片
            with open(filename, 'wb') as f:
                f.write(response.content)
            count += 1


if __name__ == '__main__':
    keyword = input('請輸入你要下載的圖片關鍵字:')
    url = 'http://image.baidu.com/search/index?tn=baiduimage&ie=utf-8&word=' + keyword
    try:
        result = requests.get(url)
    except Exception as e:
        html = ''
        print('[錯誤]', e)
    else:
        html = result.text
        downloadPic(html, keyword)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章