1. 程式人生 > 其它 >Python3爬蟲_爬取Find47網站風景圖片

Python3爬蟲_爬取Find47網站風景圖片

Find47網站是展示日本47個縣的風景圖片,這個網站不用通過逆向,只要訪問網站的地址就可以獲取到對應的href 連結.

通過獲取對應url在請求獲得圖片壓縮包資料,儲存至本地.

準備工作:

  • 在pycharm IDE裡安裝好所需的庫
  • pip install requests
  • pip install lxml

執行一下程式碼:

import os
import time
import random
import requests
from lxml import etree
class GetPic(object):
    def __init__(self,url,pic_size):
        self.url 
= url self.pic_size = pic_size self.headers = {} # User-Agent 池 header_list = [ "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50" ,"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50
" ,"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;" ,"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1" ,"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56" ] self.headers
["User-Agent"] = random.sample(header_list,1)[0] def get_pic_url(self): # 獲取網站的圖片url count = 0 # 建立一個空字典儲存圖片的名稱和 url短連線 self.pic_name_dict = {} # 使用requests請求網頁連結 在利用etree物件分別獲取 獲取圖片名和url page_text = requests.get(url=self.url,headers=self.headers) tree = etree.HTML(page_text.text) pic_urls = tree.xpath("//ul[@id='photos']//a/@href") print("以獲取圖片url數量:",len(pic_urls)) # //*[@id="photos"]/li[1]/a/div/div[1] pic_name = tree.xpath("//ul[@id='photos']//div[@class='detail']/div[2]") for i in pic_urls: self.pic_name_dict[pic_name[count].text] = i.split("/")[-1] count += 1 return self.pic_name_dict def save_pic(self,pic_dict): # 儲存圖片至本地 base_url = "https://search.find47.jp/" # xl尺寸的圖片url : https://search.find47.jp/ja/images/NzJVV/download/xl filepath = f"{os.path.dirname(__file__)}\\PICFILE" # 判斷資料夾是否存在 不存在則建立一個 if not os.path.isdir(filepath): os.mkdir(filepath) # 遍歷字典 拼接下載連結 通過requests傳送請求獲取資料並儲存 for k,v in pic_dict.items(): with open(f'{filepath}\\{k}.zip','wb') as fp: data = requests.get(f"{base_url}/ja/images/{v}/download/{self.pic_size}").content fp.write(data) print(f"{k}.zip 圖片壓縮包下載完畢...") # 等待隨機時間在訪問 time.sleep(random.randint(1,3)) def run(self): # 執行函式 try: pic_name_dict = self.get_pic_url() self.save_pic(pic_name_dict) except Exception as e: print("錯誤資訊",e) if __name__ == '__main__': size_dict= {"S":"1280x960 px" ,"M":"1920x1440 px" ,"L":"3508x2631 px" ,"XL":"4608x3456 px" } url = input("請輸入網站連結:").strip() for k,v in size_dict.items(): print(f"尺寸[ {k} ] :{v} 解析度") size = input("請輸入下載圖片的尺寸字母:").strip() if size.upper() in size_dict and "http" in url: print("準備獲取下載的圖片URL...") # 測試連結 https://search.find47.jp/ja/images?area=hokkaido get_pic = GetPic(url,size.lower()) get_pic.run() else: print("字母或url錯誤,請重新輸入")

PS:需要注意的程式碼可以自行選擇下載圖片的解析度,但有些圖片是剛好沒有對應的尺寸從而儲存後的zip壓縮包會是空檔案.

本文來自部落格園,作者:Aitlo,轉載請註明原文連結:https://www.cnblogs.com/Aitlo/p/15487450.html