使用了一段时间的editplus之后,觉得很不方便,用pycharm又觉得很麻烦。
于是就让我找到了两个对新手很友好的编辑器。一个是Anaconda自带的Spyder(功能强大,除了一些我目前不用的操作外,不亚于pycharm),还有一个则是jupyter(没有自动补全,不过非常好用),两个均是免费,百度就可以下载。
补充:Anaconda是一个第三方工具包,如果要概括一下它的好处的话:我装scrapy只用了一个pip命令,没有任何报错。其实装很多库都是这样,特别适合新手。(它有很多的内置库,而且能解决大部分依赖关系)
——————————————————————————————————————————————
最近想爬一个小型网站,目前已经拿到的没有去重的URL有30万个(URL已经去重,但不同的URL可能得到同样的信息),我要进一步拿到URL的详细信息,但因为网站服务器抗压有限(前面的30万个url是因为网站有api,我直接拿到的),基于爬虫程序员的素质,我只能每爬一个URL就sleep几秒,这样就需要很长的一段时间了。(还是淘宝、知乎等大网站好,人家基本是你随便爬,在我的反爬虫下爬崩了我的网站算你强)
这样长时间的工作放在服务器在合适不过了,成功和出错都让它写日志文件,而且我直接简单粗暴的直接捕获所有异常,只要出错就在日志文件中写入错误信息和错误出现时爬取的URL。如果只是这样我还需要每天去看一下日志文件,有点麻烦。
那就让他发邮件吧,每爬取5000个URL让它向我发送一封邮件,内容只需要写入爬取的进度和日志文件就行(想知道怎么用python发邮件的直接百度即可,非常简单)。
当我高高兴兴的把它放在服务器后台运行的时候,发现它每隔一段时间就自己退出了。这怎么回事,我明明捕获了所有异常,而且30万的URL(URL是存储在MongoDB的)并没有爬完,这个退出间隔的时间还比较短,只爬取了不到1000的URL,百度一下发现是迭代mongoset.find()出现的问题,需要在find里加入no_cursor_timeout = True这个参数,可是运行一段时间程序还是自动关闭,不过爬取的URL变成两三千了,这是pymongo的bug吗。
这远远满足不了我的要求,突然想到可以用另一个程序来检测这个程序是否还在运行,如果是就继续检测,不是则获取进度重新运行。这个要实现的话,用多进程就行,具体代码如下:
while True:
i = get_i()
p = Process(target=main, args=(i,))
p.start()
p.join()
send_mail('程序已经退出! 正在重新启动')
因为join是阻塞函数,所以程序运行到p.join()的时候就停在那里等子进程退出,如果退出就执行下面的内容。这样基本就完成了服务器持续运行爬虫了。
当然,还有另一种方法,可以用signal.signal()捕获子进程发出的SIGCHLD信号,这个信号是子进程退出时必然会发出的信号。有兴趣的可以学习一下。
现在发现原来有很多第三方工具可以管理进程,比如Supervisor就可以做到这种功能,这些工具的功能很完善,比自己写的程序好很多。所以还是直接使用第三方工具吧。
补充:在Windows测试遇到一个坑,MongoDB占用的内存不断增大,不会自动释放。唯一想到的解决方案只能每隔一段时间手动清理内存.(搜到一个工具,Mem Reduct),自动清理内存。不过只支持Windows。