一个利用Scrapy框架实现的完整的爬取www.beautyleg7.com网站所有图片的爬虫
软件架构说明
pip install pywin32
pip install mysql-connector-python
pip install Pillow
pip install PyMySQL
pip install redis
pip install Scrapy
pip install scrapyd
pip install scrapyd-client
pip install SQLAlchemy
pip install pymongo
pip install gevent
利用Linux系统的crontab进行定时调度:
首先创建定时调度脚本beautyleg7-schedule.sh:
#!/usr/bin/env bash
curl -u yidasanqian:yidasanqian. http://127.0.0.1:80/scrapyd/schedule.json -d project=beautyleg7 -d spider=Beautyleg7Spider
然后配置定时任务:
使用以下命令配置:
crontab -e
添加内容:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""
HOME=/home/yidasanqian
0 1 * * * $HOME/beautyleg7-schedule.sh >> /var/log/scrapyd/beautyleg7-schedule.log
最后让配置生效:
service crond reload
爬取过程出现异常中断的解决方案:
- 爬取前记录当前爬取的主题页面的URL,存储到Redis key:URL,value:is_persisted(取值为0或1,默认为0)。
- 当记录已存储到数据库后,设置Redis对应key的value为1(1表示已持久化到数据库)。
- 若步骤1和2中间出现异常导致程序异常中断停止,则恢复时从Redis取得上次爬取的主题页面URL重新爬取。
重复爬取主题页面URL的解决方案:
- Redis存储爬取最后一页的页码和最后一条主题URL key:最后一页页码:最后一条主题url,value:is_persisted(取值为0或1,默认为0)。
- 每次爬取时检查最后一页是否和Redis中存储的key相同,若不相同则更新key并设置值为0,否则继续下一步。
- 当Redis中存储的key的value为1时,开始判断重复的主题URL数,当超过预设的阈值时停止爬取。
- Fork 本项目
- 新建 Feat_xxx 分支
- 提交代码
- 新建 Pull Request