Taco_chen 2024-07-28 10:01 采纳率: 0%
浏览 17

Python:百度vip文档爬取报错,如何解决?

各位大lao们,please!
我想爬取百度文库的vip内容,但是他报错了,报错内容如下:

Traceback (most recent call last):
  File "C:\Users\煎饼狗子\Documents\Python\百度vip.py", line 59, in <module>
    get_num(url)
  File "C:\Users\煎饼狗子\Documents\Python\百度vip.py", line 14, in get_num
    "md5sum": result.group(1),
AttributeError: 'NoneType' object has no attribute 'group'

源代码

import requests
import re
import json
headers = {
    "User-Agent": "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Mobile Safari/537.36"
}  # 模拟手机
 
 
def get_num(url):
    response = requests.get(url, headers=headers).text
    result = re.search(
        r'&md5sum=(.*)&sign=(.*)&rtcs_flag=(.*)&rtcs_ver=(.*?)".*rsign":"(.*?)",', response, re.M | re.I)  # 寻找参数
    reader = {
        "md5sum": result.group(1),
        "sign": result.group(2),
        "rtcs_flag": result.group(3),
        "rtcs_ver": result.group(4),
        "width": 176,    
        "type": "org",
        "rsign": result.group(5)
    }
 
    result_page = re.findall(
        r'merge":"(.*?)".*?"page":(.*?)}', response)  # 获取每页的标签
    doc_url = "https://wkretype.bdimg.com/retype/merge/" + url[29:-5]  # 网页的前缀
    n = 0
    for i in range(len(result_page)):  # 最大同时一次爬取10页
        if i % 10 == 0:
            doc_range = '_'.join([k for k, v in result_page[n:i]])
            reader['pn'] = n + 1
            reader['rn'] = 10
            reader['callback'] = 'sf_edu_wenku_retype_doc_jsonp_%s_10' % (
                reader.get('pn'))
            reader['range'] = doc_range
            n = i
            get_page(doc_url, reader)
    else:  # 剩余不足10页的
        doc_range = '_'.join([k for k, v in result_page[n:i + 1]])
        reader['pn'] = n + 1
        reader['rn'] = i - n + 1
        reader['callback'] = 'sf_edu_wenku_retype_doc_jsonp_%s_%s' % (
            reader.get('pn'), reader.get('rn'))
        reader['range'] = doc_range
        get_page(doc_url, reader)
 
 
def get_page(url, data):
    response = requests.get(url, headers=headers, params=data).text
    response = response.encode(
        'utf-8').decode('unicode_escape')  # unciode转为utf-8 然后转为中文
    response = re.sub(r',"no_blank":true', '', response)  # 清洗数据
    result = re.findall(r'c":"(.*?)"}', response)  # 寻找文本匹配
    result = '\n'.join(result)
    print(result)
 
if __name__ == '__main__':
    #url = "https://wenku.baidu.com/view/aa31a84bcf84b9d528ea7a2c.html"
    url = "https://wenku.baidu.com/view/3e1bb7c3fad6195f302ba6c8.html?rec_flag=default&sxts=1562641356908"
    get_num(url)

有缘还请请教,万分感谢!

  • 写回答

3条回答 默认 最新

  • 专家-司宇[在线] 2024-07-28 10:07
    关注

    引自免费微信小程序:皆我百晓生

    从报错信息来看,问题出在尝试从返回的文本中搜索特定的模式并获取组时,返回的文本中没有找到匹配的模式,因此返回了None,而你在尝试调用None的group方法时出现了错误。具体来说,问题出在以下这行代码中:

    result = re.search(r'&md5sum=(.*)&sign=(.*)&rtcs_flag=(.*)&rtcs_ver=(.*?)".*rsign":"(.*?)",', response, re.M | re.I)
    

    你需要检查你的正则表达式是否正确匹配了你想要抓取的数据的格式。此外,由于网络环境和网页结构的变化,返回的数据可能也会发生变化,因此正则表达式可能需要更新以适应新的数据格式。你可以尝试以下步骤来解决这个问题:

    1. 检查你的正则表达式是否正确匹配了你想要抓取的数据的格式。你可以尝试在Python中使用正则表达式的测试工具来验证你的正则表达式是否正确。如果你的正则表达式不能正确匹配你试图抓取的数据,那么你需要更新你的正则表达式以匹配新的数据格式。
    2. 由于网页结构可能会发生变化,你可能需要定期检查你的代码以确保它能够正常工作。如果网页结构发生了变化,你可能需要更新你的代码以适应新的结构。这可能包括更新你的正则表达式、URL或其他参数。
    3. 你可能需要使用更复杂的网络爬虫技术来抓取数据,例如使用Selenium或Pyppeteer来模拟浏览器行为,这样可以避免由于反爬虫策略导致的问题。这种方法通常比使用requests和正则表达式更复杂,但也可以更有效地处理动态网页和数据反爬虫策略。

    此外,从你提供的代码中看,这段代码可能是用于爬取百度文库VIP内容的。我要提醒你的是,爬取网站内容可能涉及到版权问题,你需要确保你有权进行这样的操作。同时,频繁的爬取可能会对网站服务器造成压力,可能会导致你的IP被封禁。在进行网络爬虫操作时,请务必遵守网站的爬虫政策和相关法律法规。

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 7月28日
  • 创建了问题 7月28日

悬赏问题

  • ¥15 前台多人编辑时怎么让每个人保存刷新都互不干扰
  • ¥20 如何用Python删除单元格内连续出现的重复词?
  • ¥15 WangEditor嵌入到geeker-admin中,回车没有办法换行
  • ¥30 stm32f103c8t6制作万能红外遥控器
  • ¥15 有人会fastcrud写前端页面吗
  • ¥15 如何解除Uniaccess管控
  • ¥15 微信小程序跳转关联公众号
  • ¥15 Java AES 算法 加密采用24位向量报错如何处理?
  • ¥15 使用X11可以找到托盘句柄,监控到窗口点击事件但是如何在监听的同时获取托盘中应用的上下文菜单句柄
  • ¥45 字符串操作——数组越界问题