新手爬虫DAY1

复制代码

这个错误信息表明在你的Python程序中,re.search() 函数没有找到预期的匹配项,因此返回了 None。当你尝试在 None 对象上调用 group(1) 方法时,Python 抛出了一个 AttributeError

具体来说,错误发生在 pc.py 文件的第6行,你试图从一个字符串 text_response 中提取一个数字,这个数字位于 actual_page:52 (\d+), //真实页数 这个模式的匹配结果中。但是,re.search() 没有找到这个模式,所以返回了 None

要解决这个问题,你可以采取以下几个步骤:

  1. 检查 text_response 内容

    确保 text_response 包含你期望搜索的字符串。可能的情况是,text_response 的内容不是你预期的,或者格式有变。

  2. 验证正则表达式

    确保你的正则表达式 actual_page:52 (\d+), //真实页数 是正确的。这里的 \d+ 是用来匹配一个或多个数字的,但前面的 actual_page:52 看起来像是硬编码的数字,这可能不是通用的匹配方式。如果 actual_page 后面的数字(这里是52)是变化的,那么你的正则表达式需要调整以匹配变化的数字。

  3. 处理 None 返回值

    在调用 group(1) 之前,你应该检查 re.search() 的返回值是否为 None。如果是 None,你可以添加一些错误处理逻辑,比如打印一个错误消息或者设置一个默认值

  4. 调整正则表达式以匹配更多情况

    如果 actual_page 后面的数字是变化的,你可以使用更通用的模式,如 actual_page:\d+ (\d+), //真实页数

通过上述步骤,你应该能够定位问题并修正它。如果问题仍然存在,可能需要进一步检查 text_response 的来源和格式。

复制代码
代码:import requests, json, re, time, urllib.request


def getParameter(url):  # 获取文档参数
    text_response = requests.get(url=url, headers=headers).text
    actual_page = int(re.search('actual_page:52 (\d+), //真实页数', text_response).group(1))  # 页数
    aid = re.search('aid:456032948 (\d+), //解密后的id', text_response).group(1)  # aid
    view_token = re.search('view_token:fTywuwW@c2Kh7QLBNdnrdxk0il5mF58mQT57vGVOPDc= \'(.*?)\'', text_response).group(1)  # view_token
    print('actual_page:', actual_page, '\naid:', aid, '\nview_token:', view_token)
    return actual_page, aid, view_token


def requests_data(parameter, page):  # 请求数据
    url = 'https://openapi.book118.com/getPreview.html'
    params = {
        'project_id': '1',
        'aid': parameter[1],
        'view_token': parameter[2],
        'page': page,
    }
    response = requests.get(url=url, headers=headers, params=params).text
    json_data = re.search('jsonpReturn\((.*?)\);', response).group(1)  # 使用正则表达式所需数据
    data = json.loads(json_data)['data']
    # if data.get(str(page)) == '':  # 根据需求使用
    #     print('数据加载失败,重新发出请求')
    #     time.sleep(1)
    #     return requests_data(parameter, page)
    # time.sleep(1)
    return get_data(data)


def get_data(data):  # 下载数据
    for i in data.items():  # i[0]为页数,i[1]为网址
        img_url = 'https:' + i[1]
        # urllib.request.urlretrieve(url=img_url, filename=r'D:/yuanChuangLi/{}.png'.format(i[0]))  # 下载图片
        print(i[0], img_url)


if __name__ == '__main__':
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'}
    text_url = input('输入网址:')
    parameter = getParameter(text_url)
    for page in range(1, parameter[0], 6):
        requests_data(parameter, page)
相关推荐
爱吃泡芙的小白白10 分钟前
爬虫学习——使用HTTP服务代理、redis使用、通过Scrapy实现分布式爬取
redis·分布式·爬虫·http代理·学习记录
Auroral1566 小时前
【Python爬虫详解】第五篇:使用正则表达式提取网页数据
爬虫
一个天蝎座 白勺 程序猿8 小时前
Python爬虫(4)CSS核心机制:全面解析选择器分类、用法与实战应用
css·爬虫·python
丰锋ff15 小时前
爬虫学习总结
爬虫
西柚小萌新19 小时前
【Python爬虫基础篇】--4.Selenium入门详细教程
爬虫·python·selenium
橘猫云计算机设计19 小时前
springboot基于hadoop的酷狗音乐爬虫大数据分析可视化系统(源码+lw+部署文档+讲解),源码可白嫖!
数据库·hadoop·spring boot·爬虫·python·数据分析·毕业设计
??? Meggie1 天前
Selenium 怎么加入代理IP,以及怎么检测爬虫运行的时候,是否用了代理IP?
爬虫·tcp/ip·selenium
用户199701080181 天前
深入解析淘宝商品详情 API 接口:功能、使用与实践指南
大数据·爬虫·数据挖掘
西柚小萌新1 天前
【Python爬虫实战篇】--Selenium爬取Mysteel数据
开发语言·爬虫·python
Auroral1561 天前
【Python爬虫详解】第四篇:使用解析库提取网页数据——XPath
爬虫