python 关于函数递归调用自己

爬取b站博人传

每页短评20个,页数超过1000页,

代码如下

import requests
import json
import csv
def main(start_url):
    headers = {‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36‘,}
    res = requests.get(url=start_url,headers=headers).content.decode()
    data = json.loads(res)
    try:
        data = data[‘result‘][‘list‘]
    except:
        print(‘-----------‘)
    cursor = re.findall(‘"cursor":"(\d+)",‘,res)

    for i in data:
        mid = i[‘author‘][‘mid‘]
        uname = i[‘author‘][‘uname‘]
        content = i[‘content‘]
        content= content.strip()
        try:
            last_index_show = i[‘user_season‘][‘last_index_show‘]
        except:
            last_index_show = None

        print(mid,uname,content,last_index_show)
        print(‘------------------------‘)

        with open(‘borenzhuan_duanping.csv‘, ‘a‘, newline=‘‘,encoding=‘utf-8‘)as f:
            writer = csv.writer(f)
            writer.writerow([mid,uname,content,last_index_show])

    if cursor:
        next_url = ‘https://bangumi.bilibili.com/review/web_api/short/list?media_id={}&folded=0&page_size=20&sort=0&sort=0&cursor=‘.format(id) + cursor[0]
        main(next_url)
    else:
        print(‘抓取完成‘)

if __name__ == ‘__main__‘:

    zhuye_url = ‘https://www.bilibili.com/bangumi/media/md5978/‘
    id = re.findall(‘md(\d+)‘, zhuye_url)[0]
    start_url = ‘https://bangumi.bilibili.com/review/web_api/short/list?media_id={}&folded=0&page_size=20&sort=0&cursor=‘.format(id)

    main(start_url)

在爬取过程中发现,每当递归到999会发生异常

RecursionError: maximum recursion depth exceeded in comparison

这个函数在递归自身是发生的异常

只需要在程序开头添加

import sys
sys.setrecursionlimit(100000)

防止内存爆炸

原文地址:https://www.cnblogs.com/zengxm/p/10972537.html

时间: 2024-10-22 07:19:18

python 关于函数递归调用自己的相关文章

函数递归调用过程中的调用堆栈的情况

为了加深对函数递归调用过程中的理解,本Demo程序特意在VS2008 C#控制台程序实现了阶乘的计算功能,用于观察函数递归调用过程中的调用堆栈的情况. 源码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace RecursiveTset { class Program { //阶乘的定义:n!=n*(n-1)!,特别的,1!=1:0!=1 //阶乘的实

函数-递归调用

一.什么是递归调用 递归调用:在函数调用过程中,直接或间接地调用了函数本身,这就是函数的递归调用1.递归的优点 递归函数的优点是定义简单,逻辑清晰.理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰. 使用递归函数需要注意防止栈溢出.在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧.由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出.可以试试fact(1000): 2.递归的缺点 解

(十七)python 3 函数递归

递归函数 即自己调用自己,递归中可以函数自身调用自身,但是使用时类似于条件循环一样,要有递归的终止条件 优点:使用递归时,常常可以让代码更加简洁 缺点:递归会占用比较多的内存,当递归次数比较多时,性能就会降低,因此不建议多使用递归 递归特性: # 1. 必须有一个明确的结束条件 # 2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少 # 3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,

shell函数递归调用实现目录的对比拷贝

目的与需求: 在移植时,需要将根文件系统rootfs1中的新增内容合入rootfs2,但不能覆盖rootfs2中原有的东西.即只能比较两个文件系统的异同,将1中比2中多出来的东西移到2中. 难点: 目录中若有相同的子目录,也要使得子目录满足上述需求. 点睛之笔: shell 递归调用, 借鉴二叉树的深度优先遍历. 实操: 1 #!/bin/bash 2 3 cpdifffile() 4 { 5 6 DIR1=$1 7 DIR2=$2 8 files1=`ls $DIR1` 9 #files2=`

python学习 -函数---递归--模块(os)--时间操作

#函数补充# 位置参数 def hello (name,sex)# 默认值参数 def hello (countyu = 'china')# def send_report(*args) 可变参数.参数组 不是必填,不限制个数,传入后保存为元组 #*args, # 1.不是必填参数 # 2.不限制参数的个数 # 3.传入多个参数的时候他把参数放到一个元组里面# def send_report(*args):# print('发邮件')# print(args)# send_report()# s

python基础--函数递归

#递归特性: # 1.必须要有一个明确的结束条件 #2.每次进入更深一层递归时,问题规模相比上次递归都应有所减少 #3.递归效率不高,递归层次过多会导致栈溢出 def calc(n): print(n) if int(n / 2)==0: #// 取整 # /取商 #% 取余 #此处int是取整,商小于1的时候取整结果为0 return n#return返回结果 return calc(int(n / 2))#执行calc(int(n / 2))---->等待return n返回结果--->最

函数递归调用

int main(int argc, const char * argv[]) { f(1,1,1000); return 0; } void f(int a,int b,int n) { if (a<n) { printf("%d\n",a); a=a+b; f(b,a,n); } else { printf("stop\n"); } }

C新手求助函数递归调用的理解!!很急!!

102klj寐滦宜陨咏腊<http://weibo.com/p683p410p/230927983046756163919872> wn8h3a揽埔悄状鼗埠<http://weibo.com/p108p588p/230927983024178431004672> wii6dd秆院郴罕幻脊<http://weibo.com/p753p931p/230927982698091037593600> qa0qw9醇桓娜赜凡诜<http://weibo.com/lwncwQ

JavaScript函数之实际参数对象(arguments) / callee属性 / caller属性 / 递归调用 / 获取函数名称的方法

函数的作用域:调用对象 JavaScript中函数的主体是在局部作用域中执行的,该作用域不同于全局作用域.这个新的作用域是通过将调用对象添加到作用域链的头部而创建的(没怎么理解这句话,有理解的亲可以留言告诉我, 谢谢).因为调用对象是作用域链的一部分,所以在函数体内可以把这个对象属性作为变量来访问. 调用对象的属性包括:用var声明的局部变量,函数形参,还有一种特殊的属性arguments 函数的实际参数:实际参数对象 arguments对象,用来引用实际参数对象.函数的arguments对象并