Scrapy 提取项目

为了从网页中提取数据,Scrapy使用了一种基于 XPath 和 CSS 表达式的称为选择器的技术。以下是XPath表达式的一些示例

  • / html / head / title - 这将选择HTML文档的 <head>元素内的<title>元素。
  • / html / head / title / text() - 这将选择同一个 <title>元素中的文本。
  • // td - 这将从中选择所有元素。
  • // div [@class =“slice”] - 这将选择 div 中包含属性class =“slice”的所有元素
  • 选择器有四种基本方法,如下表所示 -

    序号 方法和描述
    1 extract() 它会返回一个unicode字符串以及选定的数据。
    2 re() 它返回一个unicode字符串列表,当正则表达式作为参数给出时提取。
    3 xpath() 它返回一个选择器列表,它表示由作为参数给出的xpath表达式选择的节点。
    4 css() 它返回一个选择器列表,它表示由作为参数给出的CSS表达式选择的节点。

     

    在Shell中使用选择器

    为了演示内置Scrapy外壳的选择器,您需要在系统中安装 IPython。这里最重要的是,在运行Scrapy时,URL应该包含在引号中; 否则带'&'字符的网址将无法使用。您可以通过在项目的顶级目录中使用以下命令启动一个shell -

    scrapy shell "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/"
    

    shell 将如下所示:

    [ ... Scrapy log here ... ]
    
    2014-01-23 17:11:42-0400 [scrapy] DEBUG: Crawled (200)
    <GET http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>(referer: None)
    [s] Available Scrapy objects:
    [s]   crawler    <scrapy.crawler.Crawler object at 0x3636b50>
    [s]   item       {}
    [s]   request    <GET http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>
    [s]   response   <200 http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>
    [s]   settings   <scrapy.settings.Settings object at 0x3fadc50>
    [s]   spider     <Spider 'default' at 0x3cebf50>
    [s] Useful shortcuts:
    [s]   shelp()           Shell help (print this help)
    [s]   fetch(req_or_url) Fetch request (or URL) and update local objects
    [s]   view(response)    View response in a browser
    
    In [1]:
    

    当加载shell时,可以分别使用 response.bodyresponse.header 来访问主体或标题。同样,您可以使用 response.selector.xpath()response.selector.css() 对响应运行查询。

    例如:

    In [1]: response.xpath('//title')
    Out[1]: [<Selector xpath = '//title' data = u'<title>My Book - Scrapy'>]
    
    In [2]: response.xpath('//title').extract()
    Out[2]: [u'<title>My Book - Scrapy: Index: Chapters</title>']
    
    In [3]: response.xpath('//title/text()')
    Out[3]: [<Selector xpath = '//title/text()' data = u'My Book - Scrapy: Index:'>]
    
    In [4]: response.xpath('//title/text()').extract()
    Out[4]: [u'My Book - Scrapy: Index: Chapters']
    
    In [5]: response.xpath('//title/text()').re('(\w+):')
    Out[5]: [u'Scrapy', u'Index', u'Chapters']
    

     

    提取数据

    要从普通HTML网站提取数据,我们必须检查网站的源代码以获取XPath。在检查之后,您可以看到数据将位于 ul 标签中。选择 li 标签内的元素。

    以下代码行显示提取不同类型的数据:

    用于在li标签内选择数据:

    response.xpath('//ul/li')
    

    为了选择描述:

    response.xpath('//ul/li/text()').extract()
    

    为选择网站标题:

    response.xpath('//ul/li/a/text()').extract()
    

    为选择网站链接:

    response.xpath('//ul/li/a/@href').extract()
    

    以下代码演示了如何使用上述提取器。

    import scrapy
    
    class MyprojectSpider(scrapy.Spider):
       name = "project"
       allowed_domains = ["dmoz.org"]
    
       start_urls = [
          "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
          "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
       ]
       def parse(self, response):
          for sel in response.xpath('//ul/li'):
             title = sel.xpath('a/text()').extract()
             link = sel.xpath('a/@href').extract()
             desc = sel.xpath('text()').extract()
             print title, link, desc