爬取数据

使用Scrapy学习怎样去爬取数据,最好的方法是使用Scarpy Shell,命令行运行:

    scrapy shell 'http://quotes.toscrape.com/page/1/'

注意:当运行Scarpy Shell的时候一定要将链接加到命令行的引号中,否则链接包含在内的参数将不会工作运行。
Windows系统中,要使用双引号(不能使用单引号):

     scrapy shell "http://quotes.toscrape.com/page/1/"

你将会看到命令行返回如下信息:

    [ ... Scrapy log here ... ]
    2016-09-19 12:09:27 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://quotes. toscrape.com/page/1/> (referer: None)
    [s] Available Scrapy objects:
    [s] scrapy scrapy module (contains scrapy.Request, scrapy.Selector, etc)
    [s] crawler <scrapy.crawler.Crawler object at 0x7fa91d888c90>
    [s] item {}
    [s] request <GET http://quotes.toscrape.com/page/1/>
    [s] response <200 http://quotes.toscrape.com/page/1/>
    [s] settings <scrapy.settings.Settings object at 0x7fa91d888c10>
    [s] spider <DefaultSpider 'default' at 0x7fa91c8af990>
    [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
    >>>

Shell中,你可以尝试使用CSS选择返回响应的内容:

    >>>response.css('title')
    [<Selector xpath='descendant-or-self::title' data='<title>Quotes to Scrape</title>'>]

运行response.css('title')的结果是*SelectorList列表对象,此对象代表了一列表包含XML/HTML格式的选择器,同时允许你更进一步地查询提取其中的内容和数据。

从标题中提取文本,你可以这样做:

    >>>response.css('title::text').extract()
    ['Quotes to Scrape']

这里有两点需要我们注意的是:一我们在CSS查询中添加::text,意味着我们只提取在<title>中的文本元素。如果我们不指定提取::text,我们将会得到包括标签在内的整个title标签元素:

    >>>response.css('title').extract()
    ['<title>Quotes to Scrape</title>']

二是.extract()返回的是列表,因为我们处理的是SelectorList实例对象。当你只想要第一个返回结果,你可以使用.extract_first()

    >>>response.css('title::text').extract_first()
    'Quotes to Scrape'

另外你还可以这样写:

    >>>response.css('title::text')[0].extract()
    'Quotes to Scrape'

然而,使用.extract_first()可避免一个是IndexError(索引值错误)和返回None(空值),当它没有找到相关元素。
这里值得注意的是:对于绝大多数的爬虫代码,你希望它们在查询网页对错误具有很好的适应性,所以即使部分内容无法爬取,至少你也可以得到部分的数据。
除了extract()extract_first()方法外,你也可以使用re()方法,使用正则表达式方法提取数据:

    >>>response.css('title::text').re(r'Quotes.*')
    ['Quotes to Scrape']
    >>>response.css('title::text').re(r'Q\w+')
    ['Quotes']
    >>>response.css('title::text').re(r'(\w+)  to (\w+)')
    ['Quotes','Scrape']

为了使用合适的CSS选择器,从Shell中通过输入View(response)打开你的浏览器你可能会会发现这是很好打开响应网页的方法。你可以使用浏览器中的开发者工具,像是Firebug
Selector Gadget在许多浏览器中也是一个很好的工具来寻找看得将的网页元素的CSS选择器。

简单介绍XPath的使用:

除了CSS外,Scrapy选择器还支持XPath的表达:

    >>>response.xpath('//title')
    [<Selector xpath='//title' data='<title>Quotes to Scrapy</title>'>]
    >>>response.xpath('//title/text()').extract_first()
    'Quotes to Scrape'

XPath的表达式非常强大的,同时也是Scrapy选择器的基础(元件)。事实上,在ScrapyCSS选择器是经过转换为XPath再输出结果的。如果你阅读了选择器的说明(源代码)你就知道这一点。

虽然XPath没有CSS受欢迎,但是XPath的表达更加强大,因为除了能操作标签结构外,它还能查看其中的内容。使用XPath,你可能要提取像“下一页”链接的功能。XPath使得爬取的任务易于执行,同时我们建议你去学习XPath 的使用方法即使你已经学会了CSS选择器的使用,这将会使你爬取信息的更容易。

我们不会在这讲太多的XPath的使用,但是你可以阅读using XPath with Scarpy Select here(P42)。去学习更多的关于XPath,我们建议你阅读this tutorial to learn XPath through examplethis tutorial to learn "how to think in XPath"

推荐阅读更多精彩内容