Scrapy初步使用

scrapy安装

在windows上安装scrapy是一个很痛苦的事情. 可能会出现各种各样的异常BUG.

scrapy 2.5.1 -> scrapy-redis(0.7.2)

注意, 由于scrapy的升级. 导致scrapy-redis无法正常使用.所以这里我们选择2.5.1这个版本作为学习. 后期各位可以根据scrapy-redis的升级而跟着升级scrapy.

先使用pip直接安装看看报错不

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple scrapy==2.5.1 
pip install scrapy==2.5.1

如果安装成功, 直接去创建项目即可

如果安装失败. 请先升级一下pip. 然后重新安装scrapy即可.

最新版本的pip升级完成后. 安装依然失败, 可以根据报错信息进行一点点的调整, 多试几次pip. 直至success.

 

如果上述过程还是无法正常安装scrapy, 可以考虑用下面的方案来安装:

安装wheel

pip install wheel

下载twisted安装包 https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted

用wheel安装twisted.

pip install Twisted‑21.7.0‑py3‑none‑any.whl

安装pywin32

pip install pywin32

安装scrapy

pip install scrapy

总之, 最终你的控制台输入scrapy version能显示版本号. 就算成功了

Scrapy实例

接下来, 我们用scrapy来完成一个超级简单的爬虫, 目标: 深入理解Scrapy工作的流程, 以及各个模块之间是如何搭配工作的.

  1. 创建项目:

    scrapy startproject 项目名称

    示例:

    scrapy startproject mySpider_2

    创建好项目后, 我们可以在pycharm里观察到scrapy帮我们创建了一个文件夹, 里面的目录结构如下:

    mySpider_2   # 项目所在文件夹, 建议用pycharm打开该文件夹
        ├── mySpider_2      # 项目跟目录
        │   ├── __init__.py
        │   ├── items.py      # 封装数据的格式
        │   ├── middlewares.py  # 所有中间件
        │   ├── pipelines.py  # 所有的管道
        │   ├── settings.py   # 爬虫配置信息
        │   └── spiders     # 爬虫文件夹, 稍后里面会写入爬虫代码
        │       └── __init__.py
        └── scrapy.cfg      # scrapy项目配置信息,不要删它,别动它,善待它. 
    ​
  2. 创建爬虫

    cd 文件夹  # 进入项目所在文件夹
    scrapy genspider 爬虫名称 允许抓取的域名范围

    示例:

    cd mySpider_2
    scrapy genspider youxi 4399.com

    效果:

    (base) sylardeMBP:第七章 sylar$ cd mySpider_2
    (base) sylardeMBP:mySpider_2 sylar$ ls
    mySpider_2      scrapy.cfg
    (base) sylardeMBP:mySpider_2 sylar$ scrapy genspider youxi http://www.4399.com/
    Created spider 'youxi' using template 'basic' in module:
      mySpider_2.spiders.youxi
    (base) sylardeMBP:mySpider_2 sylar$ 

    至此, 爬虫创建完毕, 我们打开文件夹看一下.

    ├── mySpider_2
    │   ├── __init__.py
    │   ├── items.py
    │   ├── middlewares.py
    │   ├── pipelines.py
    │   ├── settings.py
    │   └── spiders
    │       ├── __init__.py
    │       └── youxi.py   # 多了一个这个. 
    └── scrapy.cfg
    ​

     

  3. 编写数据解析过程

    完善youxi.py中的内容.

    import scrapy
    
    class YouxiSpider(scrapy.Spider):
        name = 'youxi'  # 该名字非常关键, 我们在启动该爬虫的时候需要这个名字
        allowed_domains = ['4399.com']  # 爬虫抓取的域名,注意:域名前面是没有 www 的
        # 限制该spider抓取的域名, 只要不符合该域名的一概过掉
        start_urls = ['http://www.4399.com/flash/']  # 起始url
        # 起始url, 在引擎开始工作的时候. 自动的包装成一个请求对象
        # 引擎进行调度. 交给下载器获取页面源代码,帮你封装成响应对象
        # 引擎把响应对象交给spider进行解析, 解析函数就是 下面的parse
    
        # 此函数的名字不能改,固定写法
        def parse(self, response, **kwargs):
            # parse是解析 start_urls的响应
            # 以前的做法
            # from lxml import etree
            # tree = etree.HTML(resp.text)
            # tree.xpath("xxx")
            # 现在的做法(scrapy中)
            li_list = response.xpath("//ul[@class='n-game cf']/li")
            for li in li_list:
                name = li.xpath("./a/b/text()").extract_first()
                category = li.xpath("./em/a/text()").extract_first()
                date = li.xpath("./em/text()").extract_first()
    
                dic = {
                    "name": name,
                    "category": category,
                    "date": date
                }
    
                # 将提取到的数据提交到管道内.
                # 注意, 这里只能返回 request对象, 字典, item数据, or None
                yield dic

    注意:

    ==spider返回的内容只能是字典, requestes对象, item数据或者None. 其他内容一律报错==

    setting.py 中配置日志级别
    # 配置日志级别
    LOG_LEVEL = "WARNING"    # 最大限度的保留错误信息. 而又不会被一些乱七八糟的日志影响
    # CRITICAL  50=> 非常非常严重的错误. 解析器级别的
    # ERROR     40=>  报错, 程序挂了
    # WARNING   30=>  警告, 过时警告, 不会影响程序的执行.
    # INFO      20=>  一些提示信息, print("下载成功")
    # DEBUG     10=>  所有内容都记录
  4.  运行爬虫:

    scrapy crawl 爬虫名字

    实例:

    scrapy crawl youxi

     

  5. 编写pipeline.对数据进行简单的保存

    数据传递到pipeline, 我们先看一下在pipeline中的样子.

    首先修改settings.py文件中的pipeline信息

    ITEM_PIPELINES = {
        # 前面是pipeline的类名地址               
        # 后面是优先级, 优先级月低越先执行
       'mySpider_2.pipelines.Myspider2Pipeline': 300,
    }

    然后我们修改一下pipeline中的代码:

    class Myspider2Pipeline:
        # 这个方法的声明不能动!!! 在spider返回的数据会自动的调用这里的process_item方法. 
        # 你把它改了. 管道就断了
        def process_item(self, item, spider):
            print(item)
            return item

     

自定义数据传输结构item

在上述案例中, 我们使用字典作为数据传递的载体, 但是如果数据量非常大. 由于字典的key是随意创建的. 极易出现问题, 此时再用字典就不合适了. Scrapy中提供item作为数据格式的声明位置. 我们可以在items.py文件提前定义好该爬虫在进行数据传输时的数据格式. 然后再写代码的时候就有了数据名称的依据了.

item.py文件

import scrapy

class GameItem(scrapy.Item):
    # 定义数据结构
    name = scrapy.Field()
    category = scrapy.Field()
    date = scrapy.Field()
class Person:
    private String name;
    private int age;
    
dic = {name: "alex", age: 18}
p = Person( "alex", 18)

spider中. 这样来使用:

from mySpider_2.items import GameItem
​
# 以下代码在spider中的parse替换掉原来的字典
item = GameItem()
item["name"] = name
item["category"] = category
item["date"] = date
yield item

 

scrapy使用小总结

至此, 我们对scrapy有了一个非常初步的了解和使用. 快速总结一下. scrapy框架的使用流程:

  1. 创建爬虫项目. scrapy startproject xxx

  2. 进入项目目录. cd xxx

  3. 创建爬虫 scrapy genspider 名称 抓取域

  4. 编写item.py 文件, 定义好数据item

  5. 修改spider中的parse方法. 对返回的响应response对象进行解析. 返回item

  6. 在pipeline中对数据进行保存工作.

  7. 修改settings.py文件, 将pipeline设置为生效, 并设置好优先级

  8. 启动爬虫 scrapy crawl 名称

 

posted @ 2022-05-30 21:37  屠魔的少年  阅读(4)  评论(0)    收藏  举报