网页爬取CSV时如何确保作者与全文文件数据匹配?
解决DESWATER网站爬取时作者与文件匹配错位问题
问题说明
爬取DESWATER网站数据并保存至CSV时,出现作者与文件匹配错位的问题:部分作者无全文文件,原代码直接跳过这些作者,导致后续文件错误匹配到前面的作者。需求是让无全文的作者对应单元格显示No File,同时支持自动爬取279页数据。
问题根源
原代码分别独立收集所有作者列表和所有全文链接列表,未建立作者与对应文件的关联关系。当存在无全文的作者时,两个列表长度不一致,使用zip合并时会截断较短的列表,直接导致数据错位。
修改后的代码
from bs4 import BeautifulSoup import requests import time import csv def scrape_page(page_url): """爬取单页的作者与对应文件信息""" page_data = [] r = requests.get(page_url) soup = BeautifulSoup(r.content, 'html.parser') # 找到包含所有文章条目的容器 content_td = soup.find('td', class_='testo_normale') # 按段落分割每个文章条目(每个文章对应一个<p>标签) article_paragraphs = content_td.find_all('p') for p in article_paragraphs: # 提取作者 author_tag = p.find('i') author = author_tag.text.strip() if author_tag else 'Unknown Author' # 检查当前条目是否有全文链接 fulltext_link = p.find('a', class_='testo_normale_rosso', href=lambda x: x and 'fulltext.php?abst=' in x) file_name = f"file {len(page_data)+1}" if fulltext_link else 'No File' page_data.append([author, file_name]) time.sleep(1) # 控制请求频率,避免反爬 return page_data def main(): all_data = [] base_url = 'https://www.deswater.com/vol.php?vol={}&oth=1|1-3|January|2009' # 爬取1到279页 for page_num in range(1, 280): print(f"正在爬取第 {page_num} 页...") page_url = base_url.format(page_num) try: page_data = scrape_page(page_url) all_data.extend(page_data) time.sleep(2) # 页面间增加间隔,更友好 except Exception as e: print(f"爬取第 {page_num} 页失败: {str(e)}") continue # 保存到CSV row_head = ['Author', 'File Name'] with open('deswater_data.csv', 'w', encoding='utf_8_sig', newline='') as csvfile: csvwriter = csv.writer(csvfile) csvwriter.writerow(row_head) csvwriter.writerows(all_data) print("数据已保存到 deswater_data.csv") if __name__ == "__main__": main()
关键改进说明
- 关联作者与文件:不再分开收集两个列表,而是遍历每个文章条目,在同一个条目内提取作者并检查是否有全文链接,确保一一对应。
- 支持多页爬取:通过循环生成1到279页的URL,批量爬取所有页面数据。
- 错误处理:增加异常捕获,避免单页爬取失败导致整个程序终止。
- 请求频率控制:在条目和页面间增加延迟,降低对目标网站的服务器压力,减少被反爬的风险。
- CSV保存优化:直接收集每行数据,无需额外处理列表分割,逻辑更清晰。
内容的提问来源于stack exchange,提问作者user17356493
相关产品推荐
相关产品推荐

