鱼C论坛

 找回密码
 立即注册
查看: 992|回复: 12

[已解决]豆瓣电影

[复制链接]
发表于 2020-6-12 13:52:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 jump_p 于 2020-6-12 13:53 编辑

1591940854(1).jpg

访问豆瓣美剧的页面,这个页面只显示20部美剧,需要下拉才能下载,也就是说是被JS渲染的。

640.png

F12右键检查,找到Network,左边菜单Name , 找到第五个数据,点击Preview。

1591940998(1).jpg
点开subjects,可以看到 title 就是对应电影名称。rate就是对应评分。通过js解析subjects字典,找到需要的字段。

那么如何找到每部电影的链接呢?我看到的文章链接如下: 不懂这个链接在哪里看到的

1591941123(1).jpg
最佳答案
2020-6-12 16:26:06
本帖最后由 Twilight6 于 2020-6-12 16:30 编辑

[b]
jump_p 发表于 2020-6-12 15:24
这是完整代码,帮忙品品


在这找的,而且你多翻几页就会找到规律,每页都是  age*20 的形式   

第一页是 0*20 第二页 1*20  第三页 2*20  所以那用 {} 格式化代入乘以20后的数即可模仿翻页

第二页:
GIF.gif




第三页:
213.png
[/b]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-12 14:40:24 | 显示全部楼层
本帖最后由 叱咤风云2333 于 2020-6-12 14:43 编辑

应该是网页自己地址栏里的url,这里应该不是每部电影的URL,是美剧主页的URL。limit=20和你每页显示20个对得上。
我从豆瓣电影主页,点击美剧栏目,进去的显示地址复制过来如下:https://movie.douban.com/tv/#!type=tv&tag=%E7%BE%8E%E5%89%A7&sort=recommend&page_limit=20&page_start=0
因为解码问题,地址栏里的“美剧”两个字复制过来后显示的是乱码。这样应该跟你看到文章里的是一样的。
Image 2.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-12 14:52:46 | 显示全部楼层
叱咤风云2333 发表于 2020-6-12 14:40
应该是网页自己地址栏里的url,这里应该不是每部电影的URL,是美剧主页的URL。limit=20和你每页显示20个对 ...

直接复制这个地址是爬不到东西的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-12 14:59:54 | 显示全部楼层
本帖最后由 叱咤风云2333 于 2020-6-12 15:04 编辑
jump_p 发表于 2020-6-12 14:52
直接复制这个地址是爬不到东西的

import urllib.request

url = 'https://movie.douban.com/tv/#!type=tv&tag=%E7%BE%8E%E5%89%A7&sort=recommend&page_limit=20&page_start=0'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'}
req = urllib.request.Request(url = url,headers = headers)
response = urllib.request.urlopen(req)
print(response.read().decode('utf-8'))

用上面代码把刚才这个网页爬出来了。
不过刚才爬出来的确实没有具体信息,猜测可能要通过树的形式,得点进去才能找到?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-12 15:06:37 | 显示全部楼层
叱咤风云2333 发表于 2020-6-12 14:59
用上面代码把刚才这个网页爬出来了。
不过刚才爬出来的确实没有具体信息,猜测可能要通过树的形式 ...

可能是加密的接口?我也不是很懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-12 15:12:10 | 显示全部楼层
4楼的代码是对的,一般下拉都是ajax,header里最好加上:X-Requested-With: XMLHttpRequest
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-12 15:24:21 | 显示全部楼层
本帖最后由 jump_p 于 2020-6-12 15:25 编辑
suchocolate 发表于 2020-6-12 15:12
4楼的代码是对的,一般下拉都是ajax,header里最好加上:X-Requested-With: XMLHttpRequest

import requests, json
from fake_useragent import UserAgent
import csv


class Doban(object):
    u = 0;

    def __init__(self):
        self.film_list = []
        ua = UserAgent(verify_ssl=False)
        self.url = "https://movie.douban.com/j/search_subjects?type=tv&tag=%E7%BE%8E%E5%89%A7&sort=recommend&page_limit=20&page_start={}"
        for i in range(1, 50):
            self.headers = {
                'User-Agent': ua.random # ua 构造随机请求头
            }

    '''发送请求  获取响应'''

    def get_page(self, url):
        res = requests.get(url=url, headers=self.headers)
        html = res.content.decode("utf-8")
        if res.status_code == 200:
            return html
        '''解析数据'''

    #
    # '''获取链接函数'''
    def parse_page(self, html):
        # 创建csv文件进行写入
        csv_file = open('scr.csv', 'a', encoding='gbk')
        csv_writer = csv.writer(csv_file)
        # 写入csv标题头内容
        csv_writer.writerow(['电影', '评分', "详情页"])
        data = json.loads(html)['subjects']
        # print(data[0])
        for r in data:
            # print(r)
            rate = r["rate"]
            id = r["title"]
            src = r["url"]
            urll = r["cover"]
            csv_writer.writerow([id, rate, urll])
            html2 = requests.get(url=urll, headers=self.headers).content
            dirname = "./图/" + id + ".jpg"
            with open(dirname, 'wb') as f:
                f.write(html2)
                print("%s 【下载成功!!!!】" % id)

        csv_file.close()

    def main(self):
        startPage = int(input("起始页:"))
        endPage = int(input("终止页:"))
        for page in range(startPage, endPage + 1, 20):
            url = self.url.format(page)
            # print(url)
            html = self.get_page(url)
            self.u += 1
            self.parse_page(html)
            print("======================第%s页爬取成功!!!!=======================" % str(self.u))


if __name__ == '__main__':
    Siper = Doban()
    Siper.main()

这是完整代码,帮忙品品
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-12 16:26:06 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Twilight6 于 2020-6-12 16:30 编辑

[b]
jump_p 发表于 2020-6-12 15:24
这是完整代码,帮忙品品


在这找的,而且你多翻几页就会找到规律,每页都是  age*20 的形式   

第一页是 0*20 第二页 1*20  第三页 2*20  所以那用 {} 格式化代入乘以20后的数即可模仿翻页

第二页:
GIF.gif




第三页:
213.png
[/b]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-12 16:34:39 | 显示全部楼层
{rate: "8.8", cover_x: 2025, title: "韦恩", url: "https://movie.douban.com/subject/30204361/",…}
cover: "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2545419100.jpg"
cover_x: 2025
cover_y: 3000
id: "30204361"
is_new: false
playable: false
rate: "8.8"
title: "韦恩"
url: "https://movie.douban.com/subject/30204361/"

返回的ajax里面,所有信息都包括了,链接什么的都有,直接提取
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-12 17:07:54 | 显示全部楼层
Stubborn 发表于 2020-6-12 16:34
返回的ajax里面,所有信息都包括了,链接什么的都有,直接提取

你这个似乎还不是,楼上那个是
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-12 17:08:31 | 显示全部楼层
Twilight6 发表于 2020-6-12 16:26
在这找的,而且你多翻几页就会找到规律,每页都是  age*20 的形式   

第一页是 0*20 第二页 1*20   ...

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-12 17:43:14 | 显示全部楼层
jump_p 发表于 2020-6-12 17:07
你这个似乎还不是,楼上那个是

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-12 18:35:23 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-20 17:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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