文章目录
前言
写下这条标体,总是有种吹牛*的感觉,哈哈~~
不过你若认真看完,一定会对你有所启发的。从此升职加薪,当上总经理,出任CEO,迎娶白富美,走上人生巅峰也不是不可能的。嘎嘎嘎嘎~~~
程序整体设计(重点!!!决定程序扩展性)
1. 当程序过大,应拆分为各个部分,分为各个层面,程序可分为如下几层:
- 主函数——用于主要的两个模块调度
- 进程模块——设置启动进程数,生成队列信息
- 接口调度模块——获取队列信息,调用接口函数
- 接口函数——网络访问最小单元(应将网络访问和content处理分开)
2,除分层以外,有其他辅助模块:
- 极验接口——获取极验解密
- 代理接口——获取代理ip
- Job,key_data——作为工作对象,贯穿整个程序,传递信息
- 更改cookie模块——在任意网络请求出错都可调用(此项目更改ip,cookie就无法使用)
- 网络请求模块——进行网络请求,对请求的结果进行处理,如代理无法连接,content不符合等问题处理
- 数据库连接各个模块——对各个数据表进行信息提取及赋值
- Log——日志文件,当出现错误进行记录,此程序运用的比较少,后期当程序可以完美运行,应该在各个错误抛出处添加日志,知晓问题所在
错误信息的处理(重点!!!决定程序稳定性)
在大型程序开发过程将会遇到非常多错误问题,若一个错误出现,将导致整个程序无法使用,每次启动程序也将有一定的成本,所以,在开发之前要事先预测一下将会遇到的问题。如下列出常见问题及解决:
1,网络请求出错,这是大型爬虫错误信息最多也是最关键的问题。同时也分为如下几种情况。
- 代理失效,无法访问主机。解决办法:
- 直接等待,直到方法自动返回错误信息。
- 获取ip剩余使用时间,赋值给timeout,自动停止。
- 网络波动,无法访问。解决办法:
撰写一个单独函数,每个网络请求调用此函数。函数内部实现网络请求失败,等待一段时间再次重新获取,如此循环,或者设置循环阀值。 - 本机电脑打开fiddler抓包工具也可能导致网络请求失败。
2,数据库连接失败:
撰写单独函数,失败等待几秒,重新获取或提交,循环如此,设置阈值
3,处理response的content失败,有如下几种情况:
- 每一种场景常见问题:在”辅助模块”的”网络请求模块”中设置储物信息捕获,若信息不对,进行相应处理
- 个别场景出现问题:使用try包裹所有对content处理的部分。并打印错误信息。方便后期调试,改进。(比如公示项目中,程序完成后content返回信息中又出现其他不同错误信息,一段时间后才发现)
4,程序莫名停止,死亡问题:初步猜测是因为内存溢出
使用代理问题及解决
- 使用代理需要考虑到在任何时候都可能会中断,连接不上的情况——在网络请求模块处理
- 访问代理服务器也有可能失败——加入错误捕获,递归运行
- 短时间内获取代理可能IP可能是一样的,没有变化——设置代理ip队列,当前使用进程队列,可使用外部消息队列(当前出现问题ip池无法使用)
程序打印信息问题
- 当程序输出过多将会造成程序控制台卡死,甚至程序卡死。
解决:将所有打印信息使用“输出到日志”方法统一管理,一定时间清空一下控制台。 - 打印函数传入的信息也应该仔细思考如何传入。
- 传入信息应当标明当前进程类型,进程号,具体信息,当前时间。具体信息应当包含当前所要打印的特定信息,而其他通用信息应当保存在job中
write_log(job, (‘进程’, job.count_process, ': ',‘网络中断’))
可以直接传入job和’网络中断’,而其他信息可放入job中。
创建数据库必须加入信息
- Id
- 状态
- 创建时间
- 完成时间
出现js解析问题
对接猿人学接口,处理后的js文件更容易处理
(下方为项目其他问题,可不用看)
程序待优化
- 每个网络请求的header都是独立的,当出现错误就得全部改变——可单独设置创建一个模块对头部信息进行处理
- 程序中当被设定为黑客攻击只是停顿5秒继续获取,实际上被设定为黑客后就不会再获取到信息,应该更改为重新获取代理,再获取网络信息
- Log使用地方较少,应多加入
- 时间不对,将造成大量获取url失败情况:修改程序,当天无ip后将定时在第二天中午十一点启动。
- Log日志传入参数太多问题:各个进程一样的参数直接在log中设置。
程序总体设计不足
1,接口模块作为最小单元,应该只有网络访问,不应该有数据处理,功能不够明确。