今天是我們一大進展之一,前面沒有講到的一項功能,抓取圖片
再爬蟲中其實爬取圖片是一件非常,常用到的一個功能,那我們一步步來解析今天要做到的事情吧~~
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.by import By
import requests #開啟圖片網址
import os #開啟檔案會用到
driver = webdriver.Edge()
driver.get('https://www.booking.com/hotel/tw/taipei-circle-stay.zh-tw.html?aid=304142&label=gen173nr-1FCAQoggJCDXNlYXJjaF_lj7DljJdIMFgEaOcBiAEBmAEwuAEXyAEM2AEB6AEB-AEDiAIBqAIDuAKZ7NSoBsACAdICJGU1MWJmZTNjLTlkOTktNGUyNy05MmFjLWUwMjczODY3NjRiYtgCBeACAQ&sid=cb458ada9a7f1250d0b138cc0873ade5&all_sr_blocks=403896502_179234322_0_0_0;checkin=2023-10-10;checkout=2023-10-12;dist=0;group_adults=2;group_children=0;hapos=1;highlighted_blocks=403896502_179234322_0_0_0;hpos=1;matching_block_id=403896502_179234322_0_0_0;no_rooms=1;req_adults=2;req_children=0;room1=A%2CA;sb_price_type=total;sr_order=popularity;sr_pri_blocks=403896502_179234322_0_0_0__216000;srepoch=1695888925;srpvid=6be63a0c4abf03e9;type=total;ucfs=1&#hotelTmpl')
到網站中我們可以看到,並不會是所有的圖片都顯現出來給我們,要對著圖片點一下所有的圖片才會出來
上有政策下有對策阿各位,既然他要我們點那我們就點給他看
close = driver.find_element(By.CSS_SELECTOR, 'a[class="bh-photo-grid-item bh-photo-grid-side-photo active-image "]')
close.click()
用selenium找到圖片的位置,對他點一下
這一步的重點在於找到點擊後的每個圖片位置,之後再以get的方式輸入key取得value,就可以輕鬆拿到圖片的網址了
source = driver.page_source
soup = BeautifulSoup(source, "lxml")
body = soup.find("body")
imgs = body.find_all("img", {"class": "bh-photo-modal-grid-image"}, limit=10)
image_links = [img.get("src") for img in imgs] # 取得圖片來源連結
image_tags = [img.get("alt") for img in imgs] #每個圖片的名稱
拿到每個圖片的網址後我們就可以透過requests.get()抓取那些圖片,再使用file.wirte將這張片的二進位碼寫成一個.jpg的檔案。
for index, link in enumerate(image_links):
if not os.path.exists("images"):
os.mkdir("images") # 建立資料夾
img = requests.get(link) # 下載圖片
with open("images\\" + image_tags[index] + str(index) + ".jpg", "wb") as file: # 開啟資料夾及命名圖片檔
file.write(img.content) # 寫入圖片的二進位碼
! 小提示
enumerate() 這個函數的作用是讓你能夠在遍歷(查看)一個列表、元組或字符串時,同時獲取每個元素以及它們的位置(索引)。這通常在使用 for 循環時很有用。
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.by import By
import requests
import os, time
driver = webdriver.Edge()
driver.get('https://www.booking.com/hotel/tw/taipei-circle-stay.zh-tw.html?aid=304142&label=gen173nr-1FCAQoggJCDXNlYXJjaF_lj7DljJdIMFgEaOcBiAEBmAEwuAEXyAEM2AEB6AEB-AEDiAIBqAIDuAKZ7NSoBsACAdICJGU1MWJmZTNjLTlkOTktNGUyNy05MmFjLWUwMjczODY3NjRiYtgCBeACAQ&sid=cb458ada9a7f1250d0b138cc0873ade5&all_sr_blocks=403896502_179234322_0_0_0;checkin=2023-10-10;checkout=2023-10-12;dist=0;group_adults=2;group_children=0;hapos=1;highlighted_blocks=403896502_179234322_0_0_0;hpos=1;matching_block_id=403896502_179234322_0_0_0;no_rooms=1;req_adults=2;req_children=0;room1=A%2CA;sb_price_type=total;sr_order=popularity;sr_pri_blocks=403896502_179234322_0_0_0__216000;srepoch=1695888925;srpvid=6be63a0c4abf03e9;type=total;ucfs=1&#hotelTmpl')
driver.set_window_size(10000,20000)
#這裡是為了讓所有圖片都可以加載到,所以就把視窗大小設定成很大
close = driver.find_element(By.CSS_SELECTOR, 'a[class="bh-photo-grid-item bh-photo-grid-side-photo active-image "]')
close.click()
source = driver.page_source
soup = BeautifulSoup(source, "lxml")
body = soup.find("body")
imgs = body.find_all("img", {"class": "bh-photo-modal-grid-image"}, limit=10)
image_links = [img.get("src") for img in imgs] # 取得圖片來源連結
image_tags = [img.get("alt") for img in imgs] # 取得圖片名稱
for index, link in enumerate(image_links):
if not os.path.exists("images"):
os.mkdir("images") # 建立資料夾
img = requests.get(link) # 下載圖片
with open("images\\" + image_tags[index] + str(index) + ".jpg", "wb") as file: # 開啟資料夾及命名圖片檔
file.write(img.content) # 寫入圖片的二進位碼
圖片載好後就會在image資料夾裡面囉
下一篇把這個功能應用到我們現在的程式上面吧