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文本做拆分处理即可:
- 拿到完整genre文本后,按逗号做分隔拆分
- 清理拆分后每个字符串的前后空格,过滤空值
- 将拆分后的每个单独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
相关产品推荐
相关产品推荐

