吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2991|回复: 30
收起左侧

[Python 转载] 下载豆瓣电影 Top 250 的海报

[复制链接]
MyModHeaven 发表于 2022-8-14 19:36
本帖最后由 MyModHeaven 于 2022-8-16 12:07 编辑

发现我用的 IP 都被豆瓣封了,特来把相关部分删除




  • 看见一个求豆瓣电影Top 250的海报的帖子,我就尝试了一下

  • 豆瓣的人机验证很迷幻,基本上下好几千张也不需要验证,有时候刚开始下几十张就需要验证。

  • 代码里识别豆瓣人机验证的函数还有点问题,应该把图片保存到本地然后识别。因为很少碰到人机验证,所以这个函数现在还没改好,但是我不想下了,浪费时间,就这样吧

  • 分享的海报也是只有top 200 的,后面不下了,下载链接在这个帖子里:https://www.52pojie.cn/thread-1675380-1-1.html

  • 借助两个提供免费 IP 的网站

  • 虽然 IP 和 UA 都是随机的,但是 cookie 就一个,不知道弄随机 IP, UA 有没有必要

  • ua 是我写的一个生成随机 ua 的文件

  • 代码:

# 需要改的地方有cookies, verify(), PATH, ip,或许还有其他没提及的

import os, random
from time import sleep
from threading import Thread, active_count

import requests, ddddocr
from bs4 import BeautifulSoup

import ua

cookies = ''

def req(url, dire=True, referer='https://movie.douban.com'):
    while True:
        try:
            # 那两个代{过}{滤}理网站不检查 referer,就将就着这样吧
            r = requests.get(url, headers={'User-Agent': ua.ua, 'Cookie': cookies, 'Referer': referer}, proxies={'http': ip})
            break
        except:
            print('————连接失败,休眠 10s。。。')
            sleep(10)
            continue
    if dire:
        sc = BeautifulSoup(r.text, 'lxml')
    else:
        sc  = r.content
    return sc

def verify(url):
    # 人机验证,识别验证码
    print('进行人机验证。。。。。。。。。。。。。。。。。。。。。。。。。。。。')
    sorry = 'https://www.douban.com/misc/sorry'
    form = req(sorry).find('form', method='POST')
    img = form.img.attrs['src']
    captcha_id = form.find('input', attrs={'name': 'captcha-id'}).attrs['value']        # 根据 name 属性值选择节点,不能写成 find('', name=''),会报错,要写字典里面去
    content = requests.get(img, headers={'User-Agent': ua.ua, 'Cookie': cookies,})
    code = ddddocr.DdddOcr(show_ad=False).classification(content)
    data = {'ck': 'SWJs', 'captcha-solution': code, 'captcha-id': captcha_id, 'original-url': url}
    requests.post(sorry, data=data, headers={'User-Agent': ua.ua, 'cookie': cookies})

def dl_poster(label):
    posters_url = f'https://movie.douban.com/subject/{label}/photos?type=R&start=0&sortby=like&size=a&subtype=a'
    soup = req(posters_url)
    movie = soup.find('div', id='content').h1.string.split()[0]
    if '的海报' in movie:
        movie = movie[:-3]
    path = part + movie         # 绝对路径
    if not os.path.exists(path):
        os.mkdir(path)
    os.chdir(path)

    # 计算页数
    _num = soup.find('div', id='photos_filter').find('li', class_='current').span.string[4:-1]   # str
    _pages = int(_num) // 30 + 1
    n = 0
    for page in range(_pages):
        page = f'https://movie.douban.com/subject/{label}/photos?type=R&start={page*30}&sortby=like&size=a&subtype=a'
        node_li = req(page).find('ul', class_='poster-col3 clearfix')( 'li')
        for li in node_li:
            photo, name = li.div.a.attrs['href'], ' '.join(li.get_text().split()[:-1])
            if '/' in name:
                name = name.replace('/', '&')
            while True:
                try:
                    jpg = req(photo).find('span', class_='update magnifier').a.attrs['href']        # 不登陆没有这个
                    break
                except AttributeError:
                    verify(photo)
            with open(f'{path}/{name}.jpg', 'wb') as f:
                f.write(req(jpg, dire=False, referer=photo))
            n += 1
            print(f'【{movie}】,第 {n} 张')
    print(f'已下载完毕电影 {movie},共计 {_num} 张')

for start in range(0, 250, 25):
    PATH = ''
    part = f'{PATH}{start}-{start+25}/'     # 绝对路径
    if not os.path.exists(part):
        os.mkdir(part)
    os.chdir(part)
    url = f'https://movie.douban.com/top250?start={start}&filter='
    while True:
        try:
            node_li = req(url).find('ol', class_='grid_view')('li')
            break
        except TypeError:
            verify(url)
    for li in node_li:
        label = li.div.div.a.attrs['href'].split('/')[-2]       # 每个电影的号码
        Thread(target=dl_poster, args=(label,)).start()
    while True:
        if active_count() == 1:         # 最后剩一个 MainThread
            break
    print(f'Top{start+25} 下载完毕')

免费评分

参与人数 4吾爱币 +2 热心值 +4 收起 理由
ZHwuaipojie + 1 我很赞同!
cc5720 + 1 我很赞同!
HjiaLe02 + 1 + 1 我很赞同!
he先生 + 1 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

cao_jf 发表于 2022-8-14 21:49
有没有下载好的 ?发一份
 楼主| MyModHeaven 发表于 2022-8-17 10:14
laoladejiang 发表于 2022-8-17 09:04
楼主海报链接重新来一份

本来上传到阿里云盘的是自解压的压缩包,没办法,阿里云盘还不能分享压缩包。可是管理给删除了,说的是不让发这种。海报图片有一万多张,我也不可能不压缩传上去
wojaiyh 发表于 2022-8-14 20:23
icodeme 发表于 2022-8-14 20:40
太强了,感谢分享
红蓝黄 发表于 2022-8-14 20:42
有没有下载好的 ?发一份
fgrt38176 发表于 2022-8-14 22:24
好东西,谢谢分享!
helloworld2022 发表于 2022-8-14 22:31
好东西,    谢谢分享!
he先生 发表于 2022-8-14 22:57
能不能哪位大佬捎带手发个海报包?!
xiaoer233 发表于 2022-8-14 23:23
谢谢楼主,学习了
wclover 发表于 2022-8-14 23:36
已经安装了Hack Configuration扩展,还是不能运行
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 03:02

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表