You need to enable JavaScript to run this app. Python爬取Kinopoisk剧集TOP250仅解析首页及CSV导出问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

Python爬取Kinopoisk剧集TOP250仅解析首页及CSV导出问题咨询

问题排查与修正方案

循环逻辑失效的核心原因

  • 代码中的基础URL存在两处硬错误:一是直接从HTML源码复制链接时,把表示&的HTML转义字符&原样写进了Python字符串,导致原本要传递的tab=all参数实际变成了参数名为amp;tab的无效参数;二是基础URL中硬编码了固定的page=1查询参数。
  • 按照requests库的参数拼接规则,当基础URL已经包含查询串时,传入的params字典不会覆盖原有同键参数,只会以追加形式拼接到查询串末尾。因此循环中传入的page=2/3/4/5会被追加到URL后面,最终生成的请求地址会同时存在两个page参数:最先出现的是硬编码在基础URL里的page=1,后面跟着循环传入的动态page值。
  • 网站服务器解析查询参数时,对于重复的同名参数,默认取最先出现的取值作为有效参数,因此不管循环执行到第几页,实际请求的都是page=1的内容,后续页面完全没有被采集到。

修正方式

将基础URL改为不带任何硬编码查询参数的纯路径,所有动态参数全部通过params字典传递,避免参数重复和转义错误:

# 去掉硬编码的查询参数和错误的转义字符
URL = 'https://www.kinopoisk.ru/lists/series-top250/'

# 循环传参时统一拼接固定的tab参数和动态page参数
for page in range(1, 6):
    html = get_html(URL, params={'page': page, 'tab': 'all'})
    genres.extend(get_content(html.text))

这样requests会自动生成格式正确的查询串,不会出现重复参数、参数名错误的问题,循环就能正常遍历5个页面了。

单genre逐行存储的调整逻辑

当前采集到的genre字段是同一部剧集的所有类型用逗号拼接成的完整字符串,要实现每行仅存储1个genre值,只需在解析阶段对genre文本做拆分处理即可:

  1. 拿到完整genre文本后,按逗号做分隔拆分
  2. 清理拆分后每个字符串的前后空格,过滤空值
  3. 将拆分后的每个单独genre作为独立条目加入采集列表,后续写入CSV时就会自然实现每行一个值

对应调整后的get_content函数代码:

def get_content(html):
    soup = BeautifulSoup(html, 'html.parser')
    items = soup.find_all('div', class_='selection-film-item-meta selection-film-item-meta_theme_desktop')

    genres = []
    for item in items:
        additional = item.find_all('span', {'class':'selection-film-item-meta__meta-additional-item'})
        genre_text = additional[1].get_text(strip=True)
        # 拆分多类型文本,清理无效空值
        split_genre_list = [g.strip() for g in genre_text.split(',') if g.strip()]
        # 每个拆分后的独立类型单独加入采集列表
        for single_genre in split_genre_list:
            genres.append({'genre': single_genre})
    return genres

调整后,原本一行存储的"动作, 剧情, 科幻"会被拆成3条独立记录,分别写入3行CSV,适配后续聚合分析的需求。

内容的提问来源于stack exchange,提问作者Daderk86

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.27 21:06:04