【Python——爬取次元小镇(未完善、未优化)】

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  # 完成下载后结束循环

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值