在线体验
https://scrapydweb.herokuapp.com/
网络拓扑图
注册帐号
Heroku
访问 https://signup.heroku.com/ 注册免费账号 (注册页面需要调用 google recaptcha 人机验证, 登录页面也需要科学地进行上网, 访问 App 运行页面则没有该问题), 免费账号最多可以创建和运行 5 个 App.
Redis Labs(可选)
访问 https://redislabs.com/ 注册免费账号, 提供 30MB 存储空间, 用于下文通过 https://github.com/rmax/scrapy-redis 实现分布式爬虫.
通过浏览器部署 Heroku App
访问 一键部署 Scrapyd App.(注意更新页面表单中 Redis 服务器的主机, 端口和密码)
重复第 1 步完成 4 个 Scrapyd App 的部署, 假设应用名称为 svr-1 , svr-2 , svr-3 和 svr-4
访问 一键部署 ScrapydWeb App, 取名 myscrapydweb
(可选) 点击 页面中的 Reveal Config Vars 按钮相应添加更多 Scrapyd server, 例如 KEY 为 SCRAPYD_SERVER_2 , VALUE 为 svr-2.herokuapp.com:80#group2
访问 https://myscrapydweb.herokuapp.com/
跳转 部署和运行分布式爬虫 章节继续阅读.
自定义部署
安装工具
Heroku CLI https://devcenter.heroku.com/articles/heroku-cli
Python client for Redis https://pypi.org/project/redis/ : 运行 pip install Redis 命令即可.
下载配置文件
新开一个命令行提示符:
- Git clone https://github.com/my8100/scrapyd-cluster-on-heroku
- cd scrapyd-cluster-on-Heroku
登录 Heroku
- Heroku login
- # outputs:
- # Heroku: Press any key to open up the browser to login or q to exit:
- # Opening browser to https://cli-auth.heroku.com/auth/browser/12345-abcde
- # Logging in... done
- # Logged in as username@gmail.com
创建 Scrapyd 集群
新建 Git 仓库
- cd scrapyd
- Git init
- # explore and update the files if needed
- Git status
- Git add .
- Git commit -a -m "first commit"
- Git status
部署 Scrapyd App
- Heroku apps:create svr-1
- Heroku Git:remote -a svr-1
- Git remote -v
- Git push Heroku master
- Heroku logs --tail
- # Press ctrl+c to stop logs outputting
- # Visit https://svr-1.herokuapp.com
添加环境变量
设置时区
- # python -c "import tzlocal; print(tzlocal.get_localzone())"
- Heroku config:set TZ=Asia/Shanghai
- # Heroku config:get TZ
添加 Redis 账号 (可选, 详见 scrapy_redis_demo_project.zip 中的 settings.py)
- Heroku config:set REDIS_HOST=your-Redis-host
- Heroku config:set REDIS_PORT=your-Redis-port
- Heroku config:set REDIS_PASSWORD=your-Redis-password
重复上述第 2 步和第 3 步完成余下三个 Scrapyd App 的部署和配置: svr-2 , svr-3 和 svr-4
创建 ScrapydWeb App
新建 Git 仓库
- cd ..
- cd scrapydweb
- Git init
- # explore and update the files if needed
- Git status
- Git add .
- Git commit -a -m "first commit"
- Git status
部署 ScrapydWeb App
- Heroku apps:create myscrapydweb
- Heroku Git:remote -a myscrapydweb
- Git remote -v
- Git push Heroku master
添加环境变量
设置时区
Heroku config:set TZ=Asia/Shanghai
添加 Scrapyd server(详见 scrapydweb 目录下的 scrapydweb_settings_v8.py)
- Heroku config:set SCRAPYD_SERVER_1=svr-1.herokuapp.com:80
- Heroku config:set SCRAPYD_SERVER_2=svr-2.herokuapp.com:80#group1
- Heroku config:set SCRAPYD_SERVER_3=svr-3.herokuapp.com:80#group1
- Heroku config:set SCRAPYD_SERVER_4=svr-4.herokuapp.com:80#group2
访问 https://myscrapydweb.herokuapp.com/
部署和运行分布式爬虫
上传 demo 项目, 即 scrapyd-cluster-on-Heroku 目录下的压缩文档 scrapy_redis_demo_project.zip
将种子请求推入 mycrawler:start_urls 触发爬虫并查看结果
- In [1]: import Redis # pip install Redis
- In [2]: r = Redis.Redis(host='your-redis-host', port=your-Redis-port, password='your-redis-password')
- In [3]: r.delete('mycrawler_redis:requests', 'mycrawler_redis:dupefilter', 'mycrawler_redis:items')
- Out[3]: 0
- In [4]: r.lpush('mycrawler:start_urls', 'http://books.toscrape.com', 'http://quotes.toscrape.com')
- Out[4]: 2
- # wait for a minute
- In [5]: r.lrange('mycrawler_redis:items', 0, 1)
- Out[5]:
- [b'{"url":"http://quotes.toscrape.com/","title":"Quotes to Scrape","hostname":"d6cf94d5-324e-4def-a1ab-e7ee2aaca45a","crawled":"2019-04-02 03:42:37","spider":"mycrawler_redis"}',
- b'{"url":"http://books.toscrape.com/index.html","title":"All products | Books to Scrape - Sandbox","hostname":"d6cf94d5-324e-4def-a1ab-e7ee2aaca45a","crawled":"2019-04-02 03:42:37","spider":"mycrawler_redis"}']
总结
优点
免费
可以爬 Google 等外网
可扩展 (借助于 ScrapydWeb https://github.com/my8100/scrapydweb )
缺点
注册和登录需要科学地进行上网
Heroku App 每天至少自动重启一次并且重置所有文件, 因此需要外接数据库保存数据, 详见
GitHub 开源
Heroku
来源: https://www.cnblogs.com/my8100/p/scrapyd-cluster-on-heroku.html