scrapy使用心得(入门教程)

scrapy官网:https://doc.scrapy.org/en/latest/topics/settings.html

基本上没有什么教程可以媲美官方文档的,所有的教程不过是在解读官方文档。所以,如果你有耐心的话可以自己看官方文档。使用谷歌浏览器自带的谷歌翻译可以看得懂,不像python官方的文档,机翻出来基本天书。

关于各组件的功能,我觉得这个博客写的很好。可以看一下https://www.cnblogs.com/kongzhagen/p/6549053.html

安装指南

如果只是参考文档的做,绝对会报错。这个还是需要百度搜一下相关文章,他们会提供简单的安装方法。

[Scrapy初识]

(https://doc.scrapy.org/en/latest/intro/tutorial.html)

这个主要在讲解scrapy怎么爬取quotes.toscrape.com这个网站

  1. 首先创建项目:scrapy startproject tutorial。命令行执行,如果是Windows则是dos下执行,这条命令会创建一个scrapy文件目录。
  2. 目录结构先不理他,我们先在spiders目录创建一个爬虫文件,名称随意,比如就叫spider.py
  3. 在spider.py写入以下内容
import scrapy


class QuotesSpider(scrapy.Spider):
    name = "quotes"

    def start_requests(self):
        urls = [
            'http://quotes.toscrape.com/page/1/',
            'http://quotes.toscrape.com/page/2/',
        ]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        page = response.url.split("/")[-2]
        filename = 'quotes-%s.html' % page
        with open(filename, 'wb') as f:
            f.write(response.body)
        self.log('Saved file %s' % filename)

4.然后,在dos窗口cd到scrapy.cfg所在的目录,输入scrapy crawl quotes。
5.这样,一个简单的使用就完成了,我们所做的只是写了一些解析网页的代码。至于怎么抓取完全由scrapy来操作。

我们来说明以下我们写的那个文件的信息。

  • 文件名随意,如果整个scrapy只是抓取一个网站建议命名为spider.py。如果抓取多个网站可以用网站域名区分。
  • 继承于scrapy.Spider,必须继承scrapy下的爬虫类,一般是scrapy.Spider
  • name属性,爬虫的名称,运行的时候使用,比如上面的第四步命令的最后就是这个name的值
  • start_requests方法,默认调用的一个方法,主要写爬虫抓取的网站
  • parse方法,解析函数,接受一个response对象,这个对象是爬虫爬取网页生成的一个对象,包含网页结构。主要用于提取想要的数据

命令行工具

说一下我觉得有用的几个命令

  • 创建项目:scrapy startproject baidu
  • 创建爬虫:scrapy genspider spider www.baidu.com
  • 运行爬虫:scrapy crawl name [-o a.json]
  • 检查项目:scrapy check -l
  • 访问网页:scrapy view url
  • 测试提取:scrapy shell url
  • 查看版本:scrapy version [-v]

这没什么需要注意的,多用几次就知道是什么意思了。测试提取是在命令行解析数据,看看你的xpath能不能提取到数据。

爬虫

前面粗略的说了一下爬虫的几个属性和方法,现在我们全面一点

  • name:(属性,字符串),爬虫名称
  • allowed_domains: (类属性,列表),允许爬取的域名
  • start_urls: (属性,列表),默认开始爬取的URL列表
  • custom_settings:(属性,字典),包含配置信息,用于覆盖setting.py里的配置。比如这个爬虫我要使用特定的头信息等。
  • crawler:看起来功能强大,但只使用过crawler.settings.get获取settings.py里面的配置参数
  • settings:运行此蜘蛛的配置,暂时没弄懂有什么用
  • logger:(属性,怎么说呢),管理日志.使用的话self.logger.info(’’)
  • from_crawler: (类方法),需要加@classmethod修饰。目前已知的作用是获取参数并传递给__init__。不清楚目的如何,为什么不直接通过crawler获取参数。
  • start_requests:(方法),默认调用的一个方法。主要写爬虫爬的网站。
  • parse:(方法),当存在start_urls默认调用的解析函数
  • log:(方法),暂时没用过
  • closed:(方法),爬虫停止时调用的一个方法,一般用于资源的关闭

以上是scrapy.Spider的一些属性和方法。还有CrawlSpider、XMLFeedSpider、CSVFeedSpider 等就不多解释了。其实有Spider就足够解决大部分爬虫了。

选择器

scrapy封装了css选择器、xpath和正则。当然你要使用外部bs4和lxml只需导入对应包就行。
这个没什么需要说的,会用xpath和pyquery基本就会这个了

items

(https://doc.scrapy.org/en/latest/topics/items.html)
作用是从非结构化源中提取结构化数据。通俗的来说就是从网页提取你想要的信息,然后把这些信息打包成一个类似于字典的类。注意:提取是爬虫做的事,这个文件里面的类仅仅起着一个字典的作用。至于为什么需要这样一个类就不清楚了。写法很简单,看例子。

import scrapy

class MyItem(scrapy.Item):
    name = scrapy.Field()
    price = scrapy.Field()
    stock = scrapy.Field() 

管道

简单来说,就是将item的数据存储到数据库或文件中。另外,他还有一些其他的功能,比如清理HTML数据,去重数据等。
每个管道类都可以有四个方法,其中process_item必须有

  • process_item:用于写一些存储的代码
  • open_spider:打开蜘蛛时会调用此方法,用于打开资源
  • close_spider:蜘蛛关闭时调用此方法,用于关闭资源
  • from_crawler:同Spider的方法,一般用于获取setting.py的配置,这是为了便于修改参数,当然你完全可以不写这个方法,将一些参数直接定义为类属性。

存储到MongoDB的示例代码(这是官网照搬的):

import pymongo

class MongoPipeline(object):

    collection_name = 'scrapy_items'

    def __init__(self, mongo_uri, mongo_db):
        self.mongo_uri = mongo_uri
        self.mongo_db = mongo_db

    @classmethod
    def from_crawler(cls, crawler):
        return cls(
            mongo_uri=crawler.settings.get('MONGO_URI'),
            mongo_db=crawler.settings.get('MONGO_DATABASE', 'items')
        )

    def open_spider(self, spider):
        self.client = pymongo.MongoClient(self.mongo_uri)
        self.db = self.client[self.mongo_db]

    def close_spider(self, spider):
        self.client.close()

    def process_item(self, item, spider):
        self.db[self.collection_name].insert_one(dict(item))
        return item

Feed exports

当我们没有写数据库管道的时候,我们又想持久化数据。这样我们就可以通过 Feed exports的方式导出数据。支持json、json行、csv、xml、pickle、marshal。

使用也很简单,在抓取的时候加上-o参数。scrapy crawl quotes -o a.json

请求和响应

scrapy.Request(url [,callback,method =‘GET’,headers,body,cookies,meta,encoding =‘utf-8’,priority = 0,dont_filter = False,errback,flags ] )
参数:

  • url:请求的URL
  • callback:解析响应的函数
  • method:请求的类型:‘GET’、'POST’、'PUT’等
  • meta:用于传递参数给解析函数
  • body:请求体
  • headers:请求头,一般用不到
  • cookie:不解释
  • encoding:编码
  • priority:请求的优先级
  • dont_filter:是否过滤相同的URL
  • errback:出现异常时调用的处理方法

属性和方法:

  • url:请求的url
  • method:请求的类型
  • headers:请求头
  • body:参数传入的body
  • meta:参数传入的meta
  • copy():返回一个新请求,该请求是此请求的副本
  • replace():不知道干什么的

response(url [,status = 200,headers = None,body = b’’,flags = None,request = None ] )
一般是下载器返回给解析函数的响应体,所以参数不重要,直接看属性。

  • url:…
  • status:响应码
  • headers:响应头
  • body:响应体
  • request:此属性,仅仅在蜘蛛中间件可用。一般用于将失败和异常的请求重发。
  • meta:requets.meta传递过来的值
  • flags:暂时没用过
  • copy():返回一个副本
  • replace():不知道有什么用
  • urljoin():作用同urlparse.urljoin(response.url, url)
  • follow (): 参数同scrapy.Request。用于在解析函数中发出新的请求,可以替代scrapy.Request。而且,支持相对链接和a类型的选择器。

设置

scrapy允许在多个层面上修改设置。他们分别是(包含优先级):

  1. 命令行选项(最优先)
  2. 每蜘蛛的设置
  3. 项目设置模块
  4. 每个命令的默认设置
  5. 默认全局设置(优先级较低)

我们一般会修改2和3。2是通过爬虫的custom_settings属性来配置,3则是通过settings.py来配置。

常用配置:

  • CONCURRENT_ITEMS:默认100,项目管道并行处理的最大并发数量,一般不做修改。只有当你的爬虫获取数据的速度超过这个的时候再适当增加以提高速度。
  • CONCURRENT_REQUESTS:默认16,Scrapy下载程序将执行的最大并发(即同时)请求数。一般看代理去改动。
  • CONCURRENT_REQUESTS_PER_DOMAIN :默认8,对某个域名的最大并发数。不清楚上面那个优先级高,还是这个优先级高。
  • CONCURRENT_REQUESTS_PER_IP:默认0,对单个IP的最大并发数。一般只会修改上一个参数,而不会去改动这个。
  • DEFAULT_REQUEST_HEADERS :用于Scrapy HTTP请求的默认标头。这个依需求而定。
  • DEPTH_LIMIT:默认0,允许爬取的最大深度
  • DEPTH_PRIORITY ,默认0,大于0表示广度优先爬取,小于0表示更快的深度优先爬取。scrapy使用的是LIFO队列,这基本上表示它以深度优先顺序进行爬取。
  • DEPTH_STATS_VERBOSE :默认False,是否收集详细的深度统计数据。如果启用此选项,则会在统计信息中收集每个深度的请求数。
  • DNSCACHE_ENABLED:默认True,是否启用DNS内存缓存。
  • DNSCACHE_SIZE:默认10000,DNS内存缓存大小。(这个单位不会是字节吧)
  • DNS_TIMEOUT :默认60,在几秒钟内处理DNS查询的超时。支持浮动。
  • DOWNLOADER_MIDDLEWARES:默认{},包含项目中启用的下载器中间件和优先级的字典
  • DOWNLOADER_STATS :默认True, 是否启用下载程序统计信息收集(没用过,看起来有用)
  • DOWNLOAD_DELAY:默认0,在从同一网站下载连续页面之前,下载程序应等待的时间(以秒为单位)。这个参数一般会修改,太快也不好。
  • DOWNLOAD_TIMEOUT :默认180,下载程序在超时之前等待的时间
  • DOWNLOAD_MAXSIZE :默认1073741824(1024MB)。下载程序将下载的最大响应大小(以字节为单位)。(这,难道爬虫还会爬超过1G的文件吗,所以这个参数不理他就行)
  • DOWNLOAD_WARNSIZE:默认值:33554432(32MB)。下载程序将开始警告的响应大小。
  • DOWNLOAD_FAIL_ON_DATALOSS:默认True,响应头的Content-Length参数的值与返回的内容长度不符时是否处理。Fasle则表示这个错误没什么关系,数据我一样要。
  • LOG_ENABLED:默认True,是否启用日志记录
  • LOG_ENCODING :默认‘utf-8’,用于记录的编码
  • LOG_LEVEL:默认’DEBUG’,记录的最低级别。可用级别有:CRITICAL,ERROR,WARNING,INFO,DEBUG。
  • SPIDER_MIDDLEWARES:默认{}, 蜘蛛中间件
  • URLLENGTH_LIMIT:默认2083,允许抓取的网址的最大网址长度。
  • USER_AGENT :默认: “Scrapy/VERSION (+https://scrapy.org)”。爬网时使用的默认User-Agent。没什么用,一般被覆盖。
  • ROBOTSTXT_OBEY :默认True,是否遵循robot协议。遵循的话那爬虫就没有存在的意义了。所以一般改为False。

还有其他的很多参数在刚使用的时候是不会遇到的,所以就不一一列举了。

总结

使用scrapy的一般步骤

  1. 创建项目:scrapy startproject baidu
  2. 测试xpath规则:scrapy shell “https://www.baidu.com
  3. 创建爬虫文件并编写部分代码
  4. 编写items.py需要抓取的字段
  5. 补全爬虫文件代码
  6. 编写pipelines.py的mongo管道
  7. 修改配置文件的一些参数
  8. 编写随机头和代理中间件

可以根据这个步骤一步一步的看,然后查怎么去实现。

猜你喜欢

转载自blog.csdn.net/Qwertyuiop2016/article/details/89416200