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来配置。

总结

使用scrapy的一般步骤

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

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

posted @ 2021-12-06 11:59  不加面  阅读(287)  评论(0编辑  收藏  举报