zoukankan      html  css  js  c++  java
  • scrapy框架基本使用

    一.框架介绍

    1.scrapy框架由五个部分组成:

    • Scrapy Engine(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等

    • Scheduler(调度器): 它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎.

    • Downloader(下载器): 负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理.

    • Spider(爬虫): 它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器).

    • Item Pipeline(管道): 它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方.

    2.框架示意图

     

    二. 框架使用

    基本使用流程:

    1.创建项目:scrapy startproject 项目名称

    2.新建爬虫:scrapy genspider 爬虫文件名 爬虫基础域名

    3.编写item

    4.spider最后return item

    5.在setting中修改pipeline配置

    6.在对应pipeline中进行数据持久化操作

     

    1.安装

    pip install scrapy 
    pip install scrapy -i https://pypi.douban.com/simple 使用网络上的资源安装

    可能遇到失败:

    building 'twisted.test.raiser' extension

    error:Microsoft Visual c++ 14.0 is required. Get it with "Microsoft Visual c++ Build tools": ......等字样的错误

    此时需先安装文件 Twisted-19.2.0-cp36-cp36m-win_amd64.whl ,需从网络下载到本地, 下载链接: https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted 在该文件目录下运行命令:

    pip install Twisted-19.2.0-cp36-cp36m-win_amd64.whl

    再执行 pip install scrapy 进行安装.

    2.基本使用

    2.1 通过指令创建项目

    scrapy startproject reading_network(项目名)

    2.2 通过指令创建spider.py文件

    命令:

    cd reading_network(项目文件)
    # 创建基础spider, using template 'basic'
    scrapy genspider guoxue "www.dushu.com"   # 生成爬虫文件taobao 后面接所要爬取的域名
    # 创建crawlspider, using template 'crawl'   # 设置rule, 可跟踪响应的url
    scrapy genspider -t crawl guoxue www.dushu.com   # 后面域名也可不加双引号, 但不能为单引号 ''
    class GuoxueSpider(scrapy.Spider):
       name = 'guoxue'
       allowed_domains = ['www.dushu.com']
       start_urls = ['https://www.dushu.com/book/1617.html']

       def parse(self, response):
           print(type(response))
           detail_urls = response.xpath('//div[@class="book-info"]/h3/a/@href').extract()

    name: 爬虫名,启动的时候根据爬虫的名字启动项目

    allowed_domains:允许的域名,爬取的时候这个请求要不要发送,如果是该允许域名之下的url,就会发送,如果不是,则过滤掉这个请求,这是一个列表,可以写多个允许的域名

    start_urls:爬虫起始url,是一个列表,里面可以写多个,一般只写一个

    def parse(self, response): 就是以后写代码的地方,parse函数名是固定的,当收到下载数据的时候会自动的调用这个方法, 该方法第二个参数为response,这是一个响应对象,从该对象中获取html字符串,然后解析。

    【注】这个parse函数必须返回一个可迭代对象

    2.3 定制item.py

    定义所需要爬取的字段, 非常简单,复制粘贴

    name = scrapy.Field()
    img_url = scrapy.Field()
    ......

    2.4 开启爬虫

    cmd命令:

    scrapy crawl guoxue(爬虫文件名)

    可以设置启动文件 start.py:

    from scrapy import cmdline
    cmdline.execute(['scrapy', 'crawl', 'guoxue'])

    若报错:ModuleNotFoundError: No module named 'win32api'

    可直接安装: pip install pywin32

    或安装对应pywin32版本即可: 下载链接: https://sourceforge.net/projects/pywin32/

    根据response 获取网页内容:

    response.text    字符串类型
    response.body    二进制类型

    非常注意: 想要爬取到数据,需在settings文件中修改ROBOTSTXT_OBEY设置:

    ROBOTSTXT_OBEY = False  # 表示不遵守robots.txt 通用爬虫的规则

    2.5 将爬取数据生成指定格式文件

    需在运行命令后接参数:

    scrapy crawl guoxue -o data.json  # 编码问题 需在settings中添加 FEED_EXPORT_ENCODING = 'utf-8'
    scrapy crawl guoxue -o data.xml
    scrapy crawl guoxue -o data.csv

    scrapy用-o filename.json 输出时,会默认使用unicode编码,当内容为中文时,输出的json文件不便于查看, 可以在setting.py文件中修改默认的输出编码方式,只需要在setting.py中增加如下语句(默认似乎是没有指定的,所以要增加,如果默认有,就直接修改)

    2.6 将爬取数据存入数据库

    • settings.py中配置数据库:

    DB_HOST = '127.0.0.1'
    DB_PORT = 3306
    DB_USER = 'root'
    DB_PASSWORD = '450502'
    DB_DATABASE = 'spider1'
    DB_CHARSET = 'utf8'
    • settings.py中配置 ITEM_PIPELINES

      ITEM_PIPELINES = {       # 可以添加多个管道
         # 数字越小优先级越高,越先执行 0-1000
        'reading_network.pipelines.ReadingNetworkMysqlPipeline': 100,  
        'reading_network.pipelines.xxx': 200,
      }
    • 在pipelines.py文件中自定义管道 ReadingNetworkMysqlPipeline

    class ReadingNetworkMysqlPipeline(object):  # 需添加到settings管道配置
    # 开启爬虫时执行该函数
       def open_spider(self,spider):
           # 创建连接
           settings = get_project_settings()  # 封装好的获取配置文件settings的方法
           host = settings.get('DB_HOST')
           port = settings.get('DB_PORT')
           user = settings.get('DB_USER')
           password = settings.get('DB_PASSWORD')
           database = settings.get('DB_DATABASE')
           charset = settings.get('DB_CHARSET')
           self.conn = pymysql.connect(host=host, port=port, user=user, password=password,
                                  database=database, charset=charset)
           self.cursor = self.conn.cursor()


    # spider.py下的爬虫需不断返回item对象
       def process_item(self, item, spider):  # 注意位置参数顺序
           data = dict(item)
           keys = ', '.join(data.keys())
           values = ', '.join(['%s'] * len(data))  # '%s, %s, %s'
           sql = f'insert into guoxue({keys}) values({values})'
           print(222)
           try:
               self.cursor.execute(sql, tuple(data.values()))  # 传一个元组 替换 其中%s
               self.conn.commit()
           except Exception as e:
               print(e)
               self.conn.rollback()
           return item


    # 关闭爬虫时执行该函数
       def close_spider(self, spider):
           self.cursor.close()
           self.conn.close()

    2.7 日志文件配置

    # 日志等级 用的是python原生的日志系统
    LOG_LEVEL = 'ERROR' # 可以解决终端打印太多日志消息的问题, 只打印错误信息
    LOG_FILE = './log.txt' # 指定路径

    需要自己写日志输出方法

    2.8 修改输出文件默认编码格式

    settings.py添加 :

    FEED_EXPORT_ENCODING = 'utf-8'  # 默认utf-8

    参考官方文档: 链接: http://doc.scrapy.org/en/latest/topics/item-pipeline.html

  • 相关阅读:
    @property @synthesize的含义以及误区。
    OC中类的扩展介绍
    Thinking in Java第三、四章学习笔记----操作符与控制执行流程
    LeetCode之Easy篇 ——(12)Integer to Roman
    LeetCode之Easy篇 ——(9)Palindrome Number
    LeetCode之Easy篇 ——(7)Reverse Integer
    LeetCode之Easy篇 ——(1)Two Sum
    Java关键字汇总
    Thinking in Java 第二章学习笔记----一切都是对象
    php文件上传原理详解
  • 原文地址:https://www.cnblogs.com/Deaseyy/p/11266772.html
Copyright © 2011-2022 走看看