這是給我自己的一份教學,以免日子久了忘記怎麼爬蟲,同時也是一篇學習紀錄
擁有一個可以寫code的環境,網路上很多安裝環境的教學
我是用anoconda的vs code寫code的
import requests as req # 向客戶端要求網址 from bs4 import BeautifulSoup as B # 索取網址內容 import pandas as pd # 最後將結果輸出為CSV檔 import time # 避免爬蟲時被抓到是爬蟲,所以移用這個延長每次爬蟲時間,假裝自己是人類 import random # 延遲隨機時間用的 builder_url = 'https://www.theeducatedbarfly.com/cocktail-builder/' # 我是用 **cocktail builder** 這個網站來爬蟲我要的酒單 header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36'} # 起初在爬的時候有發現跑不出資料,所以新增header來假裝我是人類,網路上也有很多如何在瀏覽器找header的教學 resp = req.get(builder_url, headers=header) # 建立抓取url的回應變數 cocktail_name_list = [] # 建立空清單,將抓取到的資料先放進來,以便最後做成dataframe if resp.status_code == 200: # 確定你的url是可以連線的 soup = B(resp.text, 'html.parser') # 建立爬蟲的頭頭,後面的html.parser是每次建立都要有,好像是用來解析html的功能 for cocktail_name in soup.find_all('div', class_="wpupg-item-title wpupg-block-text-bold"): # 打開網頁按下F2,按下ctrl+shift+c進入選取網頁元素模式,點選任一調酒,會指引到該調酒的block # 你會發現所有的調酒名稱都在'div', class_="wpupg-item-title wpupg-block-text-bold"這個標籤底下,所以我們利用find_all遍歷該標籤 name = cocktail_name.text.strip() # 調酒名稱都在'div', class_="wpupg-item-title wpupg-block-text-bold"的標籤的text內容中,strip()是去掉text前後多餘的空格 if name: # 確定該標籤有內容才抓,沒有就不抓 cocktail_name_list.append(name) # 抓到修飾後的text並放入剛剛建立的list time.sleep(random.uniform(1,3)) # 每次抓完一個就等待 1~3 秒 cocktail_name_df = pd.DataFrame(cocktail_name_list, columns=['Name']) # 將抓完後的清list建立成一個Dataframe,以Name當作該欄位的名稱 cocktail_data = [] # 這是最後的調酒名稱+該調酒的材料的空清單 for name in cocktail_name_df['Name']: urls = f'https://www.theeducatedbarfly.com/{name.replace(" ", "-").lower()}/' # 建立每個調酒的url,點進去隨便一個調酒,你會發現網址是https://www.theeducatedbarfly.com/xxx-xxx/ # xxx是該調酒的名稱,只是我們剛剛的調酒名稱list有大寫而且中間是空格不是-,所以用replace將空格替換成-,且轉為小寫 resp = req.get(urls, headers=header) if resp.status_code == 200: soup = B(resp.text, 'html.parser') # 查找所有具有指定 class 的 <span> 元素 ingredients = soup.find_all('span', class_='wprm-recipe-ingredient-name') ingredient_name_list = [] for ingredient in ingredients: # 提取<a>標籤的文字內容 ingredient_name = ingredient.find('a') if ingredient_name: # 確保<a>存在 ingredient_name_list.append(ingredient_name.text.strip()) cocktail_data.append({'Cocktail Name': name, 'Ingredients': ", ".join(ingredient_name_list)}) # 最後就是將剛剛抓到的Name跟這個Inredients清單中每個素材加入剛剛建立的加入剛剛建立的cocktail_data清單中 time.sleep(random.uniform(1,3)) cocktail_df = pd.DataFrame(cocktail_data) # 最後的最後將list轉為Dataframe並用pd.to_csv輸出成csv檔,結束這回合 以上是我提醒自己的爬蟲教學
有任何疑問歡迎提出
雖然我還沒有建立留言板就是了
...