requests模块之豆瓣电影信息爬取

一、通过抓包工具获取请求接口

  • 点击喜剧类别排行榜,可以发现里面含有排名的电影信息,如下图所示,包含憨豆先生精选辑、美丽人生等,而这些信息正是我们需要爬取的。
    image
  • 打开F12的开发者选项,就可以发现有XHR的请求信息,然后滚动鼠标滚轮,会发现页面上的影片信息变多,但是地址栏的url并没有改变,就可以知道,该排行榜的影片信息是ajax异步加载的了。
    image
    image
    image
  • 由上图可以发现,该请求为GET请求,并且其中Parameters(即请求的参数)中包含了5个参数(type是类型,24应该就是喜剧类型;interval_id为固定数据;start和limit应该就是初始页面以及展示的影片数量,这两个参数可以自行该改变),与前一节类似,这些都是拼接在url中的参数,也可以封装为字典作为get()方法中的params参数进行请求。可以看到response中,返回的即当前页面中的影片信息,只是为json数据,这些正是我们需要爬取的。
  • 基础的流程已经分析清楚,接下来便可动手编码了。

二、requests模拟浏览器发起请求

# _*_coding : UTF-8_*_
import requests
import json

# 1、指定url
url = 'https://movie.douban.com/j/chart/top_list'

# 2、指定请求参数
param = {
    'type' : '24',
    'interval_id': '100:90',
    'action': '',
    'start': '1',   # 从库中的第几部去取
    'limit': '20',   # 一次取出的个数
}

# 3、 UA 伪装
headers = {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36",
}

# 4、发起请求
response = requests.get(url=url, params=param, headers=headers)
with response:
    list_data = response.json()
    fp = open('./douban.json', 'w', encoding='utf-8')
    json.dump(list_data, fp=fp, ensure_ascii=False)
    print('over')
import requests
import json

def douban_spider(url=None, num=10):
    """
    爬取豆瓣电影排行榜信息
    :param url: 网址链接
    :param num: 电影数量
    :return:
    """
    # assert url is not None, "url is None!" # False才会触发assert
    if url is None:
        print("url should not be None!")
        return
    # 1.指定url
    url = url
    # 2.UA伪装
    headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36'
    }
    # 3.设置请求参数
    params = {
        'type': '24', # 电影类型
        'interval_id': '100:90',
        'action': '',
        'start': '0', # 起始电影iD
        'limit': num # 数量
    }
    # 4.发起请求
    response = requests.get(url=url, params=params, headers=headers)
    # 5.获取响应数据
    list_data = response.json()
    # 6.持久化存储
    fp = open('./douban_movies.json', 'w', encoding='utf-8')
    json.dump(list_data, fp=fp, ensure_ascii=False)
    for data in list_data:
        print("影片:{}, 评分:{}, 年份:{}, 演员:{}".format(data["title"], data["score"], data["release_date"], data["actors"]))
    print("已成功爬取{}部电影信息!".format(num))


if __name__ == '__main__':
    # 喜剧类型电影页面url
    url = "https://movie.douban.com/j/chart/top_list"
    # 输入影片数量
    num = int(input("enter your wanted nums of movies:"))
    douban_spider(url=url, num=num)
posted @ 2021-04-27 22:50  SRE运维充电站  阅读(368)  评论(0编辑  收藏  举报