python爬取动态网站实例——以爬取豆瓣电影分类排行榜为例

最近在编写 python 爬虫的时候,发现有时候爬取的网页和实际看到的效果不一致,经过各种搜索之后发现这时因为网页在加载的时候动态加载的结果,所以,为了可以获得相应的结果,需要模拟相应的请求。本文以 豆瓣电影排行榜 为例,初步实现一个可以自动抓取,获得各种影片相关信息的爬虫。

首先,爬虫能够直接爬取的,一般是我们右键查看源所得到的相应源代码,异步加载的动态内容需要后续发送请求获得,那么如何查看相应的请求。在开发者模式下选择查看内容类型为 xpath

python爬取动态网站实例——以爬取豆瓣电影分类排行榜为例_第1张图片

这里可以看到相应的发送的请求,点击其中的一项查看相应的正文信息可以看见,就是各种电影信息的 json 格式,正是我们需要获取的。
python爬取动态网站实例——以爬取豆瓣电影分类排行榜为例_第2张图片
知道这点,那么获取相应的电影信息就没什么问题了,直接访问对应的url地址即可,如https://movie.douban.com/j/chart/top_list?type=24&interval_id=100%3A90,查看传递的参数,可以发现两个参数startlimit,意思就是获取从start开始的limit个电影的信息,通过这两个参数可以获得所有你想要的电影信息了,但是,如果要手动设置电影的总数的话不够自动话,所以继续在刚才的那几个请求中找寻我们的目标,查看https://movie.douban.com/j/chart/top_list_count?type=24&interval_id=100%3A90 的相应内容
python爬取动态网站实例——以爬取豆瓣电影分类排行榜为例_第3张图片

total!这不正是我们要的当前的电影总数吗?那么直接根据这个不就可以达成我们的目的了嘛,yes,it is。就顺着这条路继续走下去就好了。

最后说下有关于json数据格式解析的问题,其实挺简单的,json数据格式类似一个列表,里面每一个元素都是一个字典,字典包含了我们需要的电影信息。格式大致如下:

python爬取动态网站实例——以爬取豆瓣电影分类排行榜为例_第4张图片

所以通过json.loads()调用获得json对象后,可以向操作普通列表和字典那样访问相应的数据了。

下面是详细的代码:


import urllib.request
import re
import json


class DouBanSpider:

    def __init__(self, url, start=100, end=90): # start和end用于控制预筛选对象
        self.url = url
        s = "interval_id={0}%3A{1}".format(start, end)
        self.count_url = "https://movie.douban.com/j/chart/top_list_count?type=4&" + s
        self.tmp_url = "https://movie.douban.com/j/chart/top_list?type=4&" + s

    def __get_type(self): # 获取相应url中对应的type类型
        re_type_pattern = r'type=(\d*)'
        type = re.search(re_type_pattern, self.url)
        return type.group(1)

    def __get_count(self): # 获取总的电影数
        url = re.sub('type=(\d*)', 'type=' + str(self.__get_type()), self.count_url)
        file = urllib.request.urlopen(url)
        data = json.loads(file.read().decode('utf-8'))
        return data['total']

    def __get_item(self): # 获取每个电影项目
        url = re.sub('type=(\d*)', 'type='+str(self.__get_type()), self.tmp_url)
        post_param = {'action': '', 'start': '0', 'limit': str(self.__get_count())}
        file = urllib.request.urlopen(url, data=urllib.parse.urlencode(post_param).encode('utf-8'))
        data = json.loads(file.read().decode())
        print(data)
        return data

    def write_all(self):
        data = self.__get_item()
        with open("moive.txt", "w") as f:
            for item in data:
                result = str(item['title']) + '\t' + str(item['regions']) + '\t' + str(item['score']) + '\t' + str(item['vote_count']) + '\n'
                f.write(result)

test = DouBanSpider("https://movie.douban.com/typerank?type_name=喜剧片&type=24&interval_id=100:90&action=") # 把想要查询的分类的网址传入就行,自己设定相应的预筛选
test.write_all()
这样就初步简单实现了排行榜的爬取,谨此记下第一次的爬取动态网站的历程。

你可能感兴趣的:(python)