跳至内容

Scrapy框架

Scrapy框架简介

	Scrapy是一个为了爬取网站数据提取结构性数据而编写的应用框架可以应用在包括数据挖掘 信息处理或存储历史数据等一系列的程序中其最初是为了页面抓取(更确切来说,网络抓取)所设计的 也可以应用在获取API所返回的数据(比如Web Services)或者通用的网络爬虫

	Scrapy也能帮你实现高阶的爬虫框架比如爬取时的网站认证内容的分析处理重复抓取分布式爬取等等很复杂的事

参考文档
	https://www.osgeo.cn/scrapy/intro/install.html

安装指南

	Scrapy需要python3.6+CPython实现默认或pypy7.2.0+实现
    
    Linux
    	pip install Scrapy
	
    Windows
        a. pip3 install wheel
        b. 下载twisted http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
        c. 进入下载目录执行 pip3 install Twisted17.1.0cp35cp35mwin_amd64.whl
        d. pip3 install pywin32
        e. pip3 install scrapy
            

基本使用

创建项目
	scrapy startproject tutorial

    - 创建一个工程scrapy startproject ProName
    - cd ProName
    - 必须创建在spiders中:scrapy genspider spiderName www.xxx.com
    - 执行工程scrapy crawl spiderName
        - settings
            - 1.指定UA
            - 2.关闭robots
            - 3.指定日志等级

            
持久化存储
    - 方式1基于终端指令的持久化存储
        - 只可以将parse方法的返回值进行本地指定后缀文件的存储
        scrapy crawl 脚本文件名称 -o 文件路径
            --注意持久化储存对应的文本文件的类型只可以是('json', 'jsonlines', 'jl', 'csv', 'xml', 'marshal', 'pickle')数据格式
            --好处简介高效便捷
            --缺点局限性比较强数据只可以储存到指定后缀的文本文件中
            
    - 方式2基于管道的持久化存储
        - 在爬虫文件中进行数据解析
        - 在items文件中定义相关的字段在爬虫文件中解析的字段
        - 将爬虫文件中解析出的内容存储到items类型的对象中
        - 将items类型的对象提交给管道
        - 在管道类中接收item且对其进行任意形式的持久化存储操作
        - 在配置文件中开启管道机制
    - 什么时候可以定义多个管道类
        - 想要实现数据的备份将一份数据存储到多个平台中
        - 一个管道类负责将数据存储到一个平台中
    - 爬虫文件的parse中yield item是将item提交给了优先级最高那一个管道类
        - 管道类的process_item中return item是将item提交给下一个即将被执行的管道类
        
        

项目目录


reptiles_1
      scrapy.cfg
    
    └─reptiles_1
          items.py
          middlewares.py
          pipelines.py			# 管道文件
          settings.py			# 配置文件
          __init__.py
        
        └─spiders			
             bili.py			# 爬虫文件
           └─  __init__.py

        
spiders.bili文件分析
	class BiliSpider(scrapy.Spider):
        name = 'first' #爬虫文件的唯一标识
        # allowed_domains = ['www.baidu.com']		# 允许访问的域名
        # 起始的url列表:存放在该列表中的url都会被进行get请求的发送
        start_urls = ['https://www.baidu.com/','https://www.sogou.com']
        #数据解析:参数response就是响应对象
        #parse方法的调用次数和start_url中元素的个数是一直
        def parse(self, response):
            里面写你想要获取的内容
            print(response)

reptiles_1.settings配置文件
	ROBOTSTXT_OBEY = False			# 是否遵循robots协议
	LOG_LEVEL = 'ERROR'				# 控制台日志的输出等级
    CONCURRENT_REQUESTS = 32		# 最大线程数
    USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36'	# 全局UA伪装
    ITEM_PIPELINES = {
        #300:表示的管道类的优先级,数字越小优先级越高
       'ParsePro.pipelines.ParseproPipeline': 300,
       # 'ParsePro.pipelines.MysqlPipeLine': 301,
}
    

案例爬取哔哩哔哩视频信息
	import scrapy

	# 基于终端指令的持久化存储
    class BiliSpider(scrapy.Spider):
        name = 'bili'
        # allowed_domains = ['https://search.bilibili.com/']
        start_urls = ['https://search.bilibili.com/all?keyword=%E8%88%9E%E8%B9%88']

        def parse(self, response):
            li_list = response.xpath('//*[@id="all-list"]/div[1]/div[2]/ul/li')
            all_data = []

            for i in li_list:
                title = i.xpath('./a/@title')[0].extract()
                video_url = 'https:' + i.xpath('./a/@href')[0].extract()
                dic = {
                    'title': title,
                    'url': video_url
                }

                all_data.append(dic)
                print(dic)

            return all_data
	
    # 基于管道的持久化存储
    
最后更新于