Python网络爬虫脚本问题求助:CSV仅含表头无数据
问题
尝试爬取网站【https://www.fishpond.co.nz/Books/Fiction_Literature/Comics_Graphic_Novels/Superheroes?page=1】的“图画小说”分类信息,需提取以下内容:
- 图画小说的标题
- 价格
- 装帧格式(精装/平装)
运行提供的Python爬虫脚本后,CSV文件仅生成表头,无任何网站数据,无法定位问题,请求帮助。
原代码:
import requests from bs4 import BeautifulSoup import pandas as pd books = [] for i in range (1,3): url = f"https://www.fishpond.co.nz/Books/Fiction_Literature/Comics_Graphic_Novels/Superheroes?page={i}.html" response = requests.get(url) response = response.content soup = BeautifulSoup(response, 'html.parser') div = soup.find('div') articles = div.find_all('article',class_ = 'b-list') for article in articles: title = article.find('a', class_ = 'item-block__title') title = title.attrs['title'] bookformat = article.find('item-block__format') price = article.find('span', class_ = 'item-block__price').text price = float(price[1:]) books.append([title,bookformat,price]) df = pd.DataFrame(books,columns=['title','bookformat','price']) df.to_csv('fishpondscrape.csv')
问题排查与修复方案
1. URL格式错误
原代码拼接的URL带有多余的.html后缀,导致请求到无效页面。正确的URL应移除该后缀,格式为:https://www.fishpond.co.nz/Books/Fiction_Literature/Comics_Graphic_Novels/Superheroes?page={i}
2. 页面元素定位错误
- 原代码用
soup.find('div')获取页面第一个div,这不是包含商品列表的容器,需定位到class为b-list__items的div容器。 - 商品对应的article元素class是
b-list__item,而非b-list。 - 装帧格式的选择器缺少class前缀
.,需改为article.find('span', class_='item-block__format'),并提取文本内容。 - 所有元素提取操作都需增加空值判断,避免因页面结构差异导致脚本中断,无法采集后续数据。
3. 未处理请求异常
原代码未处理网络请求失败的情况,需添加异常捕获,确保请求成功后再解析页面。
修正后的代码
import requests from bs4 import BeautifulSoup import pandas as pd books = [] for i in range(1, 3): # 修正URL格式,移除多余的.html后缀 url = f"https://www.fishpond.co.nz/Books/Fiction_Literature/Comics_Graphic_Novels/Superheroes?page={i}" try: response = requests.get(url) # 检查请求是否成功 response.raise_for_status() soup = BeautifulSoup(response.text, 'html.parser') # 定位正确的商品列表容器 list_container = soup.find('div', class_='b-list__items') if not list_container: print(f"第{i}页未找到商品列表容器") continue # 定位正确的商品article元素 articles = list_container.find_all('article', class_='b-list__item') for article in articles: # 提取标题,增加空值判断 title_elem = article.find('a', class_='item-block__title') title = title_elem.attrs['title'] if title_elem else '无标题' # 提取装帧格式,修正选择器并获取文本 format_elem = article.find('span', class_='item-block__format') bookformat = format_elem.text.strip() if format_elem else '无格式信息' # 提取价格,增加空值判断并处理格式 price_elem = article.find('span', class_='item-block__price') if price_elem: price_text = price_elem.text.strip() try: price = float(price_text[1:]) except ValueError: price = None else: price = None if title != '无标题': # 仅添加有效数据 books.append([title, bookformat, price]) except requests.exceptions.RequestException as e: print(f"请求第{i}页失败: {e}") # 生成CSV,移除索引列 df = pd.DataFrame(books, columns=['title', 'bookformat', 'price']) df.to_csv('fishpondscrape.csv', index=False) print("数据爬取完成,已保存到fishpondscrape.csv")
内容的提问来源于stack exchange,提问作者YShastri
相关产品推荐
相关产品推荐

