Scrapy笔记07- 内置服务
2024-10-16 23:05:02
Scrapy笔记07- 内置服务
Scrapy使用Python内置的的日志系统来记录事件日志。 日志配置
LOG_ENABLED = true
LOG_ENCODING = "utf-8"
LOG_LEVEL = logging.INFO
LOG_FILE = "log/spider.log"
LOG_STDOUT = True
LOG_FORMAT = "%(asctime)s [%(name)s] %(levelname)s: %(message)s"
LOG_DATEFORMAT = "%Y-%m-%d %H:%M:%S"
使用也很简单
import logging
logger = logging.getLogger(__name__)
logger.warning("This is a warning")
如果在Spider里面使用,那就更简单了,因为logger就是它的一个实例变量
import scrapy class MySpider(scrapy.Spider): name = 'myspider'
start_urls = ['http://scrapinghub.com'] def parse(self, response):
self.logger.info('Parse function called on %s', response.url)
发送email
Scrapy发送email基于Twisted non-blocking IO实现,只需几个简单配置即可。
初始化
mailer = MailSender.from_settings(settings)
发送不包含附件
mailer.send(to=["someone@example.com"], subject="Some subject", body="Some body", cc=["another@example.com"])
配置
MAIL_FROM = 'scrapy@localhost'
MAIL_HOST = 'localhost'
MAIL_PORT = 25
MAIL_USER = ""
MAIL_PASS = ""
MAIL_TLS = False
MAIL_SSL = False
同一个进程运行多个Spider
import scrapy
from scrapy.crawler import CrawlerProcess class MySpider1(scrapy.Spider):
# Your first spider definition
... class MySpider2(scrapy.Spider):
# Your second spider definition
... process = CrawlerProcess()
process.crawl(MySpider1)
process.crawl(MySpider2)
process.start() # the script will block here until all crawling jobs are finished
Scrapy并没有提供内置的分布式抓取功能,不过有很多方法可以帮你实现。分布式爬虫
如果你有很多个spider,最简单的方式就是启动多个Scrapyd
实例,然后将spider分布到各个机器上面。
如果你想多个机器运行同一个spider,可以将url分片后交给每个机器上面的spider。比如你把URL分成3份
http://somedomain.com/urls-to-crawl/spider1/part1.list
http://somedomain.com/urls-to-crawl/spider1/part2.list
http://somedomain.com/urls-to-crawl/spider1/part3.list
然后运行3个Scrapyd
实例,分别启动它们,并传递part参数
curl http://scrapy1.mycompany.com:6800/schedule.json -d project=myproject -d spider=spider1 -d part=1
curl http://scrapy2.mycompany.com:6800/schedule.json -d project=myproject -d spider=spider1 -d part=2
curl http://scrapy3.mycompany.com:6800/schedule.json -d project=myproject -d spider=spider1 -d part=3
防止被封的策略
一些网站实现了一些策略来禁止爬虫来爬取它们的网页。有的比较简单,有的相当复杂,如果你需要详细了解可以咨询商业支持
下面是对于这些网站的一些有用的建议:
- 使用user agent池。也就是每次发送的时候随机从池中选择不一样的浏览器头信息,防止暴露爬虫身份
- 禁止Cookie,某些网站会通过Cookie识别用户身份,禁用后使得服务器无法识别爬虫轨迹
- 设置download_delay下载延迟,数字设置为5秒,越大越安全
- 如果有可能的话尽量使用Google cache获取网页,而不是直接访问
- 使用一个轮转IP池,例如免费的Tor project或者是付费的ProxyMesh
- 使用大型分布式下载器,这样就能完全避免被封了,只需要关注怎样解析页面就行。一个例子就是Crawlera
如果这些还是无法避免被禁,可以考虑商业支持
最新文章
- [转载]我的Java后端书架 (2016年暖冬4.0版)
- Android开发学习——搭建开发环境
- 构建单页Web应用
- unique() 去重函数
- hibernate连接数据库,进行操作的步骤
- .net设计模式 - 单例模式
- 智能合约语言 Solidity 教程系列6 - 结构体与映射
- C语言博客作业--函数
- 利用并查集+贪心解决 Hdu1232
- Shell执行*.sql
- [20190305]删除审计登录信息不适合使用logrotate.txt
- Hibernatede 一对多映射配置
- 2019南昌网络赛-M(二分)
- 重建索引解决mssql表查询超时的问题
- .Net Standard HttpClient封装Htt请求常用操作整理
- ZCU板级调试Bug记录
- JavaScript示例
- 【java】对象赋值给另一个对象
- yii2.0增删改查
- HTML5 学习总结(三)——本地存储(localStorage、sessionStorage、WebSqlDataBase、IndexedDB)
热门文章
- windows远程复制中断无法复制
- axios详解
- Kubernetes Dashboard 安装与认证
- DataSet 反射转换成 List<;T>;
- SpringBoot第八篇:整合MyBatis-Generator
- Spring Cloud灰度发布之Nepxion Discovery
- K8s 学习者绝对不能错过的最全知识图谱(内含 58个知识点链接)
- vue引入bootstrap、jquery
- 【ELK】elasticsearch中使用脚本报错:scripts of type [inline], operation [update] and lang [groovy] are disabled
- java设计模式结构型模式