zoukankan      html  css  js  c++  java
  • 小白_开始学Scrapy__原理

    整体架构

    1. 引擎(Scrapy Engine),用来处理整个系统的数据流处理,触发事务。
    2. 调度器(Scheduler),用来接受引擎发过来的请求,压入队列中,并在引擎再次请求的时候返回。
    3. 下载器(Downloader),用于下载网页内容,并将网页内容返回给蜘蛛。
    4. 蜘蛛(Spiders),蜘蛛是主要干活的,用它来制订特定域名或网页的解析规则。编写用于分析response并提取item(即获取到的item)或额外跟进的URL的类。 每个spider负责处理一个特定(或一些)网站。
    5. 项目管道(Item Pipeline),负责处理有蜘蛛从网页中抽取的项目,他的主要任务是清晰、验证和存储数据。当页面被蜘蛛解析后,将被发送到项目管道,并经过几个特定的次序处理数据。
    6. 下载器中间件(Downloader Middlewares),位于Scrapy引擎和下载器之间的钩子框架,主要是处理Scrapy引擎与下载器之间的请求及响应。
    7. 蜘蛛中间件(Spider Middlewares),介于Scrapy引擎和蜘蛛之间的钩子框架,主要工作是处理蜘蛛的响应输入和请求输出。
    8. 调度中间件(Scheduler Middlewares),介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。

    数据流过程:

    1. 引擎打开一个网站(open a domain),找到处理该网站的Spider并向该spider请求第一个要爬取的URL(s)。
    2. 引擎从Spider中获取到第一个要爬取的URL并在调度器(Scheduler)以Request调度。
    3. 引擎向调度器请求下一个要爬取的URL。
    4. 调度器返回下一个要爬取的URL给引擎,引擎将URL通过下载中间件(请求(request)方向)转发给下载器(Downloader)。
    5. 一旦页面下载完毕,下载器生成一个该页面的Response,并将其通过下载中间件(返回(response)方向)发送给引擎。
    6. 引擎从下载器中接收到Response并通过Spider中间件(输入方向)发送给Spider处理。
    7. Spider处理Response并返回爬取到的Item及(跟进的)新的Request给引擎。
    8. 引擎将(Spider返回的)爬取到的Item给Item Pipeline,将(Spider返回的)Request给调度器。
    9. (从第二步)重复直到调度器中没有更多地request,引擎关闭该网站。

    简单example

     1 import scrapy
     2 
     3 from 例子.items import 例子Item
     4 
     5 class 例子Spider(scrapy.Spider):
     6     name = "例子"
     7     allowed_domains = ["例子.org"]
     8     start_urls = [
     9         "例子1",        "例子2"
    10     ]  #此为列表
    11 
    12     def parse(self, response):
    13         for sel in response.xpath('xpath代码'):
    14             item = 例子Item()
    15             item['title'] = sel.xpath('a/text()').extract()
    16             item['link'] = sel.xpath('a/@href').extract()
    17             item['desc'] = sel.xpath('text()').extract()
    18             yield item

    制作Scrapy爬虫项目步骤

      1 新建项目

        startproject 项目名

      2 明确目标(items.py)

      3 制件爬虫程序

        进入到spiders文件夹中,执行:

        scrapy genspider 爬虫文件名 "域名"

        #  ex::::   scrapy genspider baiduspaider "www.baidu.com

      4 处理数据(pipelines.py)

      5 配置settings.py

      6 运行爬虫程序

        scrapy crawl 爬虫名

    scrapy 项目文件详解

      

    文件配置详解

      settings.py

       USER_AGENT = 'baidu (+http://www.yourdomain.com)'

      # 是否遵循robot协议,改为False
       ROBOTSTXT_OBEY = False
      # 最大并发量 ,默认为16
      CONCURRENT_REQUESTS = 32
      # 下载延迟时间
      DOWNLOAD_DELAY = 3
      # 请求报头
      DEFAULT_REQUEST_HEADERS = {
       'User-Agent':"Mozilla/5.0",
       'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
       'Accept-Language': 'en',
          }
      # 下载中间件
      DOWNLOADER_MIDDLEWARES = {
       'baidu.middlewares.BaiduDownloaderMiddleware': 543,
        }
      # 项目管道
      ITEM_PIPELINES = {
       'baidu.pipelines.BaiduPipeline': 300, # 此处有优先级
          }
    def parse(self, response):
      #response.xpath('h1') 结果为选择器对象
      #[<selector ... data = <h1 class="" >>]
      # response.xpath('//h1/text()')结果选择器对象
      # [<selector ...data="text()">]
      # response.xpath('//h1/text()').extract()
      # ['text()']
     知识点
      1 extract():获取选择器对象中的文本内容
        response.xpath('')得到的结果为选择器对象的列表
      2 pipellines.py中必须有1个函数叫
        def process_item(self,item,spider):
          return item [如果有多个piplines的话,需要使用return返回]
      3 爬虫程序中,start_urls必须为列表
        
      4 scrapy设置 log :settings.py
        LOG_LEVEL = "DEBUG"

        5层日志级别
          CRITICAL:严重错误
          ERROR :一般错误
          WARNING:警告信息
          DEBUG:调试信息
          INFO:一般信息
        LOG_FILE ='xx.log' #设置指定log文件

    # parse函数是第一次从start_url中初始URL发请求,
    # 得到响应后必须要调用的函数

    def parse(self,response):


    2 如何保存为csv ,或是 json文件
      1 scrapy crawl tengxun -o tenxun.csv
      2 scrapy crawl tengxun -o tenxun.json
      解决导出乱码问题(在settings里面加入一个变量)
        FEED_EXPORT_ENCODING = 'utf-8'
    3 下载器中间件
      1 随机User-Agent
        1 settings.py
          1 更改settings.py 中更改 USER_AGENT
          2 更改settings.py 中更改 DEFALUT_REQUEST_HEADERS ={"":"",}
        2 设置中间件[ USER_AGENT]  的更改
          1 新建一个useragent.py,存放大量USER_AGENT
          2 middleawres.py中写class
          3 settings.py中开启 DOWNLOADER_MIDDLEWARES     
          
          主要重写
          class xxx..DownloaderMiddleware(object):
            def process_request(self,request,spider):
                request.headers["User-Agent"]=random.choice(USER_AGENT_LIST)
      2 设置代理
        也是重写
        def process_request(self,request,spider):
          proxyList=[  
              "http://1.1.1.1:80",
              "http://1.1.1.2:80",
              "http://user:password@1.1.1.1:80",
              .....
            ]  
          # request的meta  参数
          request.meta['proxy'] = random.choice(proxyList)

      3 图片管道ImagePipeline
        1 使用流程(要操作的文件)
          1 settings.py
            设置图片要保存的路径的变量
            IMAGES_STORE ="/home/admin/aaa/images"
        2 pipelines.py
          1 导入scrapy定义好的图片管道类
            from scrapy.pipelines.images import ImagesPipeline
          2 定义自己的class,继承scrapy的图片管道类
            class xxxImagePipeline(ImagesPipeline):
              def get_media_requests(self,item,info):
    5 dont_filter参数
      scrapy.Request(url,callback=parse,dont_filter=.) 
      1 False:默认,检查域
      2 True:忽略域组检查
    6 scrapy shell
      1 scrapy shell "http://www.baidu.com"
      2 response.txt
    7 CrawlSpider类
      from scrapy.linkerextractors import LinkExitractor
      1 Spider的派生类
        Spider类:只爬取start_urls列表中的网页
        CrawlSpider类,定义了一些规则(ruler)来提供提取链接,跟进链接,
      2 创建CrawlSpider模板爬虫文件
        加-t crawl
        
        ex > scrapy genspider -t crrawl tengxun 'xxx.com'
      3 示例,从页面中提取所有的链接
        1 scrapy shell 'xxx.com'
        2 from scrapy.linkerextractors import LinkExtractor # 导入链接规则匹配类,用来提取符合规则的链接
          from scrapy.spiders import CrawlSpider,Rule    # 导入spiders的派生类CrawlSpider,Rule指定特定操作
        3 linkList = LinkExtractor(aallow=("正则"))
        4 linkList =extract_links(response)
      4 Rule
        1 作用:对爬取网站动作指定特点操作
          rules = (
              Rule(LinkExtractor(allow=r'正则'),
              callback = 'parseHtml',
              follow=True),)
            )
       
        
      ocr_电子扫描
      Ubuntu: sudo apt-get install tesseract-ocr
      
    验证: tesseract  test1.jpg test1.txt
    python 调用 : 需要安装
        方法很少,就用1 个,图片转字符串
       : image_to_string
        from PIL_to_string
    
    ex:::
        import pytesseract
        from PIL import Image
        image = Image.open('test1.jpg')
        s= pytesseract.image_to_string(image)
        print(s)
    
    
    
    # 重写spider类的start_request()方法,去掉start_urls
     def start_requests(self)


          

    不是所有的成功都是坐享其成
  • 相关阅读:
    比服务器的问题
    android studio adb.exe已停止工作(全面成功版 进程的查询和开启)
    安卓学习123
    java eclipse 安卓环境配置
    host访问goole
    Android studio自带的sample例子
    马士兵2string buffuer
    tomcat内存溢出,设置
    spring mvc 学习笔记【1】---前言
    dbutils报错:com.microsoft.sqlserver.jdbc.SQLServerException: 无法识别元数据的表
  • 原文地址:https://www.cnblogs.com/Skyda/p/9002210.html
Copyright © 2011-2022 走看看