今天咱們要爬取花瓣網 https://huaban.com/
設計師尋找靈感的天堂!有海量的圖片素材可以下載,是一個優質圖片靈感庫
這次我們用 requests
登入花瓣網,爬取頁面,再用正則與json
提取有用資訊,最後把獲取的圖片資訊 儲存到本地
python 基礎
requests
登入頁面獲取session使用者對談,下載圖片正規表示式
提取頁面的有用資訊json
解析頁面中的圖片https://huaban.com/search/?q=女神&category=photography
requests
pip install requests
https://huaban.com/search/?q=女神&category=photography&page=1
https://huaban.com/search/?q=女神&category=photography&page=2
2.登入
通過Fiddler我們檢視到登入請求的地址和引數
# 地址
https://huaban.com/auth/
# 引數
"email": "******",
"password": "*****",
"_ref":"frame"
我決定使用requests
的session()
功能來獲取使用者登入後的對談session資訊
我們通過右鍵檢視原始碼發現資料是儲存在javascript
裡面的我們準備用正規表示式提取頁面資訊
#-*- coding:utf-8 -*-
import requests
import re
import json
# 匯入 requests re正則 json
'''
login
登入花瓣 獲取session
'''
def login():
login_url = 'https://huaban.com/auth/'
# 登入地址
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0",
"Accept": "application / json",
"Content-type": "application/x-www-form-urlencoded; charset=utf-8",
"Referer": "https://huaban.com/",
}
# 請求頭資訊
session = requests.session()
#sesson 對談
login_data = {
"email": "zengmumu%40126.com",
"password": "zmm123",
"_ref":"frame"
}
response = session.post(login_url, data=login_data, headers=headers,verify=False)
# 登入頁面
getPic(session,5)
# 獲取圖片,前5頁
'''
getPic
解析頁面中的圖片地址
session 對談資訊
num 最大是頁數
'''
def getPic(session,num):
for i in range(1,num+1):
response = session.get("https://huaban.com/search/?q=%E5%A5%B3%E7%A5%9E&category=photography&page="+str(i))
# 獲取頁面資訊("美女"文字編碼後的結果是"%E5%A5%B3%E7%A5%9E" )
data = re.search('app\.page\[\"pins\"\] =(.*);\napp.page\[\"page\"\]', response.text, re.M | re.I | re.S)
# 提取到當前頁面所在的所有圖片資訊
data = json.loads(data.group(1))
# 轉換字串為列表
for item in data:
url = "https://hbimg.huabanimg.com/" + item["file"]["key"]
# 拼接圖片地址
index = item["file"]["type"].rfind("/")
type = "."+item["file"]["type"][index + 1:]
# 獲取圖片的型別
file_name = item["raw_text"]
# 獲取圖片的中文名
download_img(url, file_name,type)
# 下載圖片
'''
下載圖片
url 圖片的地址
name 圖片的中文名
type 圖片的型別
'''
def download_img(url,name,type):
response = requests.get(url,verify=False)
# 使用requests 下載圖片
index = url.rfind('/')
file_name = name+url[index + 1:]+type
# 獲取圖片的hash值
print("下載圖片:" + file_name)
# 列印圖片名稱
save_name = "./photo/" + file_name
# 圖片儲存的地址(注意photo要自己建一個,與當前.py檔案同一個資料夾)
with open(save_name, "wb") as f:
f.write(response.content)
# 寫入圖片到本地
'''
定義主函數
'''
def main():
login()
# 如果到模組的名字是__main__ 執行main主函數
if __name__ == '__main__':
main()
線上練習:https://www.520mg.com/it
IT 入門 感謝關注