Python網絡爬蟲設計(一)

目錄

一、網絡爬蟲

1、基本的爬蟲

2、獲取URL

3、查找網頁源碼關鍵字

4、代碼實現

二、requests庫

1、requests的優勢和劣勢

2、獲取網頁的其他庫

(1)selenium庫

(2)pyppeteer庫

三、pyppeteer庫

1、pyppeteer庫的來歷

2、pyppeteer庫的工作原理

3、pyppeteer相關環境安裝

四、協程

1、概念

2、注意事項

五、用pyppeteer獲取網頁


一、網絡爬蟲

網絡爬蟲,簡稱爬蟲,它可以用來在網絡上搜集一些數據(比如在搜索引擎上),也可以模擬瀏覽器的快速操作(比如我們可以用爬蟲來實現搶課)

1、基本的爬蟲

一個基本的爬蟲寫法如下:

(1)首先手動找出我們想要獲取的網址(URL)

(2)在瀏覽器中搜索這個網址,查看網頁的源代碼,在源代碼中找出我們想要的內容的字符串的模式(比如我們想要查找一些圖片,在網頁源碼中,圖片都有一些固定的關鍵字,我們通過抓取這些關鍵字,就可以獲取圖片)

(3)在程序中我們用URL得到對應的網頁

(4)再根據程序中的正則表達式或者BeautifulSoup庫來查找關鍵字,得到對應的內容并保存

2、獲取URL

我們先在瀏覽器上搜索一個關鍵字:

我們觀察這個網頁對應的URL:

可以發現,在這個URL中,有一部分是“q = 樂高”,我們就可以猜想,是不是只要把q后面的文字改成我們想要搜索的關鍵字,就可以到達對應的頁面?

我們直接在URL上把q后面的關鍵詞改成“貓”,然后按下回車:

發現果然跳轉到了貓的搜索頁面!

這就意味著我們可以在代碼中,通過修改q后面的數據,來到達對應的目標頁面

3、查找網頁源碼關鍵字

當我們到達了目標頁面,我們想要抓取幾個圖片,就需要通過頁面源碼的關鍵字:

我們在這個“貓”的搜索頁面隨便找一個圖片,右鍵,選擇“復制圖像連接

我們會發現th(略縮圖),id等具有標志性的東西,這些都指明了這可能是一個圖片

當然,如果看不出來我們可以多復制幾個圖片的鏈接,來尋找共同點:

不難發現,很多圖片都有/th/id/OIP-這一部分,這可能就是圖片鏈接的共同特點:

右擊網頁空白處,點擊“查看網頁源碼”,按ctrl + F ,?

我們把這串字符復制進去:

按下回車,就能看見在源碼的地方,很多處都被標記了這個關鍵字符串,我們就可以根據這個來爬取想要的圖片;

4、代碼實現

我們來找一個專門練習爬蟲的頁面來爬取幾個圖片(很多網頁有反爬技術,最最基礎的爬蟲代碼難以成功)

import re   #用來使用正則表達式
import requests     #用于HTTP請求
import os       #操作文件目錄等def getHTML(url):       #用于獲取目標頁面的HTMLfakeHeader = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 Edg/81.0.416.77'}#定義了一個字典,用來模擬瀏覽器的請求頭,欺騙瀏覽器try:r = requests.get(url, headers=fakeHeader)#發送一個GET請求到指定的url,并使用我們的假頭部r.encoding = r.apparent_encoding#設置編碼格式return r.text       #返回網頁的HTML內容except Exception as e:print(e)return ""#------------------------以上內容可以固定的直接使用------------------------def getPicturePro(n):base_url = "https://spiderbuf.cn"   #基礎的路徑url = "https://spiderbuf.cn/web-scraping-practice/scraping-images-from-web"     #目標網頁的URL(就是包含圖片的)html = getHTML(url)     #調用函數,獲取目標頁面的HTML內容pt = r'<img[^>]+src="([^"]+)"'      #正則表達式,用于找到HTML里面的img標簽的src屬性的值i = 0   #圖片個數(方便命名)for x in re.findall(pt, html):      #使用正則表達式pt找到html中所有符合的圖片路徑if x.startswith("/"):x = base_url + x     # 檢查是否是相對路徑,并轉換為完整路徑if not (x.lower().endswith(".jpg") or x.lower().endswith(".png")):      #拼接好后,如果不是jpg或png的圖片,跳過不要continuetry:print(x)    #輸出經過層層篩選的圖片路徑r = requests.get(x, stream=True)    #發送GET請求,獲取圖片,并以流式下載,防止一次性到內存pos = x.rfind(".")      #找到文件擴展名的起始位置if not os.path.exists(r"D:\學習\Python\temp"):os.makedirs(r"D:\學習\Python\temp")       #若不存在該目錄就創建該目錄f = open(r"D:\學習\Python\temp\{0}{1}{2}".format("image", i, x[pos:]), "wb")#打開該目錄,并且以image和i來命名f.write(r.content)      #把圖片寫入文件f.close()except Exception as e:print(f"Error downloading {x}: {e}")    #若報錯就返回錯誤信息i += 1getPicturePro(1)    #傳入參數,表示開始執行

輸出:

我們再看看文件夾:

二、requests庫

在上面的代碼中,我們可以看見,requests庫的作用是用來發送HTTP請求的,可以完成大量的網絡層面的任務

1、requests的優勢和劣勢

①優勢:速度快,且安裝簡單,我們只需要使用pip命令就能安裝requests庫,很容易把自己的代碼分享給別人使用,即共享性強

②劣勢:requests庫很容易被反爬蟲手段屏蔽,可能一個有一點反爬蟲手段的網頁就能把這個代碼屏蔽掉(比如我們用上面的代碼去爬百度的搜索圖片,是不能成功的,會被反爬),而且不能獲取JavaScript的生成的動態網頁

2、獲取網頁的其他庫

面對剛剛上面requests的缺陷,我們在Python中,也提供了很多庫來彌補它的不足

(1)selenium庫

selenium庫雖然比requests庫更強一些,但是它的速度很慢,而且已經被許多網站反爬,可能還是無法成功

(2)pyppeteer庫

速度很快,而且目前還沒有被很多網站反爬,是一個比較好的選擇

三、pyppeteer庫

1、pyppeteer庫的來歷

pyppeteer是puppeteer的Python版本,而puppeteer是谷歌公司推出的可以控制Chrome瀏覽器的一套編程工具

2、pyppeteer庫的工作原理

①啟動一個瀏覽器Chromium,用瀏覽器裝入網頁,并且瀏覽器可以用無頭模式(隱藏模式)或者顯式模式啟動(就是在執行爬取操作的時候用戶能否看見瀏覽器操作頁面的具體過程)

②從瀏覽器中可以獲得網頁的源代碼,若網頁就JavaScript程序,獲得到的就是JavaScript被瀏覽器執行后的網頁源碼

③pyppeteer可以向瀏覽器發送命令,模擬用戶在瀏覽器上的鍵盤,鼠標等操作

④selenium和pyppeteer的工作原理相同

3、pyppeteer相關環境安裝

我們先在cmd窗口用pip命令下載pyppeteer

pip install pyppeteer

(要求Python版本在3.6及3.6以上)

當然,我們上面提到,我們需要啟動一個特殊的瀏覽器Chromium,所以我們需要下載它:

在安裝之前,我們需要確定我們安裝了Node.js

安裝官網:Node.js — 在任何地方運行 JavaScript

進入之后,我們點擊下載LTS版本的(更加穩定)

在安裝完成后,我們可以在cmd窗口檢查一下是否安裝完成:

node -v
npm -v

若安裝成功,應該會類似如下:

安裝完成之后,我們輸入以下命令來安裝:

npx @puppeteer/browsers install chrome@stable

在上圖中的第六行,顯示了安裝的位置,我們定位到具體的目錄,找到exe文件,可以創建一個快捷方式到桌面:

四、協程

1、概念

協程就是在代碼中,前面加了async的函數

async def scy() :return 0

在調用協程時,必須在前面添加await

    await scy()

2、注意事項

(1)協程只能在協程里面調用,也就是說await關鍵字只能出現在協程里面,出現在外面就會報錯!

(2)協程是一種特殊的函數,多個協程可以并行

(3)pyppeteer中的所有函數都是協程

五、用pyppeteer獲取網頁

代碼如下:

import asyncio      #是Python的異步 I/O 框架,用于編寫單線程并發代碼
import pyppeteer as pyp#通過輸入的url,獲取指定的HTML內容
async def getHTML(url) :    #構造一個異步函數browser = await pyp.launch(headless = False , executablePath=r'C:\Users\23639\AppData\Local\Google\Chrome\Application\chrome.exe')    #啟動一個瀏覽器,headless就是無頭模式,設置成False就會顯示瀏覽器,反之就不會#executablePath指明了Chrom瀏覽器的可執行路徑page = await browser.newPage()      #等打開了瀏覽器,再在瀏覽器中獲取我們想要的頁面await page.setUserAgent('Mozilla/5.0 (Windows NT 6.1; Win64;  x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 safari/537.36')#模擬瀏覽器的請求頭await page.evaluateOnNewDocument(' () => Object. defineProperties (navigator, { webdriver: {get:()=> false } })}')#頁面在加載的時候會被執行里面JavaScript代碼,目的是防止瀏覽器檢測自動化工具await page.goto(url)    #導航到指定的URLtext = await page.content()     #獲取頁面的HTML代碼await browser.close()   #關閉瀏覽器return text     #返回text內容def getHTMLpro(url) :return asyncio.run(getHTML(url))   #返回頁面的HTML內容HTML_result = getHTMLpro("https://cn.bing.com")   #調用函數
print(HTML_result)

執行結果:

這就是把我們輸入的那個URL的網頁給爬取了下來,如果把這個復制到一個文本文檔中,把后綴改成.html,就是我們想要的那個頁面

以上就是Python網絡爬蟲設計(一)的全部內容:)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/77599.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77599.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/77599.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

BR_頻譜20dB 帶寬(RF/TRM/CA/BV-05-C [TX Output Spectrum – 20 dB Bandwidth])

目錄 一、規范要求 1、協議章節 2、測試目的 二、測試方法 1、樣機初值條件&#xff1a; 2、測試步驟: 方法一&#xff1a;頻譜儀 方法二&#xff1a;綜測儀CMW500 3、預期結果 一、規范要求 1、協議章節 4.5.5 RF/TRM/CA/BV-05-C [TX Output Spectrum – 20 dB Ba…

【橘子大模型】初探rag知識庫的構建

一、簡介 我們在實現了一系列功能之后&#xff0c;終于來到了rag的部分&#xff0c;下面我們將基于langchain來實現一個rag檢索。 關于rag方面的知識&#xff0c;可以查看這兩篇文章&#xff1a; 大模型應用之RAG詳解 什么是 RAG&#xff08;檢索增強生成&#xff09; 或者是去…

CentOS7執行yum命令報錯 Could not retrieve mirrorlist http://mirrorlist.centos.org

CentOS7執行yum命令報錯 引更新yum源備份原有源創建新的源文件清理并重建緩存 引 CentOS 7 系統無法連接到 CentOS 的官方鏡像站點。這通常是由于網絡問題或 CentOS 7 已停止維護導致的&#xff08;2024年6月30日后 CentOS 7 已進入 EOL&#xff09; 報錯明細&#xff1a; 已…

VSCode安裝與環境配置(Mac環境)

20250419 - 概述 大概是非常久之前了&#xff0c;裝了VSCode&#xff0c;估計都得21的時候了&#xff0c;電腦上也沒更新過。當時安裝也直接裝上就完事了。這次把版本更新一下&#xff0c;同時記錄一下這個安裝過程。 安裝 mac下安裝非常簡單&#xff0c;直接從官網下載&am…

QML動畫--ParallelAnimation和SequentialAnimation

一、ParallelAnimation ParallelAnimation 是 QML 中用于并行執行多個動畫的容器動畫類型&#xff0c;可以同時運行多個子動畫。 基本用法 qml import QtQuick 2.15Rectangle {id: rectwidth: 100; height: 100color: "red"x: 0; y: 0; opacity: 1.0ParallelAnim…

NLP高頻面試題(四十三)——什么是人類偏好對齊中的「對齊稅」(Alignment Tax)?如何緩解?

一、什么是「對齊稅」(Alignment Tax)? 所謂「對齊稅」(Alignment Tax),指的是在使人工智能系統符合人類偏好的過程中,所不可避免付出的性能損失或代價。換句話說,當我們迫使AI遵循人類價值觀和規范時,AI系統往往無法達到其最大理論性能。這種性能上的妥協和折衷,就…

速查手冊:TA-Lib 超過150種量化技術指標計算全解 - 1. Overlap Studies(重疊指標)

速查手冊&#xff1a;TA-Lib 超過150種量化技術指標計算全解 - 1. Overlap Studies&#xff08;重疊指標&#xff09; TA-Lib&#xff08;Technical Analysis Library&#xff09;是廣泛使用的金融技術分析庫&#xff0c;實現了超過150種技術指標計算函數&#xff0c;適用于股票…

重構未來智能:Anthropic 解碼Agent設計哲學三重奏

第一章 智能體進化論&#xff1a;從工具到自主體的認知躍遷 1.1 LLM應用范式演進圖譜 階段技術形態應用特征代表場景初級階段單功能模型硬編碼規則執行文本摘要/分類進階階段工作流編排多模型協同調度跨語言翻譯流水線高級階段自主智能體動態決策交互編程調試/客服對話 1.1.…

Git 中修改某個特定的commit提交內容

在 Git 中修改某個特定的提交&#xff08;commit&#xff09;通常需要使用 交互式變基&#xff08;Interactive Rebase&#xff09; 或 修改提交&#xff08;Commit Amend&#xff09;。以下是不同場景下的具體操作步驟&#xff1a; 一、修改最近的提交&#xff08;最新提交&am…

ZLMediaKit流媒體服務器

ZLMediaKit 簡介 ZLMediaKit 是一個基于 C11 開發的高性能流媒體服務器框架&#xff0c;支持 RTSP、RTMP、HLS、HTTP-FLV、WebSocket-FLV、HTTP-TS、WebSocket-TS、HTTP-fMP4、WebSocket-fMP4 等多種流媒體協議。 主要特性 多協議支持&#xff1a; 支持 RTSP/RTMP/HLS/HTTP-F…

數字電子技術基礎(五十)——硬件描述語言簡介

目錄 1 硬件描述語言簡介 1.1 硬件描述語言簡介 1.2 硬件編程語言的發展歷史 1.3 兩種硬件描述的比較 1.4 硬件描述語言的應用場景 1.5 基本程序結構 1.5.1 基本程序結構 1.5.2 基本語句和描述方法 1.5.3 仿真 1 硬件描述語言簡介 1.1 硬件描述語言簡介 硬件描述語…

SQL系列:常用函數

1、【MySQL】合并字段函數&#xff08;列轉行&#xff09; 它可以將兩個字段中的數據合并到一個字段中。 1&#xff09;CONCAT函數 CONCAT函數可以將多個字段中的數據合并到一個字段中。它的語法格式如下&#xff1a; SELECT CONCAT(字段1,字段2,...字段N) FROM 表名;SELEC…

多線程和線程同步

多線程在項目開發中使用頻率高,使用多線程能夠提高程序的并發性 提高程序的并發性:1.多線程,對系統資源的消耗更小一些 2.多進程 系統的cpu資源有線,cpu時間片被分好后,由系統進行調度,每個線程在執行的時候都需要搶這個cpu的時間片。如果搶到了,就執行,如果沒搶到,…

時序數據預測:TDengine 與機器學習框架的結合(一)

一、引言 在當今數字化時代&#xff0c;時序數據如潮水般涌來&#xff0c;廣泛存在于物聯網、工業監控、金融交易、氣象監測等眾多領域。這些按時間順序記錄的數據蘊含著豐富的信息&#xff0c;對其進行準確預測&#xff0c;能夠為企業和組織的決策提供有力支持&#xff0c;帶…

elementUI中MessageBox.confirm()默認不聚焦問題處理

在項目中使用elementUI的MessageBox.confirm()出現了默認不聚焦的問題&#xff0c;默認確認按鈕是淺色的&#xff0c;需要點擊一下才會變成正常。面對這種問題&#xff0c;創建新組件&#xff0c;實現聚焦。替換默認的MessageBox.confirm() 解決 創建components/MessageBoxCo…

yarn的定義

YARN 即 Yet Another Resource Negotiator&#xff0c;它是 Apache Hadoop 2.x 及后續版本中的集群資源管理系統&#xff0c;也是 Hadoop 生態系統的核心組件之一。 YARN 的誕生是為了解決 Hadoop 1.x 中 MapReduce 框架將資源管理和作業調度任務耦合在一起所帶來的可擴展性差等…

http、https、TLS、證書原理理解,對稱加密到非對稱加密問題,以及對應的大致流程

http 超文本傳輸協議 存在問題&#xff1a; 安全性、隱私性、數據完整性 易被中間人&#xff08;黑客之類的&#xff09;對數據進行劫持、篡改、隱私泄露 引出了 https &#xff08;source&#xff09; http 在網絡模型中的應用層 Application > transport > inter…

深度補全網絡:如CSPN++填補稀疏點云的深度信息

深度補全網絡&#xff1a;CSPN填補稀疏點云的深度信息 深度補全(Depth Completion)是計算機視覺中的一個重要任務&#xff0c;旨在從稀疏的深度測量中恢復密集的深度圖。CSPN(Convolutional Spatial Propagation Network)是這一領域的前沿方法之一。 CSPN概述 CSPN是對原始CSPN…

QT網絡拓撲圖繪制實驗

前言 在網絡通訊中&#xff0c;我qt常用的是TCP或者UDP協議&#xff0c;就比方說TCP吧&#xff0c;一臺服務器有時可能會和多臺客戶端相連接&#xff0c;我之前都是處理單鏈接情況&#xff0c;最近研究圖結構的時候&#xff0c;突然就想到了這個問題。那么如何解決這個問題呢&…

DNS主從同步實驗

dns域名解析原理 實驗步驟1、主dns要完成dns解析&#xff1a;192.168.21.128 [rootlocalhost ~]# yum install bind -y [rootlocalhost ~]# systemctl start named [rootlocalhost ~]# vim /etc/named.conf options { listen-on port 53 { any; }; direct…