@
saximi 1. 这是看需求的,__init__方法的意义就是在于初始化。MyAgentMiddleware 中的__init__编写的意义在于记录我的 user_agent 的数目,方便后面的逻辑中使用 random 的随机方法。
2. 哈哈,这个是手误,原本打算用类似于
pipelines.py 中 MongoDBPipeline 的类初始化方法的,但是觉得直接写__init__方法更简便。
3. 我这里没有 return 语句实际上就是 return 了 None。
引用:如果其返回 None,Scrapy 将继续处理该 request,执行其他的中间件的相应方法,直到合适的下载器处理函数(download handler)被调用, 该 request 被执行(其 response 被下载)。
也就是我返回 None 的话,会继续按照
settings.py 的配置按顺序执行其他 Downloader Middleware。假如返回了 Response 对象,则会直接到达 spider 中 call_back 对应的方法进行返回的解析了。
4. 会有顺序,顺序就是
settings.py 中的优先级(数字)。为了爬虫群功能清晰,所以不同作用的功能分成不同的 Middleware 了。有的时候某个 Middleware 是某个爬虫特异需要的,那样子就可以做爬虫内配置去启用或者关闭 Middleware。有点拼乐高的意思。
像你说的合在一个类并非不行,只是不好。
5. 我认为开始爬虫的时候 spider 就是被开启的。你可以在 open_spider 方法调试输出,被调用的次数并不多。另外可以参考一下核心 API 状态收集器(Stats Collector) API。