簡單的網頁爬蟲開發

📼網絡連接與爬蟲原理
在這裏插入圖片描述
網絡連接

  • Client向Server發起一次Request(包含Header和Messge)
  • Server向Client返回一個Response(包含相應的HTML文件)

爬蟲原理

  • 模擬Client向Server發起Request請求
  • 接收Server的Response並解析、提取所需信息

📼簡單的網頁爬蟲開發
爬蟲開發中常用的第三方庫

  • 💡Requests庫
    請求網站獲取網頁數據(HTTP,HyperText Transfer Protocol).
    比Python自帶的urlib庫更加簡單、方便和人性化.
    用法:import requests
  • 💡BeautifulSoup庫
    用於解析Requests庫請求的網頁,並把網頁源代碼解析成Soup文檔,以便過濾提取數據.
    用法:from bs4 import BeautifulSoup
  • 💡Lxml庫
    用於解析網頁數據,是基於libxml2這個XML解析庫的Python封裝.
    使用C語言編寫,解析速度比BeautifulSoup更快.

🔑Requests庫

  • 🌿Requests庫安裝
>>>pip3 install reuqests

使用
瀏覽器來訪問網頁,看起來只需要輸入網址即可.但其實網頁有很多中打開方式,最常見的是GET方式和POST方式.
在瀏覽器裏面可以直接通過輸入網址訪問的頁面,就是使用了GET方式.
還有一些頁面,只能通過從另一個頁面單擊某個連接或者某個按鈕之後跳轉訪問,不能直接通過在瀏覽器輸入網址訪問,這種網頁就是使用了POST方式.

  • 🌿Requests庫–get方法
    對於使用GET方式的網頁,可以使用requests的get()方法獲取網頁的源代碼.
import requests
html = requests.get('網址').content.decode('編碼方式')
#最常見的編碼方式爲'UTF-8','GBK','GB2312','GB18030'.
  • 🌿Requests庫–post方法
    網頁的訪問方式除了GET方式外,還有POST方式,有一些網頁,使用GET和POST方式訪問同樣的網址,得到的結果是不一樣的;還有一些網頁,只能使用POST方式訪問,如果使用GET,可能會返回錯誤信息.
import reuquests
data = {'key1':'value1','key2':'value2'}
html_formdata = requests.post('網址',data=data).content.decode()
#data的內容和項數可以根據實際情況修改,如何構造該字典是設計爬蟲的任務之一.

還有一些網站,提交的內容是需要JSON格式的,因此post()方法的參數需要進行一些修改.

import reuqests
data = {'key1':'value1','key2':'value2'}
html_json = requests.post('網址',json=data).content.decode()
#這樣,requests會自動將字典轉換成JSON字符串,使用JSON提交數據
  • 🌿Requests和正則表達式應用舉例
    網站的HTML文件:
    在這裏插入圖片描述
    示例代碼:
    在這裏插入圖片描述

🔑多線程爬蟲
若爬蟲只有一個進程、一個線程,則該爬蟲被稱爲單線程爬蟲.
單線程爬蟲每次脂肪紋一個頁面,不能充分利用計算機的網絡帶寬.一個頁面最多也就幾百KB,因此,若爬蟲只爬取一個頁面,則將浪費多餘的網絡帶寬和從發起reuqest到收到response之間的時間.
如果一個爬蟲可以同時訪問多個頁面,其爬取速度將會得到顯著提高.爲了達到這個目的,需要使用多線程爬蟲.
Python的多線程都是僞多線程
Python是解釋型語言,其解釋器被一個全局解釋器鎖(Global Interpreter Lock)保護,使其在任何時候實際都只有一個線程在運行.因此,對於CPU密集型的程序而言,影響較大.
爬蟲屬於I/O密集的程序,使用多線程可以大大提高爬蟲的效率.

  • 🌿Multiprocessing庫
    Multiprocessing本身是Python的多進程庫,用來處理與多進程相關的操作.
    由於進程和線程之間不能直接共享內從和堆棧資源,而且啓動新的進程開銷也比線程大得多,因此,使用多線程來爬取比使用多進程有更多的優勢.
    Multiprocessing下面有一個dummy模塊,dummy下面有一個Pool類,用來實現線程池.這個線程池有一個map()方法,可以讓線程池裏面的所有線程都"同時"執行一個函數.
  • 🌿單線程與多線程爬取網頁比較
    在這裏插入圖片描述在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
    如果線程池設置得過大,線程切換導致的開銷可能會抵消多線程帶來的性能提升,在具體的應用場景下設置不同的大小進行測試對比,找到一個最合適的數據.

💡爬蟲常見的搜索算法

  • 深度優先搜索(DFS)
    沿着樹的深度遍歷樹的節點,直到所有節點都被訪問爲止.
  • 廣度優先搜索(BFS)
    沿着樹的寬度遍歷樹的節點,直到所有節點都被訪問爲止.
  • 選擇策略
    根據被爬取的數據來進行選擇,變化量小的優先.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章