iT邦幫忙

2023 iThome 鐵人賽

DAY 18
0
Software Development

30天來打造一個方便的訂房機器人系列 第 18

[Day 18]躲到哪我都把你揪出來

  • 分享至 

  • xImage
  •  

今天是我們一大進展之一,前面沒有講到的一項功能,抓取圖片
再爬蟲中其實爬取圖片是一件非常,常用到的一個功能,那我們一步步來解析今天要做到的事情吧~~

第一步 前往訂房網站

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資料夾裡面囉

下一篇把這個功能應用到我們現在的程式上面吧


上一篇
[Day 17]收入囊中,為己所用 #3
下一篇
[Day 19]收入囊中,為己所用 #4
系列文
30天來打造一個方便的訂房機器人30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言