python爬虫(三) ---- 分页抓取数据

python爬虫之分页抓取数据

一、环境准备

  • 练习地址: https://spa1.scrape.center

  • requests:发出请求

  • pandas:保存数据到 csv文件

  • 依赖安装命令:

    yaml 复制代码
    pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple
    pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple	

二、爬取思路

  • 分析api中返回的分页参数, 获取api中返回的数据总条数, 如下图
  • 总页数为 总条数(count) / 每页条数(limit), 通过math函数取上界
  • 计算request需要的分页参数 limit 和 offset, 请求时传入
  • 循环抓取直至最后一页, 数据量过多, 可以进行分批写入
  • 通过装饰器模式 计算程序总执行时间

三、代码示例

python 复制代码
import requests
import pandas as pd
import math
import time
import os


def request(url, params):
    print(f'url: {url}, params: {params}')
    r = requests.get(url, params=params);
    return r.json();


def parseJson(json_data):
    movie_list = []
    results = json_data['results']
    for result in results:
        movie_info = {'name': f"{result['name']} - {result['alias']}",
                      'categories': ','.join(result['categories']),
                      'location': ','.join(result['regions']),
                      'duration': result['minute'],
                      'release_date': result['published_at'],
                      'score': result['score']}
        movie_list.append(movie_info)
    return movie_list


def save(data):
    df = pd.DataFrame(data);
    # 设置表头
    df.columns = ['电影名', '类型', '地域', '时长', '上映时间', '评分'];
    df.to_csv(file_path, index=False, encoding='utf-8-sig', mode='a', header=not os.path.exists(file_path));
    print(f'写入文件成功...{len(data)}条')


# 计算耗费时间
def cost_time(func):
    def fun(*args, **kwargs):
        t = time.perf_counter()
        result = func(*args, **kwargs)
        print(f'func {func.__name__} cost time:{time.perf_counter() - t:.8f} s')
        return result

    return fun


movie_list = []
file_path = 'data_js.csv'


@cost_time
def js_spider():
    index = 1;
    limit = 10;
    total_page = 1;
    url = 'https://spa1.scrape.center/api/movie';
    while (True):
        offset = (index - 1) * limit;
        params = {
            'limit': limit,
            'offset': offset
        }

        # 发出请求
        jsonData = request(url, params)

        # 解析json
        movie_list_page = parseJson(jsonData)
        movie_list.extend(movie_list_page)

        # 分批写入文件
        if len(movie_list) >= 50:
            save(movie_list)
            movie_list.clear()

        # 获取总页数, 网址最后一页数据有问题, 所以取下界
        if index == 1:
            total_page = math.floor(jsonData['count'] / limit);
        elif index == total_page:
            break

        index += 1
        time.sleep(0.2)

    # 存储剩余的数据
    if len(movie_list) > 0:
        save(movie_list)


if __name__ == '__main__':
    js_spider()

四、结果展示


相关推荐
Logintern094 小时前
Celery 死信队列 Dead‑Letter Queue(DLQ)
python
Python私教4 小时前
四个入口,一条流水线:如意智影的多入口架构取舍
人工智能·python·架构
XiaQ09194 小时前
Linux 常用命令学习笔记(用户管理篇):用户、组与权限的钥匙
linux·开发语言·笔记·学习
不可求~4 小时前
C++ 报错交给 AI 之前,先准备好这 8 类信息
开发语言·c++·人工智能
名字还没想好☜4 小时前
用 Python struct 解析二进制协议:pack/unpack、字节序与对齐踩坑
开发语言·python·二进制·struct
一知半解仙4 小时前
当机器人学会泛化,而我在写Java:一名后端开发者的2026年8月21日观察手记
java·开发语言·机器人
0xBADCODE4 小时前
Flask SSTI读SECRET_KEY+伪造Session:税务系统渗透全流程
前端·后端·python·安全·web安全·网络安全·flask
青 春 记 忆4 小时前
LeetCode 155. 最小栈|Python 解法详解
开发语言·python·leetcode
剩下了什么13 小时前
float32 与 float64 精度陷阱:如何在 Go 中避免错误使用
开发语言·后端·golang
指尖时光.13 小时前
Three.js 超全入门综合案例
开发语言·javascript·ecmascript