为什么Python爬虫仅能爬取1页,如何调整代码实现多页爬取?
多页爬取失败原因
- 数据存储逻辑错误:三个数据存储列表与DataFrame均在页循环内部初始化,每页执行时都会清空上一页的存储数据,最终仅能保留最后一次循环的单页数据
- 缺少基础反爬适配:未携带
User-Agent请求头访问,目标站点会识别为爬虫请求,大概率从第二页开始就返回错误页面、拦截响应,无法解析到有效内容 - 无请求异常校验逻辑:未判断请求返回的状态码,请求失败时仍直接解析错误内容,无法感知到请求被拦截的问题
修正后的代码
import requests from bs4 import BeautifulSoup import pandas as pd import time # 数据存储列表移到循环外全局初始化,避免每页重置 Category_list = [] link_list = [] title_list = [] # 配置模拟浏览器的请求头,规避基础反爬拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } for page in range(1, 20): req = requests.get(f"https://katmoviehd.sk/page/{page}", headers=headers) # 校验请求状态,异常则跳过当前页避免报错 if req.status_code != 200: print(f"第{page}页请求失败,状态码{req.status_code}") time.sleep(2) continue soup = BeautifulSoup(req.text,"html.parser") page_titles = soup.find_all('h2')[1:] categories = soup.find_all('span', class_ = 'meta-category') # 数据直接追加到全局列表 for cate in categories: Category_list.append(cate.text.strip()) for title_tag in page_titles: a_tag = title_tag.find("a") link_list.append(a_tag['href']) title_list.append(a_tag['title']) # 添加爬取延迟,降低请求频率避免被封 time.sleep(1.5) # 全部页面爬取完成后统一生成DataFrame Table = pd.DataFrame({'Links':link_list, 'Title':title_list, 'Category':Category_list})
补充说明
如果调整后仍存在部分页面爬取失败的情况,可适当延长time.sleep的等待时长,降低请求频率。
内容的提问来源于stack exchange,提问作者Shovo Murad
相关产品推荐
相关产品推荐

