2301_79215836 2025-08-20 14:24 采纳率: 0%
浏览 11

python小说爬虫爬取不全

每次代码运行爬取的小说章节不一样有的时候多有的时候少并且不能全部爬取下来
希望有人帮忙解决
代码如下:

img

 importrequests
 from bs4 import BeautifuLSoup
 num=1
 while True:
    #伪装
    wZ=fuser-agent':Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,ike Gecko) Chrome/139.0.0.0 Safari/537.36Edg/
    #网址
    UrL=f'https://www.shuhai.com/read/57004/num.html
    #请求
    res=requests.get(ur,headers=Wz)
    ifres.status_code!=200:
         break
    else:
         soup=BeautifulSoup(res.text,                                    features:lxmL')
         #文章名
         title=soup.find_al(name:div'class_="chapter-nametext-es")
         #print(title)
         iftitle:
             comtent=titelo].get_text(strip=Trueelse:
             print(未找到div目标)
             break
        print(comtent)
        #文章
        p= soup.find_all('p')
         #print(p)
        #因为p现在还是列表所以要将文本先拿出来再保存
         foriinp:
             WZ=i.get_text(strip=True)+'n
             #print(wZ)
             withopen(f·跑腿爸爸/fcomtent.text,a+l,encoding=utf-8')asf:
                 f.write(wZ)
        num +=1
  • 写回答

4条回答 默认 最新

  • 檀越@新空间 2025-08-20 14:25
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    你的Python小说爬虫在运行时出现章节不一致、爬取不全的问题,这可能是由于以下几个原因导致的:


    一、问题分析

    1. URL构造错误num.html 中的 num 应该是动态变化的,但你的代码中没有正确构造 URL。
    2. 请求头(headers)格式错误User-Agent 的格式不正确,可能影响服务器识别。
    3. 网页结构解析错误:你使用的CSS选择器或标签名可能与实际网页结构不符。
    4. 文件写入方式错误:使用 a+ 模式可能导致重复写入,且文件名不规范。
    5. 异常处理不足:缺少对网络请求失败、页面结构变化等异常情况的处理。

    二、解决方案

    1. 修复URL构造逻辑

    确保每次循环都访问正确的章节页,例如:https://www.shuhai.com/read/57004/1.html, https://www.shuhai.com/read/57004/2.html 等。

    2. 正确设置 User-Agent

    修正 User-Agent 字符串,使其符合标准格式。

    3. 使用正确的HTML解析方法

    确保使用 BeautifulSoup 正确解析 HTML 结构,并查找对应的内容。

    4. 文件写入优化

    避免重复写入,使用 w 模式打开文件,并为每章生成独立文件。

    5. 异常处理和调试

    加入异常处理机制,便于排查问题。


    三、修改后的完整代码

    import requests
    from bs4 import BeautifulSoup
    
    # 设置User-Agent
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/'
    }
    
    base_url = 'https://www.shuhai.com/read/57004/'
    
    num = 1
    while True:
        url = f"{base_url}{num}.html"
        
        try:
            res = requests.get(url, headers=headers, timeout=10)
            if res.status_code != 200:
                print(f"第 {num} 章节请求失败,状态码:{res.status_code}")
                break
            
            soup = BeautifulSoup(res.text, 'lxml')
            
            # 获取章节标题
            title_div = soup.find('div', class_='chapter-name text-es')
            if not title_div:
                print(f"未找到第 {num} 章节标题")
                break
            
            title = title_div.get_text(strip=True)
            print(f"正在爬取:{title}")
            
            # 获取章节内容
            content_p = soup.find_all('p')
            if not content_p:
                print(f"第 {num} 章节无内容")
                num += 1
                continue
            
            # 写入文件
            with open(f'跑腿爸爸/{title}.txt', 'w', encoding='utf-8') as f:
                for p in content_p:
                    line = p.get_text(strip=True)
                    if line:  # 避免空行
                        f.write(line + '\n')
            
            num += 1
        
        except Exception as e:
            print(f"发生异常:{e}")
            break
    

    四、重点说明

    1. URL构造:使用 f"{base_url}{num}.html" 动态生成每个章节的URL。
    2. User-Agent 格式:确保格式正确,如 Mozilla/5.0 (Windows NT 10.0; Win64; x64)
    3. HTML 解析:使用 BeautifulSoup(res.text, 'lxml') 更稳定。
    4. 文件写入:使用 'w' 模式,避免重复写入;每章单独保存为一个 .txt 文件。
    5. 异常处理:通过 try-except 块捕获异常,防止程序崩溃。

    五、建议

    • 如果网站有反爬机制,可以考虑添加 time.sleep() 控制请求频率。
    • 可以使用 logging 模块替代 print(),更方便调试。
    • 如果需要抓取更多章节,可先手动访问网页查看最大章节号,再设定循环上限。

    如果你能提供目标网站的具体页面结构(如 HTML 代码),我可以进一步帮你优化 CSS 选择器。

    评论

报告相同问题?

问题事件

  • 创建了问题 8月20日