MyModHeaven 发表于 2022-8-14 19:36

下载豆瓣电影 Top 250 的海报

本帖最后由 MyModHeaven 于 2022-8-16 12:07 编辑

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

https://static.52pojie.cn/static/image/hrline/4.gif


- 看见一个求豆瓣电影Top 250的海报的帖子,我就尝试了一下
- 豆瓣的人机验证很迷幻,基本上下好几千张也不需要验证,有时候刚开始下几十张就需要验证。
- 代码里识别豆瓣人机验证的函数还有点问题,应该把图片保存到本地然后识别。因为很少碰到人机验证,所以这个函数现在还没改好,但是我不想下了,浪费时间,就这样吧
- 分享的海报也是只有top 200 的,后面不下了,下载链接在这个帖子里:https://www.52pojie.cn/thread-1675380-1-1.html

- 借助两个提供免费 IP 的网站
- 虽然 IP 和 UA 都是随机的,但是 cookie 就一个,不知道弄随机 IP, UA 有没有必要
- ua 是我写的一个生成随机 ua 的文件

- 代码:

```py
# 需要改的地方有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()
    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   # 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} 下载完毕')
```

cao_jf 发表于 2022-8-14 21:49

有没有下载好的 ?发一份{:1_918:}

MyModHeaven 发表于 2022-8-17 10:14

laoladejiang 发表于 2022-8-17 09:04
楼主海报链接重新来一份

本来上传到阿里云盘的是自解压的压缩包,没办法,阿里云盘还不能分享压缩包。可是管理给删除了,说的是不让发这种。海报图片有一万多张,我也不可能不压缩传上去

wojaiyh 发表于 2022-8-14 20:23

下载海报?
学习了·!!~~~~

icodeme 发表于 2022-8-14 20:40

太强了,感谢分享{:1_921:}

红蓝黄 发表于 2022-8-14 20:42

有没有下载好的 ?发一份{:301_1000:}

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扩展,还是不能运行
页: [1] 2 3 4
查看完整版本: 下载豆瓣电影 Top 250 的海报