logo
Loading...

使用PyQuery/grab也能下載圖片嗎? - Cupoy

老師您好,我在Day 10的作業練習中想要利用PyQuery/grab操作Day 9的作業,但是下載...

pycrawler,pycrawler-d10

使用PyQuery/grab也能下載圖片嗎?

2020/02/18 06:17 PM
Python網路爬蟲論壇
何紹愷
觀看數:0
回答數:1
收藏數:1
pycrawler
pycrawler-d10

老師您好,我在Day 10的作業練習中想要利用PyQuery/grab操作Day 9的作業,但是下載圖片時許多方法都失敗了,網路上面也找不到有人使用grab下載圖片,唯一的是grab的documentation中提到:

第 一次嘗試下載Day 9的圖片時,程式碼與報錯訊息如下:

from grab import Grab
from pyquery import PyQuery as pq
import os
import io
import tempfile
from PIL import Image, ImageFile

ImageFile.LOAD_TRUNCATED_IMAGES = True

url = 'https://www.ptt.cc/bbs/Beauty/M.1556291059.A.75A.html'
= Grab()
g.cookies.set(name = "over18", value = "1", domain = "ptt.cc")
resp = g.go(url)
doc = pq(resp.body)

# 決定要儲存的資料夾
output_dir = './photos'

# 假如資料夾不存在就新增一個資料夾
if not os.path.exists(output_dir):
    os.makedirs(output_dir)

# 定位所有圖片的 tag
image_tags = doc("#main-content").children("a").items()

for img_tag in image_tags:
    # 取得所有圖片在第三方服務的 id
    if "imgur" not in img_tag.attr("href"):
        continue
    img_id = img_tag.attr("href").split('/')[-1]

    # 組合圖片而非網站的網址
    img_url = "https://i.imgur.com/{}.jpg".format(img_id)
    
    # 對圖片送出請求
    r = g.go(url)
    
    #下載圖片
    with open("./photos/{}.jpg".format(img_id), "wb") as f:
        f.write(r.body)
    
    img = Image.open("./photos/{}.jpg".format(img_id))
    local_file_path = os.path.join(output_dir, "{img_name}.{img_ext}".format(
        img_name = img_id.split(".")[0], img_ext = img.format.lower()))
    img.save(local_file_path)

直接前往資料夾看檔案也是無法讀取的狀態


第二次嘗試,使用之前day 9 範例的方法,直接用Image.open(r.body),出現一堆亂碼,圖片未成功下載

...上略

#下載圖片
img = Image.open(r.body)
local_file_path = os.path.join(output_dir, "{img_name}.{img_ext}".format(
    img_name = img_id.split(".")[0], img_ext = img.format.lower()))
img.save(local_file_path)


  1. 請問這是因為什麼緣故呢?
  2. 如果要正確下載我還缺了甚麼東西呢?
  3. 一般爬圖片會用到grab嗎? 還是大多都用requests?


麻煩老師幫我解惑了!