国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

五分鐘上手Python爬蟲:從干飯開始,輕松掌握技巧

開發(fā) 前端
爬蟲的工作原理類似于模擬用戶在瀏覽網(wǎng)站時的操作:首先訪問官方網(wǎng)站,檢查是否有需要點擊的鏈接,若有,則繼續(xù)點擊查看。當直接發(fā)現(xiàn)所需的圖片或文字時,即可進行下載或復制。這種爬蟲的基本架構(gòu)如圖所示,希望這樣的描述能幫助你更好地理解。
很多人都聽說過爬蟲,我也不例外。曾看到別人編寫的爬蟲代碼,雖然沒有深入研究,但感覺非常強大。因此,今天我決定從零開始,花費僅5分鐘學習入門爬蟲技術(shù),以后只需輕輕一爬就能查看所有感興趣的網(wǎng)站內(nèi)容。廣告?不存在的,因為我看不見。爬蟲只會獲取我感興趣的信息,不需要的內(nèi)容對我而言只是一堆代碼。我們不在乎網(wǎng)站的界面,爬取完數(shù)據(jù)后只會關(guān)注最核心的內(nèi)容。

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

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

爬蟲解析

爬蟲的工作原理類似于模擬用戶在瀏覽網(wǎng)站時的操作:首先訪問官方網(wǎng)站,檢查是否有需要點擊的鏈接,若有,則繼續(xù)點擊查看。當直接發(fā)現(xiàn)所需的圖片或文字時,即可進行下載或復制。這種爬蟲的基本架構(gòu)如圖所示,希望這樣的描述能幫助你更好地理解。

圖片image

爬網(wǎng)頁HTML

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

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

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

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)
# 發(fā)出請求,獲取html
# 獲取的html內(nèi)容是字節(jié),將其轉(zhuǎn)化為字符串
html = urlopen(req)
html_text = bytes.decode(html.read())
print(html_text)

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

解析元素

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

熱搜菜譜

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

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)
# 發(fā)出請求,獲取html
# 獲取的html內(nèi)容是字節(jié),將其轉(zhuǎn)化為字符串
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函數(shù)獲取所有圖片的信息
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頁面,然后通過肉眼觀察確定所需內(nèi)容位于哪個元素下,接著利用BeautifulSoup定位該元素并提取出所需信息。在我的情況下,我提取的是文字內(nèi)容,因此成功提取了所有l(wèi)i列表元素。

隨機干飯

在生活中,實際上干飯并不復雜,難點在于選擇吃什么。因此,我們可以將所有菜譜解析并存儲在一個列表中,然后讓程序隨機選擇菜譜。這樣,就能更輕松地解決每頓飯吃什么的難題了。

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

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內(nèi)容是字節(jié),將其轉(zhuǎn)化為字符串
    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'))

這里我們在這個網(wǎng)站上找到了新的鏈接地址,我已經(jīng)獲取了前三頁的數(shù)據(jù),并進行了隨機選擇,你可以選擇全部獲取。

菜譜教程

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

我們現(xiàn)在繼續(xù)深入解析教程內(nèi)容:

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內(nèi)容是字節(jié),將其轉(zhuǎn)化為字符串
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())

包裝一下

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

# 導入urllib庫的urlopen函數(shù)
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)
# 發(fā)出請求,獲取html
# 獲取的html內(nèi)容是字節(jié),將其轉(zhuǎn)化為字符串
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函數(shù)獲取所有圖片的信息
    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內(nèi)容是字節(jié),將其轉(zhuǎn)化為字符串
    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內(nèi)容是字節(jié),將其轉(zhuǎn)化為字符串
            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分鐘即可完成,這已經(jīng)足夠快速讓你入門爬蟲技術(shù)。開始爬取某個網(wǎng)站的數(shù)據(jù)實際上是一項細致的工作。只需在網(wǎng)上搜索相關(guān)技術(shù)信息,找到適合的方法即可,如果有效就繼續(xù)使用,不行就試試其他方法。

總結(jié)

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


責任編輯:武曉燕 來源: 靈墨AI探索室
相關(guān)推薦

2009-11-17 14:50:50

Oracle調(diào)優(yōu)

2021-06-07 09:51:22

原型模式序列化

2017-04-25 12:07:51

AndroidWebViewjs

2024-09-18 23:50:24

Python內(nèi)存生成器

2025-03-12 10:05:01

運維Vim編輯

2020-12-07 11:23:32

Scrapy爬蟲Python

2025-01-24 08:38:47

2025-05-22 10:00:00

DockerRedis容器

2019-12-23 16:42:44

JavaScript前端開發(fā)

2021-01-11 09:33:37

Maven數(shù)目項目

2009-11-05 10:55:22

Visual Stud

2023-12-06 08:48:36

Kubernetes組件

2017-01-10 09:07:53

tcpdumpGET請求

2022-02-23 20:38:32

云原生集群Postgres

2023-09-29 18:36:57

IDEA編程IDE

2019-05-08 14:02:52

MySQL索引查詢優(yōu)化數(shù)據(jù)庫

2017-09-27 11:00:50

LinuxBash使用技巧

2018-01-08 16:19:04

微信程序輪播圖

2021-01-13 09:23:23

優(yōu)先隊列React二叉堆

2022-08-04 13:27:35

Pythonopenpyxl
點贊
收藏

51CTO技術(shù)棧公眾號

中文字幕有码在线视频| 超碰97免费观看| 毛片免费在线| 欧美极品xxx| 色噜噜一区二区| 亚洲国产精品成人| 久久久久久久网站| 亚洲精品国产嫩草在线观看| 在线不卡中文字幕播放| 三上悠亚在线观看| 国产精品国产馆在线真实露脸| 黑人巨茎大战欧美白妇| 国产女优一区| 国产欧美韩日| 国产在线成人| 亚洲自拍在线观看| 成人在线免费观看91| 久久免费视频这里只有精品| 99久久综合国产精品二区| 欧美精品一区二区精品网| 91caoporm在线视频| 91久久精品网| 久久天堂电影| 色悠悠亚洲一区二区| 美女网站在线观看| 亚洲一区二区成人在线观看| 国产免播放器视频| 亚洲一区二区三区四区在线| 久草电影在线| 无码av免费一区二区三区试看 | 色8久久人人97超碰香蕉987| 在线播放国产区| 亚洲自拍偷拍图区| 水中色av综合| 欧美日韩黄视频| a视频在线观看| 日韩av综合网| 成人深夜福利| 久久久久久亚洲精品中文字幕| 国产精品任我爽爆在线播放| 欧洲午夜精品久久久| 久久社区一区| 国产呦系列欧美呦日韩呦| 亚洲在线观看| 亚洲欧美久久234| 国产资源在线一区| 欧美三级在线观看视频| 中文一区在线播放| 成r视频免费观看在线播放| 色久综合一二码| 老色鬼在线视频| 九九久久久久99精品| 日本激情一区| 午夜精品一区二区在线观看| 91网页版在线| 一区二区三区视频国产日韩| 亚洲成人精品视频| 成人三级毛片| 国产成人免费电影| 成人免费视频caoporn| 男人捅女人免费视频| 在线亚洲一区观看| 亚洲精品555| 成人亚洲激情网| 国产乱子伦一区二区三区国色天香| 奇米影音第四色| 欧美性色aⅴ视频一区日韩精品| 乱插在线www| 欧美成人久久久| 加勒比中文字幕精品| 国产精品一区二区性色av| 玖玖视频精品| 国产精品无码人妻一区二区在线| 亚洲午夜日本在线观看| 午夜在线视频| 中文字幕在线观看亚洲| 日韩美女精品| 久久久久se| 91在线精品一区二区| 国产精品网站免费| 亚洲欧美日韩国产一区二区三区| 男人天堂综合| 一个人www欧美| 国内精品久久久久久久久电影网| 国产chinese精品一区二区| 久久精品亚洲一区二区| 成人小视频在线看| 疯狂欧美牲乱大交777| 动漫一区二区| 久久久在线视频| 国产欧美短视频| 国产精品333| 欧美视频在线观看一区| 成人爽a毛片免费啪啪| 欧美亚洲伦理www| 国产精品尤物| **三级三级97片毛片| 欧美日韩国产欧美日美国产精品| 婷婷激情成人| 国产日韩欧美二区| 国产精品久久久久天堂| 日本精品在线| 8090成年在线看片午夜| 日韩高清不卡一区二区三区| 四虎影院在线域名免费观看| 久久深夜福利免费观看| 精品一区二区三区免费视频| 日本特黄a级高清免费大片| 最新国产精品亚洲| 国产精品www.| 色视频在线播放| 九九热精品视频国产| 国产91高潮流白浆在线麻豆| 成人高清在线| 成人福利视频在线观看| 91一区一区三区| 日本成人网址| 91在线播放国产| 亚洲精品视频免费看| 欧美日韩激情电影| 国产mv免费观看入口亚洲| 99精品国产视频| 黄色大片在线播放| 97久久夜色精品国产九色| 国产视频在线观看一区二区三区| 欧美人体一区二区三区| 国产精品亚洲综合| 色香蕉成人二区免费| 乱亲女h秽乱长久久久| 日本久久久久久久久久久久| 国产一区二区三区毛片| 国产精品日韩精品欧美精品| 九色在线观看| 日韩av毛片网| 亚洲一区中文日韩| 欧美大胆视频| av777777| 国外成人在线播放| 国产69精品一区二区亚洲孕妇| 91麻豆免费在线视频| 日产国产精品精品a∨| 欧美日韩中文字幕一区| 国产精品v一区二区三区| 日本中文视频| 91久久中文字幕| 亚洲高清免费观看高清完整版在线观看 | 一区二区精品在线| 一道本成人在线| 91精品国产福利在线观看麻豆| 成人福利视频在| 欧美成人精品在线观看| 久久久国产综合精品女国产盗摄| 亚洲伦乱视频| 国产一线二线三线在线观看| 久久精品成人欧美大片古装| 国产精品午夜免费| 日韩免费成人| 日本h片在线看| 欧美影视一区在线| 日韩高清在线观看| 99久久精品无码一区二区毛片 | 992tv免费直播在线观看| 精品亚洲一区二区三区四区五区高| 日韩欧美国产视频| 久久精品天堂| 草草视频在线观看| 99色精品视频| 国产精品视频一区二区高潮| 午夜视频一区二区| 日韩电影网1区2区| а_天堂中文在线| 亚洲熟妇av一区二区三区漫画| 欧美成人在线网站| 狠狠色香婷婷久久亚洲精品| 欧美日韩四区| 国产成人在线视频免费观看| 国产精品日韩高清| 在线综合视频播放| 精品一区二区三区久久| 成人自拍av| 男女视频一区二区三区| 国产一区二区丝袜| 欧美精品v日韩精品v韩国精品v| 久久九九电影| 国产成年精品| 天堂视频福利| 国内外成人免费视频| 337p日本欧洲亚洲大胆精品| 精品亚洲成a人在线观看| 亚洲国产视频二区| 伊人精彩视频| 精品综合久久| 亚洲男人天堂视频| 欧美国产一区视频在线观看| 国产专区一区| 韩国成人漫画| 草草久视频在线观看电影资源| 成人免费视频网站入口| 欧美成人激情免费网| 自拍av一区二区三区|