Scrapy笔记07- 内置服务

Scrapy应用Python内置的的日志体系来记载事件日志。日志配置

1
2
3
4
5
6
7
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"

应用也很简略

1
2
3
import logging
logger = logging.getLogger(__name__)
logger.warning("This is a warning")

如果在Spider里面应用,那就更简略了,由于logger就是它的一个实例变量

1
2
3
4
5
6
7
8
9
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实现,只需几个简略配置便可。

初始化

1
mailer = MailSender.from_settings(settings)

发送不包括附件

1
mailer.send(to=["[email protected]"], subject="Some subject", body="Some body", cc=["[email protected]"])

配置

1
2
3
4
5
6
7
MAIL_FROM = "[email protected]"
MAIL_HOST = "localhost"
MAIL_PORT = 25
MAIL_USER = ""
MAIL_PASS = ""
MAIL_TLS = False
MAIL_SSL = False

同一个过程运行多个Spider

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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份

1
2
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参数

1
2
3
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

如果这些还是没法避免被禁,可以斟酌商业支撑