zoukankan      html  css  js  c++  java
  • 爬虫~scrapy

    1 scarpy框架的安装和启动

    # 1 框架 不是 模块
    # 2 号称爬虫界的django(你会发现,跟django很多地方一样)
    # 3 安装
    	-mac,linux平台:pip3 install scrapy
      -windows平台:pip3 install scrapy(大部分人可以)
      	- 如果失败:
          1、pip3 install wheel #安装后,便支持通过wheel文件安装软件,wheel文件官网:https://www.lfd.uci.edu/~gohlke/pythonlibs
          3、pip3 install lxml
          4、pip3 install pyopenssl
          5、下载并安装pywin32:https://sourceforge.net/projects/pywin32/files/pywin32/
          6、下载twisted的wheel文件:http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
          7、执行pip3 install 下载目录Twisted-17.9.0-cp36-cp36m-win_amd64.whl
          8、pip3 install scrapy
     # 4 在script文件夹下会有scrapy.exe可执行文件
    		-创建scrapy项目:scrapy startproject 项目名   (django创建项目)
      	-创建爬虫:scrapy genspider 爬虫名 要爬取的网站地址   # 可以创建多个爬虫
        #比如:scrapy genspider chouti https://dig.chouti.com/
    
        
     # 5 启动爬虫
    			-scrapy crawl 爬虫名字
      		-scrapy crawl 爬虫名字 --nolog
     # 6 不在命令行下执行爬虫
    	-在项目路径下创建一个main.py,右键执行即可
      	from scrapy.cmdline import execute
        # execute(['scrapy','crawl','chouti','--nolog'])
        execute(['scrapy','crawl','chouti'])
    

    2 scrapy架构

    image-20200410102350670

    # 引擎(EGINE)(大总管)
    引擎负责控制系统所有组件之间的数据流,并在某些动作发生时触发事件。有关详细信息,请参见上面的数据流部分。
    # 调度器(SCHEDULER)
    用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL的优先级队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址
    # 下载器(DOWLOADER)
    用于下载网页内容, 并将网页内容返回给EGINE,下载器是建立在twisted这个高效的异步模型上的
    # 爬虫(SPIDERS)
    SPIDERS是开发人员自定义的类,用来解析responses,并且提取items,或者发送新的请求
    # 项目管道(ITEM PIPLINES)
    在items被提取后负责处理它们,主要包括清理、验证、持久化(比如存到数据库)等操作
    
    
    # 两个中间件
    -爬虫中间件
    -下载中间件(用的最多,加头,加代理,加cookie,集成selenium)
    
    
    

    3 配置文件,目录介绍

    -crawl_chouti   # 项目名
      -crawl_chouti # 跟项目一个名,文件夹
        -spiders    # spiders:放着爬虫  genspider生成的爬虫,都放在这下面
        	-__init__.py
          -chouti.py # 抽屉爬虫
          -cnblogs.py # cnblogs 爬虫
        -items.py     # 对比django中的models.py文件 ,写一个个的模型类
        -middlewares.py  # 中间件(爬虫中间件,下载中间件),中间件写在这
        -pipelines.py   # 写持久化的地方(持久化到文件,mysql,redis,mongodb)
        -settings.py    # 配置文件
      -scrapy.cfg       # 不用关注,上线相关的
      
      
      
      
    # 配置文件
    
    ROBOTSTXT_OBEY = False   # 是否遵循爬虫协议,强行运行
    USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'    # 请求头中的ua
    LOG_LEVEL='ERROR' # 这样配置,程序错误信息才会打印,
    	#启动爬虫直接 scrapy crawl 爬虫名   
      # scrapy crawl 爬虫名 --nolog   #就没有日志输出  去除日志的输出
    
    网上有ua池的封装
    
    # 爬虫文件
    class ChoutiSpider(scrapy.Spider):
        name = 'chouti'   # 爬虫名字
        allowed_domains = ['https://dig.chouti.com/']  # 允许爬取的域  如果这个连接里面还有其他的连接 想要爬取 ,需要把这个注释掉
        start_urls = ['https://dig.chouti.com/']   # 起始爬取的位置,爬虫一启动,会先向它发请求
    
        def parse(self, response):  # 解析,请求回来,自动执行parser,在这个方法中做解析
            print('---------------------------',response)
    

    4 以抽屉为例,爬取数据并解析

    # 1 解析,可以使用bs4解析 这个另外i一个解析器 两种都是可以解析的
    from bs4 import BeautifulSoup
    soup=BeautifulSoup(response.text,'lxml')
    soup.find_all()
    # 2 内置的解析器
    # response.css  
    # response.xpath
    
    # 解析 
      # 所有用css或者xpath选择出来的都放在列表中
      # 取第一个:extract_first()
      # 取出所有extract()
      # css选择器取文本和属性:
        # .link-title::text
        # .link-title::attr(href)
      # xpath选择器取文本和属性
        # .//a[contains(@class,"link-title")/text()]
        #.//a[contains(@class,"link-title")/@href]
        
        def parse(self, response):
            div_list = response.css('div.link-item')
            # print(len(div_list))
            for div in div_list:
                title = div.css('.link-title::text').extract_first()
                url = div.css('.link-title::attr(href)').extract_first()
                url_img = div.css('.matching::attr(src)').extract_first()
                print(title)
                print(url)
                print(url_img)
                break
    

    5 持久化

    # 方式一(讲完就忘了)
    	-1 parser解析函数,return 列表,列表套字典
        l1.append({'title':title,'url':url,'url_img':url_img})
        #在这个里面新建一个列表 并且把这个数据append进去
      -2 scrapy crawl chouti -o aa.json   (支持:('json', 'jsonlines', 'jl', 'csv', 'xml', 'marshal', 'pickle')
    # 方式二 pipline的方式(管道)
       -1 在items.py中创建模型类
       -2 在爬虫中chouti.py,引入,把解析的数据放到item对象中(要用中括号)
       -3 yield item对象
       -4 配置文件配置管道
           ITEM_PIPELINES = {
            # 数字表示优先级(数字越小,优先级越大)
           'crawl_chouti.pipelines.CrawlChoutiPipeline': 300,
           'crawl_chouti.pipelines.CrawlChoutiRedisPipeline': 301,
        	}
      -5 pipline.py中写持久化的类
            	-spider_open
              -spider_close
              -process_item(在这写保存到哪)
                                           
                                           	
    

    6 动作链,自动登录12306

    # 1 生成一个动作练对象
    action=ActionChains(bro)
    # 2 点击并夯住某个控件
    action.click_and_hold(div)
    # 3 移动(三种方式)
    # action.move_by_offset() # 通过坐标
    # action.move_to_element() # 到另一个标签
    # action.move_to_element_with_offset() # 到另一个标签,再偏移一部分
    
    # 4 真正的移动
    action.perform()
    
    # 5 释放控件(松开鼠标)
    action.release()
    
    

    详见代码

    1 io模型

    http://www.liuqingzheng.top/python/Python异步IO并发/3-IO操作与IO模型/,epoll和select,poll

    2 python中操作excel的模块

    -导入一个excle把数据同步到数据库中

    3 什么是布隆过滤器

    1 用scrapy爬取cnblogs的文章信息(爬10页)

    2 爬10页抽屉新闻(不要求都写)

  • 相关阅读:
    c# 调用CMD窗口执行命令
    WPF 添加阴影效果
    WPF中鼠标拖动窗体
    c# exe程序只让启动一个
    $.when().done().then()的用法
    Math.round(),Math.ceil(),Math.floor()取整计算
    面向对象的程序设计-继承
    MATLAB | 直接保存窗口图片而不弹出figure窗口
    MATLAB 小tips总结
    图像数字处理 | Bit-Plane Slicing 比特平面分层- 如何计算
  • 原文地址:https://www.cnblogs.com/bs2019/p/13021857.html
Copyright © 2011-2022 走看看