You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

网页爬取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 01:15:31