zoukankan      html  css  js  c++  java
  • 7 scrapy 初识

    scrapy框架

    框架介绍: Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍。所谓的框架就是一个已经被集成了各种功能(高性能异步下载,队列,分布式,解析,持久化等)的具有很强通用性的项目模板。对于框架的学习,重点是要学习其框架的特性、各个功能的用法即可。

    安装:
      Linux:
          pip3 install scrapy
      Windows:
          a. pip3 install wheel
          b. 下载twisted http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
          c. 进入下载目录,执行 pip3 install Twisted‑17.1.0‑cp35‑cp35m‑win_amd64.whl
          d. pip3 install pywin32
          e. pip3 install scrapy
    基础使用
        1.创建项目:   scrapy startproject 项目名称
        2.       cd  proName
        3.创建爬虫文件 scrapy genspider spidername xxx.com
        4.执行        scrapy crawl  spiderName
    
    scrapy crawl  spider --nolog #忽略log日志
    # -*- coding: utf-8 -*-
    import scrapy
    class Pa1Spider(scrapy.Spider):
        # 爬虫文件的名称
        name = 'pa1'
        # allowed_domains = ['www.xxx.com']   # 允许域名
        start_urls = ['https://www.qiushibaike.com/text/']  # 起始url列表 可写多个
    
        # 解析数据
        def parse(self, response):  #响应
            div_list = response.xpath('//div[@id="content-left"]/div')
            names = []
            for div in div_list:
                # author = div.xpath('./div[1]/a[2]/h2/text()')[0].extract()
                author = div.xpath('./div[1]/a[2]/h2/text()').extract_first()
    
                names.append({'name':author})  #必须封装到字典中  ('json', 'jsonlines', 'jl', 'csv', 'xml', 'marshal', 'pickle')
            return names
        # 持久化存储
        # - 基于终端指令 特性:只能将parse方法的返回值存到磁盘里面
          
    scrapy crawl first -o qiubai.csv #指定文件类型有要求.json .csv
        # - 基于管道 pipelines 

          - 数据解析        spider.py

          - 封装item类           items.py

          - 实例化item类型的对象  spider.py

          - 将解析倒的数据依次存储封装到item类型的对象中

          - 将item对象提交给管道   

         - 在管道中实现IO操作  spider.py

          - 开启管道  settings.py

      # 同一份数据存储到不同的平台:
        管道文件定义多个类,之后settings.py里注册开启,根据优先级数字越小,越早执行,不同类之间传递item,在def process_item():中return item.
    # 全站数据的爬取: 不同页面
      1 页面全添加到start_urls中,不建议,在url很多的时候不好
      2 手动请求
        设置url模板,%s %d 字符串格式化
        手动请求发送写在哪里? 在parse方法
        yield scrapy.Request(url=url,parse.callback)
    # 5大核心组件
    爬虫: 干活的
    管道: 接收item,
    调度器:
    下载器: 去互联网请求   
        下载中间件作用:拦截请求和响应
          -拦截请求:
            1 篡改请求头UA UA池,随机random.choice()
            2 设置相关请求对象的代理IP(process_exception中)
    引擎: 数据流处理,处理事务
    # POST请求的发送:
      重写def start_requests(self):
          yield scrapy.FormRequest(url,callback,formdata)
      scrapy 默认是自己处理cookie的, settings.py里面COOKIES_ENNABLE=False
    # 日志等级
      settings.py 里面 LOG_LEVEL='ERROR'
    # 日志路径
      settings.py 里面 LOG_FILE = 'path'
    # 请求传参的应用场景:
      爬取和解析的数据不在同一张页面上面
      在请求方法中使用meta(字典)参数,该字典会传递参数给回调函数
        回调函数接收meta:response.meta['key']
    # 一般的settings.py 里面这样修改
    ROBOTSTXT_OBEY = False
    USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36'
    ITEM_PIPELINES = {
       'xiaohua.pipelines.XiaohuaPipeline': 300,
       'xiaohua.pipelines.MysqlPipeline': 200,
    }    # 可定义多个管道类  300优先级  数值越小优先级越高
    LOG_LEVEL = "ERROR"
    # items.py
    # -*- coding: utf-8 -*-
    import scrapy
    class XiaohuaItem(scrapy.Item):
        name = scrapy.Field()  #为啥? 不能保证解析到的数据类型统一, 可以存储任何type的数据
        img_url = scrapy.Field()
    # 手动全站数据抓取
    # -*- coding: utf-8 -*-
    import scrapy
    from xiaohua.items import XiaohuaItem
    
    class Xh1Spider(scrapy.Spider):
        name = 'xh1'
        # allowed_domains = ['www.ccc.com']
        start_urls = ['http://www.521609.com/daxuemeinv/']
        # 生成一个通用的url模板
        url = 'http://www.521609.com/daxuemeinv/list8%d.html'
        pageNum = 1
    
    
        def parse_detail(self,response):
            pass
    
        def parse(self, response):
            li_list = response.xpath('//div[@class="index_img list_center"]/ul/li')  #返回列表 selector
            for li in li_list:
                name = li.xpath('./a[2]/text() | ./a[2]/b/text()').extract_first()
                img_url ='http://www.521609.com' + li.xpath('./a[1]/img/@src').extract_first()
    
                # 实例化一个item 对象
                item = XiaohuaItem()
                item['name'] = name
                item['img_url'] = img_url
                # item 提交给管道
                yield item
    
            # 对其他页码的url手动请求的发送
            if self.pageNum <= 3:
                self.pageNum += 1
                new_url = format(self.url%self.pageNum)
                yield scrapy.Request(url=new_url,callback=self.parse)
    手动全站数据抓取
    # -*- coding: utf-8 -*-
    import scrapy
    
    class PostReqSpider(scrapy.Spider):
        name = 'post_req'
        # allowed_domains = ['www.bb.com']
    
        start_urls = ['https://fanyi.baidu.com/sug']
    
        # 默认这样的get
        # def start_requests(self):
        #     for url in self.start_urls:
        #         yield scrapy.Request(url=url,callback=self.parse)
    
        def start_requests(self):
            for url in self.start_urls:
                data = {
                    'kw':'dog'
                }
                yield scrapy.FormRequest(url=url, callback=self.parse,formdata=data)
    
        def parse(self, response):
            print(response.text)
    scrapy 请求传参
    scrapy
    scrapy框架 默认处理cookie的
  • 相关阅读:
    PTA(Basic Level)1048.数字加密
    PTA(Basic Level)1037.在霍格沃茨找零钱
    PTA(Basic Level)1030.完美数列
    PTA(Basic Level)1047.编程团体赛
    PTA(Basic Level)1087.有多少不同的值
    PTA(Basic Level)1077.互评成绩计算
    PTA(Basic Level)1027.打印沙漏
    PTA(Basic Level)1029.旧键盘
    记录一次排查挖矿:快速跟踪一个进程
    JVM性能、多线程排查常用命令
  • 原文地址:https://www.cnblogs.com/zhangchen-sx/p/10822936.html
Copyright © 2011-2022 走看看