[9]个人学习python:爬豆瓣电影,处理‘加载更多’动态页面

先分析:
1、网址是https://movie.douban.com/tag/#/,按F12进入网页开发模式,找到Network-XHR,然后刷新页面并筛选,找到第一条,然后点击页面'加载更多',找到第二条,以此类推;
   点击找到的动态信息,找到General-Request URL,就是动态的实际地址了:
   https://movie.douban.com/j/new_search_subjects?sort=T&range=0,10&tags=&start=0

   打开之后,复制到Pycharm,格式化,可以发现是一个字典:

以下只展示3个
{'data': [{'directors': ['弗兰克·德拉邦特'], 'rate': '9.6', 'cover_x': 2000, 'star': '50', 'title': '肖申克的救赎',
           'url': 'https://movie.douban.com/subject/1292052/',
           'casts': ['蒂姆·罗宾斯', '摩根·弗里曼', '鲍勃·冈顿', '威廉姆·赛德勒', '克兰西·布朗'],
           'cover': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg', 'id': '1292052',
           'cover_y': 2963},
          {'directors': ['吕克·贝松'], 'rate': '9.4', 'cover_x': 658, 'star': '45', 'title': '这个杀手不太冷',
           'url': 'https://movie.douban.com/subject/1295644/',
           'casts': ['让·雷诺', '娜塔莉·波特曼', '加里·奥德曼', '丹尼·爱罗', '彼得·阿佩尔'],
           'cover': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p511118051.jpg',
           'id': '1295644', 'cover_y': 980},
          {'directors': ['罗伯特·泽米吉斯'], 'rate': '9.4', 'cover_x': 721, 'star': '45', 'title': '阿甘正传',
           'url': 'https://movie.douban.com/subject/1292720/',
           'casts': ['汤姆·汉克斯', '罗宾·怀特', '加里·西尼斯', '麦凯尔泰·威廉逊', '莎莉·菲尔德'],
           'cover': 'https://img1.doubanio.com/view/photo/s_ratio_poster/public/p510876377.jpg', 'id': '1292720',
           'cover_y': 1035}]

2、‘加载更多’通过json来实现,所以用json来解析;


故,代码如下:

# -*- coding: utf-8 -*
import requests,time
from lxml import etree
for c in range(3):              #查看URL发现第一个是0,选3页看看用range(3)
    url=r'https://movie.douban.com/j/new_search_subjects?sort=T&range=0,10&tags=&start={}'.format(c*20)
    headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}
    page=requests.get(url=url,headers=headers).json()
    #print (page)                 #把打印出的page格式化,可以看出page是一个字典,其键'data'的值page['data']是一个列表
    time.sleep(1)
    for r in range(20):              #每次加载是20条,字典、列表、字符串的索引都是从0开始的,所以用range(20);注意,网站标签,是从1开始的
        list=page['data']
        #print (list)
        dict=list[r]                 #之后我们发现,列表每个索引的值又是一个字典
        #print (dict)
        title = dict['title']
        rate = dict['rate']
        casts=dict['casts']          #字典dict[casts]的值又是一个列表
        #print (casts)
        url=dict['url']
        time.sleep(2)
        print ('片名:{}\n评分:{}\n演员:{}\n地址:{}'.format(title,rate,','.join(casts),url))
        print ('*'*88)

分析:

      ','.join(casts)     join()方法用于将序列中的元素以指定的字符连接生成一个新的字符串,这里将列表里面的每个值用逗号拼接起来。


结果如下:

[9]个人学习python:爬豆瓣电影,处理‘加载更多’动态页面_第1张图片


你可能感兴趣的:(python)