scrapy爬虫这个东西我就很少作介绍了,总之是一个很好用的Python爬虫库,且关于scrapy也有较多的教程。这篇文章记录一下我我的的项目规划和天坑心得。javascript
一般来讲,咱们执行了scrapy startproject example
后就会建立这样的一个文件结构,大体以下:java
├── example │ ├── __init__.py │ ├── __pycache__ │ ├── items.py │ ├── middlewares.py │ ├── pipelines.py │ ├── settings.py │ └── spiders │ ├── __init__.py │ └── __pycache__ └── scrapy.cfg
咱们一般写爬虫都是在spiders里写爬虫解析规则,以及编写数据存储程序。python
咱们首先来看爬虫程序,最基本是如下这个样子:web
import scrapy from sqlalchemy import distinct class ExampleSpider(scrapy.Spider): name = 'example_spider' allowed_domains = [] start_urls = [ 'https://www.example.com' ] def parse(self,response): pass
这样的一个基本爬虫,只要配置好start_urls,在这里写上咱们想要去爬的URL,能够编写不少个,start_urls是一个数组。而后执行scrapy crawl example_spider
就会自动去爬数据了。这里的parse
方法是继承父类scrapy.Spider的解析方法,此处没有作任何结果解析以及存储。sql
在这个地方,其实咱们要注意一点是,ExampleSpider这个类名咱们能够瞎姬霸命名,咱们在调用scrapy crawl [爬虫名]
的时候,这个爬虫名是根据这个类里的name
属性来的,此处的name
为example_spider
,因此咱们在执行的时候就是:scrapy crawl example_spider
。固然在具体的编写过程当中我我的建议是不要瞎姬霸命名,按照业务逻辑来。chrome
再回头看我上面所展现的文件夹结构,随着业务的增加,咱们极可能编写个成百上千的爬虫,那么每一个爬虫都放到spiders
一个文件夹里的话,要理清的话就要花大力气了,而实际上,在spiders
其实能够建立任意的子文件夹进行逻辑上的分类,执行crawl
的时候,会自动去遍历路径找到咱们制定的爬虫,至于你编写了哪些爬虫,一样能够经过crapy list
列出来。segmentfault
分页爬虫技巧,其实在搜索引擎上都能找到,并且在segmentfault上都能搜到相应的解答,主要就在parse
方法中判断条件或者说找到下一页的URL,而后用协程yield
一下scrapy.Request
就能够了,也就是用协程方式手动执行一下scrapy的Request
方法,对于Request具体的返回,我没有深刻看源代码研究,大概是在scrapy的底层再次作了必定的处理,实际的请求并非Request
类发起的。数组
这里要结合一些缘由来进行说明。浏览器
因此从上面两方面来讲,咱们在本身写的爬虫类中加上一个类属性download_delay
,如dom
import scrapy from sqlalchemy import distinct class ExampleSpider(scrapy.Spider): download_delay = 1 # 1s钟发起一次请求,当前爬虫执行过程当中,对任何位置的Reqeust都有效 name = 'example_spider' allowed_domains = [] start_urls = [ 'https://www.example.com' ] def parse(self,response): pass
另外就是在settings.py
设置
DEFAULT_REQUEST_HEADERS = { 'user-agent' : 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3423.2 Mobile Safari/537.36' }
一个这样的header头,模拟手机浏览器。
在作爬虫的时候,很是重要的一点就是错误日志的记录,一般来讲咱们在settings.py
中配置如下两个参数:
LOG_LEVEL = 'DEBUG' LOG_FILE = './log.log' # 错误日志记录文件及路径
一般来讲,咱们最好是把LOG_LEVEL
设置为DEBUG
,也就是说,咱们把全部的调试信息都输入到错误日志中进行记录,方便检查编写爬虫过程当中可能出现的任何问题,尽量的确保每一个环节不出错。
若是没有意识到错误日志的重要性,在写爬虫的过程当中只能抓瞎了,我是踩了好几回大坑才有过这种觉悟。
数据存储,我我的用的是sqlalchemy
,是一个很强大的库,我我的也作了些基础的封装,使用起来更方便。
数据存储一方面多是在parse
方法中进行解析后处理,另外的话,parse能够进行统一解析,而后在close
进行所有批量存储,主要看具体的业务逻辑状况。
最坑爹的问题就是要千万保证数据来源性的可靠,必定要反复对比其来源数据是否有问题,否则出现咱们所医疗以外的数据状况,极可能找不到缘由。
举个例子,咱们在作分页处理的时候,已经到末尾页了,一般就能够断定结束爬虫了,但假设在某一个数据分类下,这个末尾页其实有个连接指向了其余分类页,然而在web浏览器中经过javascript
程序禁止了跳转,而后就陷入了不断循环的取数据的过程当中或者重复取了数据。固然这个是一个不太可能存在的可能状况,不过我在编写的过程当中就遇到过相似的问题,在处理的时候千万要保证数据解析和来源数据的可靠性,切记切记!