可爬取上亿条数据的网络框架设计及注意事项

本文探讨了大型程序的设计原则,强调了程序扩展性和稳定性的重要性。通过分层架构和错误处理策略,如网络请求错误、数据库连接失败、内容处理异常等,提高程序的健壮性。同时,提出了日志管理、代理问题解决方案以及内存管理建议,以应对程序运行中的挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

写下这条标体,总是有种吹牛*的感觉,哈哈~~

不过你若认真看完,一定会对你有所启发的。从此升职加薪,当上总经理,出任CEO,迎娶白富美,走上人生巅峰也不是不可能的。嘎嘎嘎嘎~~~

程序整体设计(重点!!!决定程序扩展性)

1. 当程序过大,应拆分为各个部分,分为各个层面,程序可分为如下几层:

  1. 主函数——用于主要的两个模块调度
  2. 进程模块——设置启动进程数,生成队列信息
  3. 接口调度模块——获取队列信息,调用接口函数
  4. 接口函数——网络访问最小单元(应将网络访问和content处理分开)

2,除分层以外,有其他辅助模块:

  1. 极验接口——获取极验解密
  2. 代理接口——获取代理ip
  3. Job,key_data——作为工作对象,贯穿整个程序,传递信息
  4. 更改cookie模块——在任意网络请求出错都可调用(此项目更改ip,cookie就无法使用)
  5. 网络请求模块——进行网络请求,对请求的结果进行处理,如代理无法连接,content不符合等问题处理
  6. 数据库连接各个模块——对各个数据表进行信息提取及赋值
  7. Log——日志文件,当出现错误进行记录,此程序运用的比较少,后期当程序可以完美运行,应该在各个错误抛出处添加日志,知晓问题所在

错误信息的处理(重点!!!决定程序稳定性)

在大型程序开发过程将会遇到非常多错误问题,若一个错误出现,将导致整个程序无法使用,每次启动程序也将有一定的成本,所以,在开发之前要事先预测一下将会遇到的问题。如下列出常见问题及解决:

1,网络请求出错,这是大型爬虫错误信息最多也是最关键的问题。同时也分为如下几种情况。

  1. 代理失效,无法访问主机。解决办法:
    1. 直接等待,直到方法自动返回错误信息。
    2. 获取ip剩余使用时间,赋值给timeout,自动停止。
  2. 网络波动,无法访问。解决办法:
    撰写一个单独函数,每个网络请求调用此函数。函数内部实现网络请求失败,等待一段时间再次重新获取,如此循环,或者设置循环阀值。
  3. 本机电脑打开fiddler抓包工具也可能导致网络请求失败。

2,数据库连接失败:

​ 撰写单独函数,失败等待几秒,重新获取或提交,循环如此,设置阈值

3,处理response的content失败,有如下几种情况:

  1. 每一种场景常见问题:在”辅助模块”的”网络请求模块”中设置储物信息捕获,若信息不对,进行相应处理
  2. 个别场景出现问题:使用try包裹所有对content处理的部分。并打印错误信息。方便后期调试,改进。(比如公示项目中,程序完成后content返回信息中又出现其他不同错误信息,一段时间后才发现)

4,程序莫名停止,死亡问题:初步猜测是因为内存溢出

使用代理问题及解决

  1. 使用代理需要考虑到在任何时候都可能会中断,连接不上的情况——在网络请求模块处理
  2. 访问代理服务器也有可能失败——加入错误捕获,递归运行
  3. 短时间内获取代理可能IP可能是一样的,没有变化——设置代理ip队列,当前使用进程队列,可使用外部消息队列(当前出现问题ip池无法使用)

程序打印信息问题

  1. 当程序输出过多将会造成程序控制台卡死,甚至程序卡死。
    解决:将所有打印信息使用“输出到日志”方法统一管理,一定时间清空一下控制台。
  2. 打印函数传入的信息也应该仔细思考如何传入。
  3. 传入信息应当标明当前进程类型,进程号,具体信息,当前时间。具体信息应当包含当前所要打印的特定信息,而其他通用信息应当保存在job中
    write_log(job, (‘进程’, job.count_process, ': ',‘网络中断’))
    可以直接传入job和’网络中断’,而其他信息可放入job中。

创建数据库必须加入信息

  1. Id
  2. 状态
  3. 创建时间
  4. 完成时间

出现js解析问题

对接猿人学接口,处理后的js文件更容易处理

(下方为项目其他问题,可不用看)

程序待优化

  1. 每个网络请求的header都是独立的,当出现错误就得全部改变——可单独设置创建一个模块对头部信息进行处理
  2. 程序中当被设定为黑客攻击只是停顿5秒继续获取,实际上被设定为黑客后就不会再获取到信息,应该更改为重新获取代理,再获取网络信息
  3. Log使用地方较少,应多加入
  4. 时间不对,将造成大量获取url失败情况:修改程序,当天无ip后将定时在第二天中午十一点启动。
  5. Log日志传入参数太多问题:各个进程一样的参数直接在log中设置。

程序总体设计不足

1,接口模块作为最小单元,应该只有网络访问,不应该有数据处理,功能不够明确。

<think>好的,用户想知道如何用Python判断目录是否存在并创建它。首先,我需要回忆一下Python中处理文件和目录的模块,应该是os或者pathlib。记得os模块有os.path.exists和os.makedirs函数,可以检查路径是否存在以及创建目录。而pathlib是Python 3.4之后引入的,用起来更面向对象,可能更简洁。 接下来,用户可能需要两种方法的示例,所以我要分别写os和pathlib的实现。比如,用os的话,先检查路径是否存在,如果不存在则创建。这里要注意,os.makedirs可以创建多级目录,而exist_ok参数在Python 3.2之后支持,避免目录存在时的异常。 然后是pathlib的方法,Path对象的mkdir方法也有parents和exist_ok参数,设置parents=True可以创建父目录,exist_ok=True避免异常。这样代码会更简洁。 另外,用户可能关心异常处理,比如权限问题或者其他错误,但用户的问题没有提到需要处理异常,所以可能暂时不需要深入。但最好还是提一下,比如在os.makedirs时如果目录被其他进程创建了,可能会有异常,但使用exist_ok=True就可以忽略。 还要注意路径字符串的正确性,比如使用正斜杠或反斜杠,在Windows下可能需要转义,但用Python的raw字符串或者双反斜杠处理。不过使用os.path.join或者pathlib可以自动处理路径分隔符,这样更安全。 现在检查是否有相关的引用内容。用户提供的引用中,引用[2]提到了shutil.rmtree删除目录,可能相关,但这里的问题是关于创建目录。引用[4]提到了批量处理脚本,可能涉及目录操作,但具体没有直接相关的信息。所以可能不需要引用这些内容,但如果有必要的话可以看看。比如,引用[2]中的错误可能是因为尝试删除文件而不是目录,所以确保用户创建的是目录而不是文件,但用户的问题主要是判断存在并创建,可能不需要处理删除的情况。 总结下来,步骤应该是:导入模块,检查路径是否存在,不存在则创建。给出两种方法,并说明推荐pathlib因为更现代。同时提到exist_ok参数的重要性,避免报错。可能还要提到跨平台兼容性,因为os和pathlib都能处理不同系统的路径。 最后生成相关问题,比如如何递归创建多级目录,检查是文件还是目录,处理权限问题,或者如何遍历目录。这些都与目录操作相关,能帮助用户进一步学习。</think>在Python判断目录是否存在并创建,可以通过`os`模块或`pathlib`模块实现。以下是具体方法: --- ### 方法1:使用`os`模块 通过`os.path.exists()`检查目录是否存在,若不存在则用`os.makedirs()`创建: ```python import os dir_path = "./my_directory" if not os.path.exists(dir_path): os.makedirs(dir_path) print(f"目录 {dir_path} 创建成功") else: print(f"目录 {dir_path} 已存在") ``` **注意**: - `os.makedirs()`支持递归创建多级目录,例如`dir_path = "./a/b/c"`。 - 添加`exist_ok=True`参数可避免目录存在时抛出异常: ```python os.makedirs(dir_path, exist_ok=True) ``` --- ### 方法2:使用`pathlib`模块(推荐) `pathlib`提供更简洁的面向对象路径操作: ```python from pathlib import Path dir_path = Path("./my_directory") dir_path.mkdir(parents=True, exist_ok=True) print(f"目录 {dir_path} 已存在或创建成功") ``` **参数说明**: - `parents=True`:自动创建父目录。 - `exist_ok=True`:目录存在时不报错。 --- ### 关键区别 | 功能 | `os`模块 | `pathlib`模块 | |--------------------|-----------------------|----------------------| | 路径操作 | 字符串形式 | 面向对象 | | 跨平台兼容性 | 需手动处理路径分隔符 | 自动适配操作系统 | | 递归创建目录 | 需手动拆分路径层级 | 通过`parents=True`实现 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值