爬虫项目运行在服务端后,我们无法及时了解项目是否正在运行,还是因为异常已经结束运行,考虑到项目的成本,因此我们在项目中增加了邮件功能,在项目运行结束、或者是异常结束的情况下通知开发者。下面简单介绍在项目中使用flask-mail来实现发送邮件的功能。
flask-mail的安装
1 | pip3 install flask-email |
It's never too old to learn.
对于基本数据类型默认关键字是: atomic, readwrite, assign
对于普通的OC对象: atomic, readwrite, strong
@property = interface + ivar(实例变量/成员变量) + setter/getter
@property 属性有两个关键词 @synthesize 和 @dynamic。默认是 @synthesize。
@synthesize 如果你没有手动实现 @setter 和 @getter 方法,编译器会自动为你加上这两个方法。
@dynamic 告诉编译器属性的 @setter 和 @getter 方法由用户自己实现,不自动生成。
以下设置基于 selenium==3.6.0
1 | from selenium import webdriver |
1 | # 谷歌无头模式 |
Chrome可设置的参数列表List of Chromium Command Line Switches
平均速度最快的排序算法是?
排序方法 | 平均情况 | 最好情况 | 最坏情况 | 辅助空间 | 稳定性 |
---|---|---|---|---|---|
冒泡排序 | O(n^2) | O(n) | O(n^2) | O(1) | 稳定 |
选择排序 | O(n^2) | O(n^2) | O(n^2) | O(1) | 不稳定 |
插入排序 | O(n^2) | O(n) | O(n^2) | O(1) | 稳定 |
希尔排序 | O(n*log(n))~O(n^2) | O(n^1.3) | O(n^2) | O(1) | 不稳定 |
堆排序 | O(n*log(n)) | O(n*log(n)) | O(n*log(n)) | O(1) | 不稳定 |
归并排序 | O(n*log(n)) | O(n*log(n)) | O(n*log(n)) | O(n) | 稳定 |
快速排序 | O(n*log(n)) | O(n*log(n)) | O(n^2) | O(1) | 不稳定 |
基数排序 | O(n+r) | O(n+r) | O(n+r) | O(n+r) | 稳定 |
Objective-C 是一个动态语言,它扩展了 C 语言,并加入了面向对象特性和 Smalltalk 式的消息传递机制。这个扩展的核心是一个用 C 和 编译语言 写的 Runtime 库,它是面向对象和动态机制的基石。理解 OC 的 Runtime 机制可以帮我们更好的了解这个语言,还可以帮助我们从系统层面解决项目中的一些设计或技术问题。
Runtime有两个版本: Modern 和 Legacy。这两个版本的最大区别是当你更改一个类的实例变量的布局时,Legacy 版本需要重新编译它的子类。Modern版本运行在iOS 和 macOS 10.5 之后的 64 位程序中。在这之前的32位程序采用的是 Legacy 版本。
OC 从三种不同的层级上与 Runtime 系统进行交互:
1 | 1. 通过 OC 源代码 |
scrapy 是一款 python 开发的 web 抓取框架,用于抓取 web 站点并从页面中提取结构化数据。scrapy 还可以用于数据挖掘、检测和自动化测试等。
scrapy 主要由以下组件组成,它们分别是调度器(Scheduler)、调度中间件(Scheduler Middewares)、下载器(Downloader)、下载器中间件(Downloader Middlewares)、爬虫(Spider)、爬虫中间件(Spider Middlewares)、管道(Item Pipeline) 和 Scrapy引擎(Scrapy Engine)。
框架的核心部分,它控制着调度器、下载器、爬虫和管道,相当于计算机的 CPU,控制整个流程。
用于处理爬虫提取的实体,主要功能是验证和清除不需要的信息,并持久化信息。
用户自己定制的部分,用于从特定的网站中提取自己需要的信息。
介于scrapy引擎和爬虫之间的中间件,主要处理爬虫响应输入和请求输出。包含url重定向、url长度、请求深度、请求错误等处理。
用于高速的从网络上获取资源,是建立在 twisted 这个高效的异步模型上。
介于引擎和下载器之间的框架,主要是处理引擎和下载器之间的请求和响应,可以在此处配置ip代理迟、user_agent,cookie 等反爬策略。
用于接收请求并压入队列中,在引擎再次请求时返回,由它决定下一个要抓取的网址是什么,同时负责去重网址。
scrapy发出请求后的整个流程如下:
1.首先发送出的 request 经Scrapy引擎交给调度器(Scheduler)
2.调度器排序处理后,由Scrapy引擎经下载器中间件到下载器(Downloader)
3.下载器向互联网发送请求,并接收响应,再由Scrapy引擎经过爬虫中间件交给 Spiders
4.spiers处理response,提取数据后,再由Scrapy引擎交给管道(Item Pipeline)
5.提取新的request 经Scrapy引擎交给调度器(Scheduler)并重复上述流程
有时候需要根据项目的实际需求向spider传递参数来控制spider的运行方式。
ep:
1 | 1. 根据用户提交的url来控制spider爬取的网站。 |
Spider参数通过 crawl 命令的 -a 选项来传递,比如:
1 | scrapy crawl xxx -a parameter=xxxxxx |