python脚本自启动和定时启动

搭建IP代理池的时候,我发现这些拨号VPS并不稳定,拨号次数多了需要重启才能继续拨号。这时候需要定时或者按需重启系统并启动代理脚本。

定时可以用crontab,但是脚本自启动用crontab有不便之处:设置环境变量等不太方便。最终我用crontab定时重启,Python脚本自启动用了service,即在/etc/init.d/新建一个service.sh,

# coding=utf-8
#!/bin/bash
export PATH="$PATH:/root/anaconda3/bin:/root/anaconda3/condabin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"
nohup /root/anaconda3/bin/python /root/anaconda3/lib/python3.8/site-packages/adslproxy/sender/sender.py >> /root/proxy_reboot.log 2>&1 &
# 脚本自启动需要加载环境变量,因为脚本依赖一些环境变量,然后rc.local里写入bash service.sh即可,系统启动时service.sh会自启动
# crontab:
*/10 * * * * /usr/sbin/ntpdate cn.pool.ntp.org | logger -t NTP
@reboot adsl-start
#@reboot export PATH="$PATH:/root/anaconda3/bin:/root/anaconda3/condabin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"
*/60 * * * * /root/anaconda3/bin/python /root/anaconda3/lib/python3.8/site-packages/adslproxy/sender/reboot.py >> /root/reboot.log 2>&1 &
#@reboot nohup /root/anaconda3/bin/python /root/anaconda3/lib/python3.8/site-packages/adslproxy/sender/sender.py >> /root/proxy_reboot.log 2>&1 &

脚本自启动最关键的是环境变量的加载,很多时候我们的脚本会从另外一些.py import 类或者函数,有时也会依赖于环境变量,所以记得环境变量的加载。

另外,脚本自启动后会发送邮件提醒,非常方便。

scrapy反爬中间件

这两天爬取京东商城的商品信息和评论,试过几种方案,后来采用了读取json接口的方式。不过这个方案有个问题,每一个商品调用几个json接口,IP很容易被封。我只用了两台ADSL VPS做了代理池,虽然没有测试,但是我知道会经常拨到重复的IP,做代理池时我只是针对拨的IP和上次IP比较,如果相同再次重播,并没有把它放到redis池里去重,主要因为机器太少,拨号浪费时间,每次拨号都有5-6秒损失。

且看IP被封的表现,就是弹出登录页面,页面response:

IP被封:window.location.href=’https://passport.jd.com/uc/login’

我的解决办法就是在中间件中针对这个做出判断,IP被封就从redis池里删除,这样不会耽误其他线程,不然很多线程都会失败。

开始测试时可能是我的IP池比较新,单机每秒可以获取10+商品信息,所以单机日进百万商品sku是没问题的。但是,用了几个小时后就不行了,表现就是被封的频率越来越大,最后从30秒拨号减到10秒拨号一次。实际上,如果IP池足够大,单机一天也能采集几百万,而且还是很普通的服务器。