import re
import requests
n = 0 # 初始化计数器n,标记总共遇到的图片数
m = 0 # 初始化计数器m,标记已成功下载的图片数
# 下面多多线程执行部分,可用于并发下载提高效率,还未完善
# executor = ThreadPoolExecutor(max_workers=10)
for i in range(1, 335):
# 对于第一页,URL有所不同
url = 'https://dimtown.com/p/' if i == 1 else f'https://dimtown.com/p/page/{i}'
# 设置请求头,模仿浏览器行为,避免被简单识别为爬虫
header1 = {
'user-agent': 'Mozilla/5.0 ... Chrome/128.0.0.0 Safari/537.36'
}
# 发送GET请求获取页面内容
response = requests.get(url=url, headers=header1)
# 解码响应内容为文本格式以便处理
content = response.content.decode()
# 使用正则提取图片原始链接和帖子链接
datas = re.findall('data-original="(.*?)"', content)
referers = re.findall('<div class="kzpost-data"><a href="(.*?)" target="_blank"', content)
# 针对每一条图片数据进行处理
for data in datas:
if 'https://image.baidu.com' in data:
n += 1 # 图片总数加一
m += 1 # 成功处理的图片数加一
# 若图片链接来自百度,进一步解析得到真实图片URL
results = re.findall(r'thumburl=https://baidu.com&url=(.*)', data)
print(f'第{i}页,第{n}个,已获取{m}个', results)
for result in results:
# 下载图片并 保存图片到本地
response_img = requests.get(url=result)
content_img = response_img.content
with open(f'./pic/img{m}.jpg', 'wb') as f:
f.write(content_img)
break # 下载完成后跳出内层循环
elif 'https://cci1.dimtown.com' in data:
n += 1
m += 1
print(f'第{i}页,第{n}个,已获取{m}个', data)
# 若图片直接可用或需要通过Referer下载,则进行尝试
for referer in referers:
header2 = header1.copy() # 创建相同请求头副本,并添加Referer字段
header2['referer'] = referer
response_img = requests.get(url=data, headers=header2)
content_img = response_img.content
with open(f'./pic/img{m}.jpg', 'wb') as f:
f.write(content_img)
break # 完成下载后结束循环