zoukankan      html  css  js  c++  java
  • scrapy基本使用(二)

    scrapy基本使用(二)

    参考链接: http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/tutorial.html#id5

    scrapy基本使用(一) http://www.cnblogs.com/zhaijiahui/p/6973858.html

    了解一些基础,接下来我们该从源码里,扒出你想要的东西了。

    这里就要用到一个叫选择器(Selectors)的东西了。

    首先思考几个问题:

    1)选择器的作用是什么?

    从网页源码中提取出想要的数据。我理解python中的re,BeautifulSoup作用类似。

    2)选择器如何工作?

    用的是XPath,在xml和html上的节点语言,什么是节点语言?我理解这里就是在匹配一个个标签<div>,<a>,<span>等等,这样匹配的效率更高更准确。

    下面是如何使用选择器

    3)如何使用选择器?

    3.1 官方的使用方法

    from scrapy.selector import Selector

    这样只需要调用Selector(response)就等价于scrapy.selector.Selector(response)

    3.2 如何使用XPath来匹配内容呢?

    举个例子:

    body = '<html><body><span>good</span></body></html>'
    
    Selector(text=body).xpath('//span/text()').extract()

    注意到我们要找的内容在<span>标签里面,可以用//span/来定位,而我们要获取标签里面包裹的内容,用text()来获取。

    而前面.xpath() 及 .css() 方法返回的是一个类 SelectorList 的实例, 它是一个新选择器的列表。需要调用extract()最后成功获取good。

    response.xpath('//title/text()').extract() 等价于 response.css('title::text').extract()

    当源码是这种情况的时候,

    <a href='image3.html'>Name: My image 3 <br /><img src='image3_thumb.jpg' /></a>

     xpath用法:

    >>> response.xpath('//a[contains(@href, "image")]/@href').extract()
    [u'image1.html',
     u'image2.html',
     u'image3.html',
     u'image4.html',
     u'image5.html']

    contains代表href里面包含”image”的内容,最后还需要@href确定取得是href的内容

     css用法:

    >>> response.css('a[href*=image]::attr(href)').extract()
    [u'image1.html',
     u'image2.html',
     u'image3.html',
     u'image4.html',
     u'image5.html']

    当我们像这样把数据都挑出来以后

        def parse(self, response):
            for sel in response.xpath('//ul/li'):
                item = DmozItem()
                item['title'] = sel.xpath('a/text()').extract()
                item['link'] = sel.xpath('a/@href').extract()
                item['desc'] = sel.xpath('text()').extract()
                yield item

    最后获取数据需要用 yield

    yield是一个生成器,他可以记录调用之前的数据信息(各个参数的值),和位置信息(在框架中跳转以后依然能回来执行),而上次调用的所有局部变量都保持不变。

    可以参考:Python yield 用法 http://www.pythonclub.org/python-basic/yield

    保存爬取到的数据

    scrapy crawl dmoz -o items.json

    该命令将采用 JSON 格式对爬取的数据进行序列化,生成 items.json 文件。

    在类似本篇教程里这样小规模的项目中,这种存储方式已经足够。 如果需要对爬取到的item做更多更为复杂的操作,您可以编写 Item Pipeline 。

  • 相关阅读:
    Android短信管家视频播放器代码备份
    深入理解Android的startservice和bindservice
    Android拦截外拨电话
    android中的目录结构介绍
    2013年最后的3个月,你想到了什么呢?
    如何通过Html网页调用本地安卓app?
    Textview文字监控(输入到某个字符后,进行操作)
    ASP.NET MVC5 网站开发实践(二) Member区域
    ASP.NET MVC5 网站开发实践(二) Member区域
    ASP.NET MVC5 网站开发实践(一)
  • 原文地址:https://www.cnblogs.com/zhaijiahui/p/6984640.html
Copyright © 2011-2022 走看看