Scrapy 是两个用作截取、预测和抽取统计数据的 Python 库。它能协助他们加速截取中文网站上的统计数据并将其储存到邻近地区文档或统计资料库中。
1. 加装 Scrapy:采用 pip 加装 Scrapy 库,指示为
pip install scrapy
2. 建立工程项目:采用配置文档辅助工具建立两个 Scrapy 工程项目,指示为
scrapy startproject project_name
3. 建立食腐:在工程项目产品目录下,采用配置文档辅助工具建立两个食腐,指示为
scrapy genspider spider_name website_domain
import scrapyclassSpiderName(scrapy.Spider): name = “spider_name” start_urls = [http://website_domain.com/page1,http://website_domain.com/page2,# … ]defparse(self, response): page = response.url.split(“/”)[-2] filename = quotes-%s.html % pagewith open(filename, wb) as f: f.write(response.body)
5. 运行食腐:采用配置文档辅助工具运行食腐,指示为
scrapy crawl spider_name
1. 自定义中间件:能在请求/响应处理过程中实现自定义逻辑
import loggingclassRequestLogMiddleware:def__init__(self, logger=None): self.logger = logger or logging.getLogger(__name__)@classmethoddeffrom_crawler(cls, crawler):return cls(crawler.settings.get(LOGGER))defprocess_request(self, request, spider): self.logger.info(f“Processing request {request}”)returnNonedefprocess_response(self, request, response, spider): self.logger.info(f“Processing response {response} for request {request}”)return response
要采用自定义中间件,需要在工程项目的 settings.py 文档中配置该中间件
# settings.pyDOWNLOADER_MIDDLEWARES = {my_project.middlewares.RequestLogMiddleware: 543,}
2. 自动抽取链接:能采用 CrawlSpider 和 SgmlLinkExtractor 来自动抽取链接并跟踪页面
from scrapy.linkextractors import LinkExtractorrules = [ Rule(LinkExtractor(allow=rpage/\d+/), follow=True), Rule(LinkExtractor(allow=ritem/\d+/), callback=parse_item)]
这里有两个 Rule,第两个 Rule 将所有以 page/ 开头的链接视为分页链接,并且打算将它们传递给链接抽取组件并跟随它们。第二个 Rule 将所有以 item/ 开头的链接视为工程项目链接,并且将它们发送给 parse_item 回调函数以进行处理。
3. 统计数据储存:能采用 Scrapy 自带的 Feed Exporters 将统计数据导出到 CSV、JSON 或 XML 等格式
要采用内置的 Feed 储存,需要配置储存格式和储存路径,例如:
# settings.pyFEED_FORMAT = “csv”FEED_URI = “output.csv”
要采用第三方持久层,需要加装相应的统计资料库驱动,并且在配置文档中设置连接信息和管道,例如:
# settings.pyITEM_PIPELINES = {scrapy.exporters.MongodbItemExporter: 1}MONGODB_URI = “mongodb://localhost:27017”MONGODB_DB =“scrapy_db”
在食腐类中,能采用 yield 关键字生成需要储存的统计数据,例如:
# myspider.pyimport scrapyclassMySpider(scrapy.Spider): name = “my_spider”defparse(self, response):# 解析统计数据 item = {“data”: “parsed data”}# 储存统计数据yield item
4. 高效下载:Scrapy 的下载器能采用并发请求加速统计数据截取
# settings.pyCONCURRENT_REQUESTS = 16DOWNLOAD_TIMEOUT = 180
其中,CONCURRENT_REQUESTS 控制同时执行请求的数量,DOWNLOAD_TIMEOUT 控制下载超时的时间。
5. 自动重试请求:Scrapy 能自动重试请求,以防止因网络问题导致统计数据丢失。
# settings.pyRETRY_ENABLED = TrueRETRY_TIMES = 3RETRY_HTTP_CODES = [500, 502, 503, 504, 400, 403, 404, 408]