zoukankan      html  css  js  c++  java
  • scrapy框架

    目录:

      scripy中xpath解析

    介绍:

    Scrapy 是基于twisted框架开发而来,twisted是一个流行的事件驱动的python网络框架。因此Scrapy使用了一种非阻塞(又名异步)的代码来实现并发。整体架构大致:

    '''
    Components:
    
    1、引擎(EGINE)
    引擎负责控制系统所有组件之间的数据流,并在某些动作发生时触发事件。有关详细信息,请参见上面的数据流部分。
    
    2、调度器(SCHEDULER)
    用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL的优先级队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址
    
    3、下载器(DOWLOADER)
    用于下载网页内容, 并将网页内容返回给EGINE,下载器是建立在twisted这个高效的异步模型上的
    
    4、爬虫(SPIDERS)
    SPIDERS是开发人员自定义的类,用来解析responses,并且提取items,或者发送新的请求
    
    5、项目管道(ITEM PIPLINES)
    在items被提取后负责处理它们,主要包括清理、验证、持久化(比如存到数据库)等操作
    下载器中间件(Downloader Middlewares)位于Scrapy引擎和下载器之间,主要用来处理从EGINE传到DOWLOADER的请求request,已经从DOWNLOADER传到EGINE的响应response,
    你可用该中间件做以下几件事:
        (1) process a request just before it is sent to the Downloader (i.e. right before Scrapy sends the request to the website);
        (2) change received response before passing it to a spider;
        (3) send a new Request instead of passing received response to a spider;
        (4) pass response to a spider without fetching a web page;
        (5) silently drop some requests.
    
    6、爬虫中间件(Spider Middlewares)
    位于EGINE和SPIDERS之间,主要工作是处理SPIDERS的输入(即responses)和输出(即requests)
    '''
    部件详解

    安装:

    #Windows平台
        1、pip3 install wheel #安装后,便支持通过wheel文件安装软件,wheel文件官网:https://www.lfd.uci.edu/~gohlke/pythonlibs
        2、pip3 install lxml
        3、pip3 install pyopenssl  # pyopenssl是一个封装了openssl的python模块。使用它可以方便地进行一些加解密操作。
        # pywin32与python3有不兼容的问题,在 下载与当前python相兼容的版本,使用pip install 路径名(.wheel)文件方式进行安装
        4、下载并安装pywin32:https://sourceforge.net/projects/pywin32/files/pywin32/  # 去220目录下根据你的系统与python解释器下载相应的版本
        # 因为scrapy是基于twisted开发的,所以需要下载twisted
        5、下载twisted的wheel文件:http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted  
        6、执行pip3 install 下载目录Twisted-17.9.0-cp36-cp36m-win_amd64.whl   # 安装本地的twisted文件
       # cmd: >> pip3 install D:	ank_filesTwisted-18.9.0-cp36-cp36m-win_amd64.whl
        7、pip3 install scrapy  # 把1-6做完以后再下载scarpy框架,否则会报错
      
    #Linux平台
        1、pip3 install scrapy
    安装

    命令行工具:

    #1 查看帮助
        scrapy -h
        scrapy <command> -h
    
    #2 有两种命令:其中Project-only必须切到项目文件夹下才能执行,而Global的命令则不需要
        Global commands:
            startproject #创建项目
            genspider    #创建爬虫程序
            settings     #如果是在项目目录下,则得到的是该项目的配置
            runspider    #运行一个独立的python文件,不必创建项目
            shell        #scrapy shell url地址  在交互式调试,如选择器规则正确与否
            fetch        #独立于程单纯地爬取一个页面,可以拿到请求头
            view         #下载完毕后直接弹出浏览器,以此可以分辨出哪些数据是ajax请求
            version      #scrapy version 查看scrapy的版本,scrapy version -v查看scrapy依赖库的版本
        Project-only commands:
            crawl        #运行爬虫,必须创建项目才行,确保配置文件中ROBOTSTXT_OBEY = False
            check        #检测项目中有无语法错误
            list         #列出项目中所包含的爬虫名
            edit         #编辑器,一般不用
            parse        #scrapy parse url地址 --callback 回调函数  #以此可以验证我们的回调函数是否正确
            bench        #scrapy bentch压力测试
    
    #3 官网链接
        https://docs.scrapy.org/en/latest/topics/commands.html
    命令 详解

    示范用法:

    #1、执行全局命令:请确保不在某个项目的目录下,排除受该项目配置的影响
    scrapy startproject MyProject
    
    cd MyProject
    scrapy genspider baidu www.baidu.com
    
    scrapy settings --get XXX #如果切换到项目目录下,看到的则是该项目的配置
    
    scrapy runspider baidu.py
    
    scrapy shell https://www.baidu.com
        response
        response.status
        response.body
        view(response)
        
    scrapy view https://www.taobao.com #如果页面显示内容不全,不全的内容则是ajax请求实现的,以此快速定位问题
    
    scrapy fetch --nolog --headers https://www.taobao.com
    
    scrapy version #scrapy的版本
    
    scrapy version -v #依赖库的版本
    
    
    #2、执行项目命令:切到项目目录下
    scrapy crawl baidu
    scrapy check
    scrapy list
    scrapy parse http://quotes.toscrape.com/ --callback parse
    scrapy bench

    项目结构:

    文件说明:

    • scrapy.cfg  项目的主配置信息,用来部署scrapy时使用,爬虫相关的配置信息在settings.py文件中。
    • items.py    设置数据存储模板,用于结构化数据,如:Django的Model
    • pipelines    数据处理行为,如:一般结构化的数据持久化
    • settings.py 配置文件,如:递归的层数、并发数,延迟下载等。强调:配置文件的选项必须大写否则视为无效,正确写法USER_AGENT='xxxx'
    • spiders      爬虫目录,如:创建文件,编写爬虫规则

    注意:一般创建爬虫文件时,以网站域名命名

    project_name/
       scrapy.cfg
       project_name/
           __init__.py
           items.py
           pipelines.py
           settings.py
           spiders/
               __init__.py
               爬虫1.py
               爬虫2.py
               爬虫3.py

     pycharm中使用scrapy项目:

    #在项目目录下新建:entrypoint.py
    from scrapy.cmdline import execute
    execute(['scrapy', 'crawl', 'xiaohua'])

    scripy中使用xpath解析响应数据

    response.selector.css()
    response.selector.xpath()
    可简写为
    response.css()
    response.xpath()
    
    #1 //与/
    response.xpath('//body/a/')#
    response.css('div a::text')
    
    >>> response.xpath('//body/a') #开头的//代表从整篇文档中寻找,body之后的/代表body的儿子
    []
    >>> response.xpath('//body//a') #开头的//代表从整篇文档中寻找,body之后的//代表body的子子孙孙
    [<Selector xpath='//body//a' data='<a href="image1.html">Name: My image 1 <'>, <Selector xpath='//body//a' data='<a href="image2.html">Name: My image 2 <'>, <Selector xpath='//body//a' data='<a href="
    image3.html">Name: My image 3 <'>, <Selector xpath='//body//a' data='<a href="image4.html">Name: My image 4 <'>, <Selector xpath='//body//a' data='<a href="image5.html">Name: My image 5 <'>]
    
    #2 text
    >>> response.xpath('//body//a/text()')
    >>> response.css('body a::text')
    
    #3、extract与extract_first:从selector对象中解出内容
    >>> response.xpath('//div/a/text()').extract()
    ['Name: My image 1 ', 'Name: My image 2 ', 'Name: My image 3 ', 'Name: My image 4 ', 'Name: My image 5 ']
    >>> response.css('div a::text').extract()
    ['Name: My image 1 ', 'Name: My image 2 ', 'Name: My image 3 ', 'Name: My image 4 ', 'Name: My image 5 ']
    
    >>> response.xpath('//div/a/text()').extract_first()
    'Name: My image 1 '
    >>> response.css('div a::text').extract_first()
    'Name: My image 1 '
    
    #4、属性:xpath的属性加前缀@
    >>> response.xpath('//div/a/@href').extract_first()
    'image1.html'
    >>> response.css('div a::attr(href)').extract_first()
    'image1.html'
    
    #4、嵌套查找
    >>> response.xpath('//div').css('a').xpath('@href').extract_first()
    'image1.html'
    
    #5、设置默认值
    >>> response.xpath('//div[@id="xxx"]').extract_first(default="not found")
    'not found'
    
    #4、按照属性查找
    response.xpath('//div[@id="images"]/a[@href="image3.html"]/text()').extract()
    response.css('#images a[@href="image3.html"]/text()').extract()
    
    #5、按照属性模糊查找
    response.xpath('//a[contains(@href,"image")]/@href').extract()
    response.css('a[href*="image"]::attr(href)').extract()
    
    response.xpath('//a[contains(@href,"image")]/img/@src').extract()
    response.css('a[href*="imag"] img::attr(src)').extract()
    
    response.xpath('//*[@href="image1.html"]')
    response.css('*[href="image1.html"]')
    
    #6、正则表达式
    response.xpath('//a/text()').re(r'Name: (.*)')
    response.xpath('//a/text()').re_first(r'Name: (.*)')
    
    #7、xpath相对路径
    >>> res=response.xpath('//a[contains(@href,"3")]')[0]
    >>> res.xpath('img')
    [<Selector xpath='img' data='<img src="image3_thumb.jpg">'>]
    >>> res.xpath('./img')
    [<Selector xpath='./img' data='<img src="image3_thumb.jpg">'>]
    >>> res.xpath('.//img')
    [<Selector xpath='.//img' data='<img src="image3_thumb.jpg">'>]
    >>> res.xpath('//img') #这就是从头开始扫描
    [<Selector xpath='//img' data='<img src="image1_thumb.jpg">'>, <Selector xpath='//img' data='<img src="image2_thumb.jpg">'>, <Selector xpath='//img' data='<img src="image3_thumb.jpg">'>, <Selector xpa
    th='//img' data='<img src="image4_thumb.jpg">'>, <Selector xpath='//img' data='<img src="image5_thumb.jpg">'>]
    
    #8、带变量的xpath
    >>> response.xpath('//div[@id=$xxx]/a/text()',xxx='images').extract_first()
    'Name: My image 1 '
    >>> response.xpath('//div[count(a)=$yyy]/@id',yyy=5).extract_first() #求有5个a标签的div的id
    'images'
  • 相关阅读:
    .net类库里ListView的一个BUG
    获取lable的caption, 摘抄还未测试可用否
    (转) lua实现split的简易方法
    2. SharePoint Online 开发,请联系qq512800530。加好备注。(不要发站内信。。。)
    1. android
    开发人员应关注的20个jQuery网站/博客
    Temp
    彩票项目开发节项
    求android ble 解决方案!
    自己开发的工作流引擎
  • 原文地址:https://www.cnblogs.com/xuechengeng/p/10525709.html
Copyright © 2011-2022 走看看