Scrapy笔记07- 内置服务
Scrapy使用Python内置的的日志系统来记录事件日志。
日志配置
1 | LOG_ENABLED = true |
使用也很简单
1 | import logging |
如果在Spider里面使用,那就更简单了,因为logger就是它的一个实例变量
1 | import scrapy |
发送email
Scrapy发送email基于Twisted non-blocking IO 实现,只需几个简单配置即可。
初始化
1 | mailer = MailSender.from_settings(settings) |
发送不包含附件
1 | mailer.send(to=["someone@example.com"], subject="Some subject", body="Some body", cc=["another@example.com"]) |
配置
1 | MAIL_FROM = 'scrapy@localhost' |
同一个进程运行多个Spider
1 | import scrapy |
分布式爬虫
Scrapy并没有提供内置的分布式抓取功能,不过有很多方法可以帮你实现。
如果你有很多个spider,最简单的方式就是启动多个Scrapyd
实例,然后将spider分布到各个机器上面。
如果你想多个机器运行同一个spider,可以将url分片后交给每个机器上面的spider。比如你把URL分成3份
1 | http://somedomain.com/urls-to-crawl/spider1/part1.list |
然后运行3个Scrapyd
实例,分别启动它们,并传递part参数
1 | curl http://scrapy1.mycompany.com:6800/schedule.json -d project=myproject -d spider=spider1 -d part=1 |
防止被封的策略
一些网站实现了一些策略来禁止爬虫来爬取它们的网页。有的比较简单,有的相当复杂,如果你需要详细了解可以咨询商业支持
下面是对于这些网站的一些有用的建议:
- 使用user agent池。也就是每次发送的时候随机从池中选择不一样的浏览器头信息,防止暴露爬虫身份
- 禁止Cookie,某些网站会通过Cookie识别用户身份,禁用后使得服务器无法识别爬虫轨迹
- 设置download_delay下载延迟,数字设置为5秒,越大越安全
- 如果有可能的话尽量使用Google cache获取网页,而不是直接访问
- 使用一个轮转IP池,例如免费的Tor project或者是付费的ProxyMesh
- 使用大型分布式下载器,这样就能完全避免被封了,只需要关注怎样解析页面就行。一个例子就是Crawlera
如果这些还是无法避免被禁,可以考虑商业支持