爬虫概述

###爬虫概述

  • 什么是爬虫? -就是通过编写程序,让其模拟浏览上网,然后再互联网中抓取数据的过程。
      -关键词抽取:
          -模拟:浏览器就是一个纯天然最原始的一个爬虫工具
          -抓取:
              -抓取一整张的页面源码数据
              -抓取一整张页面中的局部数据
  • 爬虫的分类: -通用爬虫:
      - 要求我们爬取一整张页面源码数据
    -聚焦爬虫
      - 要求爬取一张页面中的局部的数据
          -聚焦爬虫建立再通用爬虫基础之上
         z
    -增量式爬虫
      - 用来监测网站数据更新的情况,以便爬取到网站最新更新出来的数据
    -分布式爬虫
      - 提高爬取效率的终极武器
  • 反爬机制
    • 是作用到门户网站中,如果网站不想让爬虫轻易取到数据,他可以制定相关的机制来阻止爬虫程序来获取数据
  • 反反爬策略
    • 是作用再爬虫程序中,通过策略破解反爬机制来获取数据
  • 第一个反爬机制:
    • robots协议
      • 一个纯文本的协议,协议中规定该网站中哪些数据可以被爬,哪些不可以被爬。
      • 破解:
        • 你自己主观性的不遵从该协议即可
          #获取豆瓣动态数据
          import requests
          import json
          headers ={
              'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.41'
          }
          
          url = 'https://movie.douban.com/j/chart/top_list'  #从抓包中得到该url
          params = {
              'type': '5',
          'interval_id': '100:90',
          
          'start': '0',
          'limit': '100',
          }
          response = requests.get(url=url,headers=headers,params =params)
          
          page_test = response.json()
          with open('douban.html','w',encoding='gbk') as f:
              for mave in page_test:
                  f.write(mave['score'])
                  f.write(mave['title'])
            
            

          协程单线程+多任务,asyncio模块、aiohttp模块 

          • -单线程+多任务异步协程
              -特殊函数
                  - 如果一个函数的定义被async修饰后,则该函数就变成了一个特殊函数
                  - 特殊之处:
                      -该特殊函数调用后,函数内部语句不会被立刻执行
                      -该特殊函数被调用后会返回一个协程对象
            - 协程对象
                      - 对象,可以通过调用特殊函数对象返回
            - 任务对象
                       - 任务对象就是一个高级的协程对象
            - 事件循环对象
                - 作用:
                      - 可以将多个任务对象注册/装载到事件循环对象中
                          - 如果开启事件循环后,则其内部注册/装载的任务对象就按指定操作被基于异步执行
                 - 创建方式
                     loop = asyncio.get_event_loop()
                 - 开启方式
                     loop.run_until_complete(task)

        • - 多任务爬虫数据解析
          • 一定要使用回调函数来解析,多任务的架构中数据是封装在特殊函数中,我们要保证在数据请求结束之后再实现数据解析  
        •  

          • 
            
            import time
            import aiohttp
            import asyncio
            from lxml import etree

            urls=[1,2,3]
            async def get_reqest(url):
            # 实例化一个请求对象
            async with aiohttp.ClienSession() as sess:
            # 调用get发起请求,返回一个响应对象
            #get/post(url,headers,params/data,proxy="http://ip:port")
            async with await sess.get(url=url) as response:
            #text()获取字符串形式的响应数据
            #read()获取byte类型响应数据
            page_text = await response.text()
            return page_text
            #回调函数
            def parse(t):
            page_text = t.result()
            tree = etree.HTML(page_text)
            parse_text = tree.xpath('//a[id="feng"]/text()')[0]
            print(parse_text)

            if __name__ == '__main__':
            start = time.time()
            tasks = []
            for url in urls:
            c =get_reqest(url)
            task = asyncio.ensure_future(c)
            #调用回调函数处理数据,传值为task返回值
            task.add_done_callback(parse)
            tasks.append(task)
            loop = asyncio.get_event_loop()
            loop.run_until_complete(asyncio.wait(tasks))
            print(time.time()-start)
             

             

posted @ 2023-03-03 09:04  lolo_yoyo  阅读(34)  评论(0)    收藏  举报