天天看點

Python爬蟲————爬蟲基礎

文章目錄

    • Python爬蟲————爬蟲基礎
        • 一、爬蟲概述
            • 什麼是爬蟲?
            • 網頁三大特征:
            • 爬蟲設計思路
        • 二、通用爬蟲和聚焦爬蟲
            • 通用爬蟲
            • 聚焦爬蟲
        • 三、HTTP和HTTPS
            • HTTP工作原理
            • URL
        • 四、用戶端HTTP請求
            • 請求方法Method
            • Get 和 Post 詳解
            • 常用的請求報頭
        • 五、HTTP響應
            • 響應狀态碼
            • Cookie和Session
        • 六、BS4
            • BS4簡介
            • BS4的4種對象
        • 七、執行個體:圖檔下載下傳器
            • 制作爬蟲的基本步驟
            • 需求分析
            • 代碼實作

Python爬蟲————爬蟲基礎

一、爬蟲概述

什麼是爬蟲?

爬蟲就是抓取網頁資料的程式。

網頁三大特征:

1.網頁都有自己的為唯一的URL(統一資源定位符)來進行定位;

2.網頁都使用HTML(超文本标記語言)來描述頁面資訊;

3.網頁都使用HTTP/HTTPS(超文本傳輸協定)來傳輸HTML資料。

爬蟲設計思路

1.首先确定需要爬取的網頁URL位址。

2.通過HTTP/HTTPS協定來擷取對應的HTML頁面。

3.提取HTML頁面裡有用的資料:

1)如果是需要的資料,就儲存起來。

2)如果是頁面的其他URL,繼續執行第二步。

二、通用爬蟲和聚焦爬蟲

通用爬蟲

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

通用網絡爬蟲 從網際網路中搜集網頁,采集資訊,這些網頁資訊用于為搜尋引擎建立索引進而提供支援,它決定着 整個引擎系統的内容是否豐富,資訊是否即時,是以其性能的優劣直接影響着搜尋引擎的效果。

Python爬蟲————爬蟲基礎

搜尋引擎如何擷取一個新網站的URL:

1. 新網站向搜尋引擎主動送出網址:

2. 在其他網站上設定新網站外鍊

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

通用爬蟲的局限性

1.大多情況下,網頁裡90%的内容對使用者來說都是無用的。

2. 搜尋引擎無法提供針對具體某個使用者的搜尋結果。

3. 圖檔、資料庫、音頻、視訊多媒體等不能很好地發現和擷取。

4. 基于關鍵字的檢索,難以支援根據語義資訊提出的查詢,無法準确了解使用者的具體需求。

聚焦爬蟲

聚焦爬蟲,是"面向特定主題需求"的一種網絡爬蟲程式,它與通用搜尋引擎爬蟲的差別在于:聚焦爬蟲在實施網頁 抓取時會對内容進行處理篩選,盡量保證隻抓取與需求相關的網頁資訊。

三、HTTP和HTTPS

HTTP協定-80端口

HyperTextTransferProtocol, 超文本傳輸協定是一種釋出和接收HTML頁面的方法。

HTTPS-443端口

HypertextTransferProtocoloverSecureSocketLayer, 簡單講是HTTP的安全版,在HTTP下加入SSL 層。

HTTP工作原理

網絡爬蟲抓取過程可以了解為模拟浏覽器操作的過程。

浏覽器發送HTTP請求的過程:

  1. 當使用者在浏覽器的位址欄中輸入一個URL并按Enter鍵之後,浏覽器會向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]

Python爬蟲————爬蟲基礎

四、用戶端HTTP請求

用戶端發送一個HTTP請求到伺服器的請求消息,包括以下格式:

Python爬蟲————爬蟲基礎
Python爬蟲————爬蟲基礎

請求方法Method

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

HTTP0.9:隻有基本的文本GET功能。

HTTP1.0:完善的請求/響應模型,并将協定補充完整,定義了三種請求方法:GET,POST和HEAD方法。

HTTP1.1:在1.0基礎上進行更新,新增了五種請求方法:OPTIONS,PUT,DELETE,TRACE和CONNECT方法。

Python爬蟲————爬蟲基礎

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請求裡用來表示的内容類型。

Python爬蟲————爬蟲基礎
Python爬蟲————爬蟲基礎

五、HTTP響應

HTTP響應由四個部分組成,分别是: 狀态行 、 消息報頭 、 空行 、 響應正文

Python爬蟲————爬蟲基礎

響應狀态碼

Python爬蟲————爬蟲基礎

200: 請求成功

302: 請求頁面臨時轉移至新url

307和304: 使用緩存資源

404: 伺服器無法找到請求頁面

403: 伺服器拒絕通路,權限不夠

500: 伺服器遇到不可預知的情況

Cookie和Session

伺服器和用戶端的互動僅限于請求/響應過程,結束之後便斷開,在下一次請求時,伺服器會認為新的用戶端。為了維護他們之間的連結,讓伺服器知道這是前一個使用者發送的請求,必須在一個地方儲存用戶端的資訊。

Python爬蟲————爬蟲基礎

六、BS4

BS4簡介

Beautiful Soup提供一些簡單的、python式的函數用來處理導航、搜尋、修改分析樹等功能。它是一個

工具箱,通過解析文檔為tiful Soup自動将輸入文檔轉換為Unicode編碼,輸出文檔轉換為utf-8編碼。

你不需要考慮編碼方式,除非文檔沒有指定一個編一下原始編碼方式就可以了。

BS4的4種對象

Beautiful Soup将複雜HTML文檔轉換成一個複雜的樹形結構,

每個節點都是Python對象,所有對象可以歸納為4種: Tag , NavigableString , BeautifulSoup , Comment

2-1. BeautifulSoup對象

2-2. Tag對象

Tag就是html中的一個标簽,用BeautifulSoup就能解析出來Tag的具體内容,具體的格式為soup.name,其中name是html下的标簽。

七、執行個體:圖檔下載下傳器

制作爬蟲的基本步驟

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

需求分析

"我想要圖檔,我又不想上網搜“

“最好還能自動下載下傳”

……

這就是需求,至少要實作兩個功能,一是搜尋圖檔,二是自動下載下傳。

pic_url = re.findall(’“objURL”:"(.*?)",’,html,re.S)

代碼實作

"""
圖檔下載下傳器
"""
# -*- coding:utf-8 -*-

import re
import requests
import os
def downloadPic(html, keyword):
    """
    :param html: 頁面的源代碼
    :param keyword: 搜尋的關鍵字
    :return:
    """
    # (.*?)代表任意多個字元
    # ()代表分組, 值傳回符合條件的字元串中括号裡面的内容;
    pic_url = re.findall('"objURL":"(.*?)",', html, re.S)[:5]
    count = 0
    print('找到關鍵詞:' + keyword + '的圖檔,現在開始下載下傳圖檔...')

    # each 是每個圖檔的url位址
    for each in pic_url:
        try:
            headers = {
                'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) '
                              'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.109 '
                              'Mobile Safari/537.36'}
            # 擷取指定圖檔的相應對象;
            response = requests.get(each, timeout=10, headers=headers)
        except requests.exceptions.ConnectionError:
            print('【錯誤】目前圖檔無法下載下傳')
            continue
        except Exception as e:
            print('【錯誤】目前圖檔無法下載下傳')
            print(e)
            continue
        else:
            # print(response.status_code)
            if response.status_code != 200:
                print("通路失敗: ", response.status_code)
                continue
        #   ******** 存儲圖檔到本地*******************************
        if not os.path.exists(imgDir):
            print("正在建立目錄 ", imgDir)
            os.makedirs(imgDir)

        posix = each.split('.')[-1]
        if posix not in ['png', 'jpg', 'gif', 'jpeg']:
            break
        print('正在下載下傳第' + str(count + 1) + '張圖檔,圖檔位址:' + str(each))
        name = keyword + '_' + str(count) + '.' + posix
        filename = os.path.join(imgDir, name)
        count += 1
        with open(filename, 'wb') as f:
            # response.content: 傳回的是二進制文本資訊
            #  response.text:傳回的字元串文本資訊
            f.write(response.content)


if __name__ == '__main__':
    imgDir = 'pictures'
    word = input("Input key word: ")
    url = 'http://image.baidu.com/search/index?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&word=' + word
    try:
        response = requests.get(url)
    except Exception as e:
        print(e)
        content = ''
    else:
        content = response.text

    downloadPic(content, word)