5分鐘上手Python爬蟲:從乾飯開始,輕鬆掌握技巧

来源:https://www.cnblogs.com/guoxiaoyu/p/18063239
-Advertisement-
Play Games

本文的重點在於引導讀者如何初步掌握爬蟲技術。初步掌握爬蟲技術並不難,但是在實際操作中可能會遇到一些困難,比如一些網站不允許直接訪問,需要登錄或者進行各種人機驗證等。因此,最好先從爬取一些新聞資訊類的網站開始,因為這樣相對容易。涉及用戶支付等敏感信息的網站就不那麼容易獲取了。因此,在入門階段,建議不要... ...


很多人都聽說過爬蟲,我也不例外。曾看到別人編寫的爬蟲代碼,雖然沒有深入研究,但感覺非常強大。因此,今天我決定從零開始,花費僅5分鐘學習入門爬蟲技術,以後只需輕輕一爬就能查看所有感興趣的網站內容。廣告?不存在的,因為我看不見。爬蟲只會獲取我感興趣的信息,不需要的內容對我而言只是一堆代碼。我們不在乎網站的界面,爬取完數據後只會關註最核心的內容。

在這個過程中,技術方面實際上沒有太多複雜的內容,實際上就是一項耐心細緻的工作。因此才會有那麼多人選擇從事爬蟲兼職工作,因為雖然耗時較長,但技術要求並不是很高。今天學完之後,你就不會像我一樣認為爬蟲很困難了。或許在未來你會需要考慮如何保持會話(session)或者繞過驗證等問題,因為網站越難爬取,說明對方並不希望被爬取。實際上,這部分內容是最具挑戰性的,有機會的話我們可以在以後的學習中深入討論。

今天我們以選擇菜譜為案例,來解決我們在吃飯時所面臨的“吃什麼”的生活難題。

爬蟲解析

爬蟲的工作原理類似於模擬用戶在瀏覽網站時的操作:首先訪問官方網站,檢查是否有需要點擊的鏈接,若有,則繼續點擊查看。當直接發現所需的圖片或文字時,即可進行下載或複製。這種爬蟲的基本架構如圖所示,希望這樣的描述能幫助你更好地理解。

image

爬網頁HTML

在進行爬蟲工作時,我們通常從第一步開始,即發送一個HTTP請求以獲取返回的數據。在我們的工作中,通常會請求一個鏈接以獲取JSON格式的信息,以便進行業務處理。然而,爬蟲的工作方式略有不同,因為我們需要首先獲取網頁內容,因此這一步通常返回的是HTML頁面。在Python中,有許多請求庫可供選擇,我只舉一個例子作為參考,但你可以根據實際需求選擇其他第三方庫,只要能夠完成任務即可。

在開始爬蟲工作之前,首先需要安裝所需的第三方庫依賴。這部分很簡單,只需根據需要安裝相應的庫即可,沒有太多複雜的步驟。

讓我們不多廢話,直接看下麵的代碼示例:

from urllib.request import urlopen,Request
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0'}
req = Request("https://www.meishij.net/?from=space_block",headers=headers)
# 發出請求,獲取html
# 獲取的html內容是位元組,將其轉化為字元串
html = urlopen(req)
html_text = bytes.decode(html.read())
print(html_text)

通常情況下,我們可以獲取這個菜譜網頁的完整內容,就像我們在瀏覽器中按下F12查看的網頁源代碼一樣。

解析元素

最笨的方法是使用字元串解析,但由於Python有許多第三方庫可以解決這個問題,因此我們可以使用BeautifulSoup來解析HTML。其他更多的解析方法就不一一介紹了,我們需要用到什麼就去搜索即可,不需要經常使用的也沒必要死記硬背。

熱搜菜譜

在這裡,讓我們對熱門搜索中的菜譜進行解析和分析。

from urllib.request import urlopen,Request
from bs4 import BeautifulSoup as bf
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0'}
req = Request("https://www.meishij.net/?from=space_block",headers=headers)
# 發出請求,獲取html
# 獲取的html內容是位元組,將其轉化為字元串
html = urlopen(req)
html_text = bytes.decode(html.read())
# print(html_text)
 # 用BeautifulSoup解析html
obj = bf(html_text,'html.parser')
# print(html_text)
# 使用find_all函數獲取所有圖片的信息
index_hotlist = obj.find_all('a',class_='sancan_item')
# 分別列印每個圖片的信息
for ul in index_hotlist:
    for li in ul.find_all('strong',class_='title'):
        print(li.get_text())

主要步驟是,首先在上一步中列印出HTML頁面,然後通過肉眼觀察確定所需內容位於哪個元素下,接著利用BeautifulSoup定位該元素並提取出所需信息。在我的情況下,我提取的是文字內容,因此成功提取了所有li列表元素。

隨機乾飯

在生活中,實際上乾飯並不複雜,難點在於選擇吃什麼。因此,我們可以將所有菜譜解析並存儲在一個列表中,然後讓程式隨機選擇菜譜。這樣,就能更輕鬆地解決每頓飯吃什麼的難題了。

隨機選取一道菜時,可以使用以下示例代碼:

from urllib.request import urlopen,Request
from bs4 import BeautifulSoup as bf
for i in range(3):
    url = f"https://www.meishij.net/chufang/diy/jiangchangcaipu/?&page={i}"
    html = urlopen(url)
    # 獲取的html內容是位元組,將其轉化為字元串
    html_text = bytes.decode(html.read())
    # print(html_text)
    obj = bf(html_text,'html.parser')
    index_hotlist = obj.find_all('img')
    for p in index_hotlist:
        if p.get('alt'):
            print(p.get('alt'))

這裡我們在這個網站上找到了新的鏈接地址,我已經獲取了前三頁的數據,併進行了隨機選擇,你可以選擇全部獲取。

菜譜教程

其實上一步已經完成了,接下來只需下單外賣了。外賣種類繁多,但對於像我這樣的顧家奶爸來說並不合適,因此我必須自己動手做飯。這時候教程就顯得尤為重要了。

我們現在繼續深入解析教程內容:

from urllib.request import urlopen,Request
import urllib,string
from bs4 import BeautifulSoup as bf

url = f"https://so.meishij.net/index.php?q=紅燒排骨"
url = urllib.parse.quote(url, safe=string.printable)
html = urlopen(url)
# 獲取的html內容是位元組,將其轉化為字元串
html_text = bytes.decode(html.read())
obj = bf(html_text,'html.parser')
index_hotlist = obj.find_all('a',class_='img')
# 分別列印每個圖片的信息
url = index_hotlist[0].get('href')
html = urlopen(url)
html_text = bytes.decode(html.read())
obj = bf(html_text,'html.parser')
index_hotlist = obj.find_all('div',class_='step_content')
for div in index_hotlist:
    for p in div.find_all('p'):
        print(p.get_text())

包裝一下

上面提到的方法已經滿足了我們的需求,但是重覆手動執行每個步驟並不是一個高效的方式。因此,我將這些步驟封裝成一個簡單的應用程式。這個應用程式使用控制台作為用戶界面,不需要依賴任何第三方庫。讓我們一起來看一下這個應用程式吧:

# 導入urllib庫的urlopen函數
from urllib.request import urlopen,Request
import urllib,string
# 導入BeautifulSoup
from bs4 import BeautifulSoup as bf
from random import choice,sample
from colorama import init
from os import system
from termcolor import colored
from readchar import  readkey


FGS = ['green', 'yellow', 'blue', 'cyan', 'magenta', 'red']
print(colored('搜索食譜中.....',choice(FGS)))
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0'}
req = Request("https://www.meishij.net/?from=space_block",headers=headers)
# 發出請求,獲取html
# 獲取的html內容是位元組,將其轉化為字元串
html = urlopen(req)
html_text = bytes.decode(html.read())
hot_list = []
all_food = []
food_page = 3


# '\n'.join(pos(y, OFFSET[1]) + ' '.join(color(i) for i in l)
def draw_menu(menu_list):
    clear()
    for idx,i in enumerate(menu_list):
        print(colored(f'{idx}:{i}',choice(FGS)))
    print(colored('8:隨機選擇',choice(FGS)))


def draw_word(word_list):
    clear()
    for i in word_list:
        print(colored(i,choice(FGS)))

def clear():
    system("CLS")

def hot_list_func() :
    global html_text
    # 用BeautifulSoup解析html
    obj = bf(html_text,'html.parser')
    # print(html_text)
    # 使用find_all函數獲取所有圖片的信息
    index_hotlist = obj.find_all('a',class_='sancan_item')
    # 分別列印每個圖片的信息
    for ul in index_hotlist:
        for li in ul.find_all('strong',class_='title'):
            hot_list.append(li.get_text())
            # print(li.get_text())

def search_food_detail(food) :
    print('正在搜索詳細教程,請稍等30秒左右!')
    url = f"https://so.meishij.net/index.php?q={food}"
    # print(url)
    url = urllib.parse.quote(url, safe=string.printable)
    html = urlopen(url)
    # 獲取的html內容是位元組,將其轉化為字元串
    html_text = bytes.decode(html.read())
    obj = bf(html_text,'html.parser')
    index_hotlist = obj.find_all('a',class_='img')
    # 分別列印每個圖片的信息
    url = index_hotlist[0].get('href')
    # print(url)
    html = urlopen(url)
    html_text = bytes.decode(html.read())
    # print(html_text)
    obj = bf(html_text,'html.parser')
    random_color = choice(FGS)
    print(colored(f"{food}做法:",random_color))
    index_hotlist = obj.find_all('div',class_='step_content')
    # print(index_hotlist)
    random_color = choice(FGS)
    for div in index_hotlist:
        for p in div.find_all('p'):
            print(colored(p.get_text(),random_color))



def get_random_food():
    global food_page
    if not all_food :
        for i in range(food_page):
            url = f"https://www.meishij.net/chufang/diy/jiangchangcaipu/?&page={i}"
            html = urlopen(url)
            # 獲取的html內容是位元組,將其轉化為字元串
            html_text = bytes.decode(html.read())
            # print(html_text)
            obj = bf(html_text,'html.parser')
            index_hotlist = obj.find_all('img')
            for p in index_hotlist:
                if p.get('alt'):
                    all_food.append(p.get('alt'))
    my_food = choice(all_food)
    print(colored(f'隨機選擇,今天吃:{my_food}',choice(FGS)))
    return my_food


init() ## 命令行輸出彩色文字
hot_list_func()
print(colored('已搜索完畢!',choice(FGS)))
my_array = list(range(0, 9))
my_key = ['q','c','d','m']
my_key.extend(my_array)
print(colored('m:代表今日菜譜',choice(FGS)))
print(colored('c:代表清空控制台',choice(FGS)))
print(colored('d:代表菜譜教程',choice(FGS)))
print(colored('q:退出菜譜',choice(FGS)))
print(colored('0~8:選擇菜譜中的菜',choice(FGS)))
while True:
    while True:
        move = readkey()
        if move in my_key or (move.isdigit() and int(move) <= len(random_food)):
            break
    if move == 'q': ## 鍵盤‘Q’是退出
        break
    if move == 'c': ## 鍵盤‘C’是清空控制台
        clear()
    if move == 'm':
        random_food = sample(hot_list,8)
        draw_menu(random_food)
    if move.isdigit() and int(move) <= len(random_food):
        if int(move) == 8:
            my_food = get_random_food()
        else:
            my_food = random_food[int(move)]
        print(my_food)
    if move == 'd' and my_food : ## 鍵盤‘D’是查看教程
        search_food_detail(my_food)
        my_food = ''

完成一個簡單的小爬蟲其實並不複雜,如果不考慮額外的封裝步驟,僅需5分鐘即可完成,這已經足夠快速讓你入門爬蟲技術。開始爬取某個網站的數據實際上是一項細緻的工作。只需在網上搜索相關技術信息,找到適合的方法即可,如果有效就繼續使用,不行就試試其他方法。

總結

本文的重點在於引導讀者如何初步掌握爬蟲技術。初步掌握爬蟲技術並不難,但是在實際操作中可能會遇到一些困難,比如一些網站不允許直接訪問,需要登錄或者進行各種人機驗證等。因此,最好先從爬取一些新聞資訊類的網站開始,因為這樣相對容易。涉及用戶支付等敏感信息的網站就不那麼容易獲取了。因此,在入門階段,建議不要糾結於選擇一個複雜的網站,先嘗試入門即可。一旦理解了基本原理,遇到問題時就可以考慮添加組件或者使用第三方庫來解決。

最終,我真誠地希望本文對你有所幫助。如果你覺得內容有趣或有用,不妨動動小手,點個關註支持一下,嘻嘻。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 Vue3 作為一款現代的 JavaScript 框架,引入了許多新的特性和改進,其中包括 shallowRef 和 shallowReactive。這兩個功能在Vue 3中提供了更加靈活和高效的狀態管理選項,尤其適用於大型和複雜的應用程式。 Vue 3 的響應式系統 Vue3 引入了新的響應式 ...
  • 作為2024年最受歡迎的Vue.js組件庫之一,ViewDesign憑藉其現代化設計理念、強大功能和可定製性脫穎而出。這款開源UI組件庫提供了豐富的基礎組件、數據展示組件和交互反饋組件,涵蓋了大部分Web開發場景。同時,ViewDesign還具備良好的可訪問性、完善的文檔、活躍的社區支持,並對SEO... ...
  • 前言 我們每天寫vue代碼時都在用defineProps,但是你有沒有思考過下麵這些問題。為什麼defineProps不需要import導入?為什麼不能在非setup頂層使用defineProps?defineProps是如何將聲明的 props 自動暴露給模板? 舉幾個例子 我們來看幾個例子,分別 ...
  • “將抽象和實現解耦,讓它們可以獨立變化。” 橋接模式通過將一個類的抽象部分與實現部分分離開來,使它們可以獨立地進行擴展和修改。 ...
  • 我們都知道,我們寫的Java程式需要先經過編譯,生成了.class文件(位元組碼文件)。然而,電腦並不能直接解釋.class文件裡面的內容,這時候就需要一個能載入、解釋.class文件並且能按.class文件里的內容進行處理的一個東西--JVM。 JVM,就是Java虛擬機。它是一種規範,有針對不同 ...
  • 前言 池化思想在實際開發中有很多應用,指的是針對一些創建成本高,創建頻繁的對象,用完不棄,將其緩存在對象池子里,下次使用時優先從池子里獲取,如果獲取到則可以直接使用,以此降低創建對象的開銷。 我們最熟悉的資料庫連接池就是一種池化思想的應用,資料庫操作是非常頻繁的,資料庫連接的創建、銷毀開銷很大,每次 ...
  • 本文介紹基於R語言中的raster包,讀取單張或批量讀取多張柵格圖像,並對柵格圖像數據加以基本處理的方法。 1 包的安裝與導入 首先,我們需要配置好對應的R語言包;前面也提到,我們這裡選擇基於raster包來實現柵格圖像數據的讀取與處理工作。首先,如果有需要的話,我們可以先到raster包在R語言的 ...
  • Java的序列化和反序列化機制 問題導入: 在閱讀ArrayList源碼的時候,註意到,其內部的成員變數動態數組elementData被Java中的關鍵字transient修飾 transient關鍵字意味著Java在序列化時會跳過該欄位(不序列化該欄位) 而Java在預設情況下會序列化類(實現了J ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...