scrapy爬虫使用总结——技巧和天坑

简介

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

基础spider

咱们首先来看爬虫程序,最基本是如下这个样子: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属性来的,此处的nameexample_spider,因此咱们在执行的时候就是:scrapy crawl example_spider。固然在具体的编写过程当中我我的建议是不要瞎姬霸命名,按照业务逻辑来。chrome

再回头看我上面所展现的文件夹结构,随着业务的增加,咱们极可能编写个成百上千的爬虫,那么每一个爬虫都放到spiders一个文件夹里的话,要理清的话就要花大力气了,而实际上,在spiders其实能够建立任意的子文件夹进行逻辑上的分类,执行crawl的时候,会自动去遍历路径找到咱们制定的爬虫,至于你编写了哪些爬虫,一样能够经过crapy list列出来。segmentfault

分页爬技巧

分页爬虫技巧,其实在搜索引擎上都能找到,并且在segmentfault上都能搜到相应的解答,主要就在parse方法中判断条件或者说找到下一页的URL,而后用协程yield一下scrapy.Request就能够了,也就是用协程方式手动执行一下scrapy的Request方法,对于Request具体的返回,我没有深刻看源代码研究,大概是在scrapy的底层再次作了必定的处理,实际的请求并非Request类发起的。数组

经常使用配置

这里要结合一些缘由来进行说明。浏览器

  • 一般来讲,移动端的数据更好爬,咱们能够用chrome的开发者工具模拟移动端浏览器,而后看移动端的数据交互形式以及移动端HTML数据格式。
  • 另外就是咱们爬的时候一般为了防止被封IP,不能太频繁,通常是间隔1s钟去取一次数据这样子。

因此从上面两方面来讲,咱们在本身写的爬虫类中加上一个类属性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程序禁止了跳转,而后就陷入了不断循环的取数据的过程当中或者重复取了数据。固然这个是一个不太可能存在的可能状况,不过我在编写的过程当中就遇到过相似的问题,在处理的时候千万要保证数据解析和来源数据的可靠性,切记切记!

相关文章
相关标签/搜索