这篇文章将教大家如何通过Python代码批量下载某博主全部微博相册。
一、获取微博相册链接
首先,我们需要获取到某博主的所有微博相册链接。可以通过以下代码获取到某博主的首页链接:
import requests
from bs4 import BeautifulSoup
url = 'https://weibo.com/xxx' # 博主首页链接
headers = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36'}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
album_links = []
for link in soup.find_all('a'):
href = link.get('href')
if 'photo' in href:
album_links.append(href)
print(album_links) # 输出博主所有微博相册的链接
上述代码中,我们使用requests库发起GET请求,获取到博主首页的HTML代码。然后使用BeautifulSoup库对HTML进行解析,通过查找所有a标签的href属性,筛选出包含“photo”的链接,即为博主的微博相册链接。
二、登录微博并解析相册页面
由于微博需要登录才能查看相册页面,所以我们需要使用Selenium库模拟登录,并使用BeautifulSoup库对相册页面进行解析。
首先,我们需要安装Selenium库:
pip install selenium
接着,使用以下代码进行登录:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from time import sleep
driver = webdriver.Chrome() # 需要先下载ChromeDriver并配置环境变量
driver.maximize_window()
driver.get('https://weibo.com/login.php')
# 手动输入账号密码或使用cookies登录
sleep(30)
# 登录成功后,进入相册页面
driver.get('https://photo.weibo.com/albums')
上述代码中,我们首先启动Chrome浏览器并最大化窗口。然后打开微博的登录页面,并手动输入账号密码或使用提前准备好的cookies登录。登录成功后,跳转到微博的相册页面。
接着,我们使用以下代码解析相册页面,获取相册的名称和照片链接:
soup = BeautifulSoup(driver.page_source, 'html.parser')
albums = soup.find_all('a', class_='album-cover')
album_dict = {}
# 获取相册名称和链接
for album in albums:
album_name = album.get('title')
album_link = album.get('href')
album_dict[album_name] = album_link
# 获取相册中所有照片的链接
for album_name, album_link in album_dict.items():
driver.get(album_link)
soup = BeautifulSoup(driver.page_source, 'html.parser')
photos = soup.find_all('img')
photo_links = []
for photo in photos:
link = photo.get('src').replace('orj360', 'large')
photo_links.append(link)
album_dict[album_name] = photo_links
print(album_dict) # 输出相册名称和照片链接
上述代码中,我们使用BeautifulSoup库对相册页面进行解析,获取每个相册的名称和链接。然后使用WebDriver模拟访问每个相册链接,并解析页面获取照片链接。最终得到一个字典,包含每个相册的名称和所有照片的链接。
三、批量下载照片
最后,我们使用以下代码批量下载所有照片:
import os
import requests
DOWNLOAD_PATH = 'download' # 下载路径
if not os.path.exists(DOWNLOAD_PATH):
os.mkdir(DOWNLOAD_PATH)
for album_name, photo_links in album_dict.items():
album_path = os.path.join(DOWNLOAD_PATH, album_name.replace('/', '-'))
if not os.path.exists(album_path):
os.mkdir(album_path)
for link in photo_links:
filename = link.split('/')[-1]
filepath = os.path.join(album_path, filename)
if os.path.exists(filepath):
continue
response = requests.get(link)
with open(filepath, 'wb') as f:
f.write(response.content)
print('下载完成!')
上述代码中,我们首先定义了全局变量DOWNLOAD_PATH,用于指定下载路径。然后遍历每个相册,为每个相册创建一个对应的文件夹。接着遍历相册中所有照片的链接,为每张照片创建一个对应的文件并进行下载。最终,我们可以在DOWNLOAD_PATH路径下看到所有下载的照片。
四、总结
通过本文的介绍,我们学习了如何使用Python和相关库批量下载某博主全部微博相册。具体包括获取相册链接、登录并解析相册页面、批量下载照片等操作。希望读者可以通过本文学到有用的知识,并在工程实践中得到应用。