likes
comments
collection
share

Python Scrapy Shell教程

作者站长头像
站长
· 阅读数 24

Python Scrapy Shell教程

当你用Python Scrapy进行搜刮时,从网站上获取和选择数据可能是很乏味的。有大量的更新代码,运行它,并检查你是否得到了你期望的结果。Scrapy提供了一种方法来使这个过程更容易,它被称为Scrapy Shell。Scrapy shell可以从终端启动,这样你就可以测试所有你想在Scrapy项目中使用的各种XPath或CSS选择器。它真的很整洁,所以现在让我们来看看它。


启动Scrapy Shell

python $


用一个URL打开Scrapy Shell

我们的目标是在Scrapy shell中使用一个页面的内容进行测试。Scrapy给了你一个快捷方式来启动外壳,同时获取一个URL。

scrapy_testing $

现在你可以在Scrapy shell中马上看到请求和响应。Scrapy向*scrapethissite.com/pages/*发出了一… OK响应。

[s] Available Scrapy objects:
[s]   scrapy     scrapy module (contains scrapy.Request, scrapy.Selector, etc)
[s]   crawler    <scrapy.crawler.Crawler object at 0x0000015474761190>
[s]   item       {}
[s]   

练习XPath

现在是有趣的部分。我们有一个内存中的页面源,我们可以很容易地使用XPath来查询文档中的各种元素和内容。让我们先来看看有关页面的导航。导航的源代码在这里。

<nav id="site-nav">
    <div class="container">
        <div class="col-md-12">
            <ul class="nav nav-tabs">
                <li id="nav-homepage">
                    <a href="/" class="nav-link hidden-sm hidden-xs">
                        <img src="/static/images/scraper-icon.png" id="nav-logo">
                        Scrape This Site
                    </a>
                </li>
                <li id="nav-sandbox">
                    <a href="/pages/" class="nav-link">
                        <i class="glyphicon glyphicon-console hidden-sm hidden-xs"></i>
                        Sandbox
                    </a>
                </li>
                <li id="nav-lessons">
                    <a href="/lessons/" class="nav-link">
                        <i class="glyphicon glyphicon-education hidden-sm hidden-xs"></i>
                        Lessons
                    </a>
                </li>
                <li id="nav-faq">
                    <a href="/faq/" class="nav-link">
                        <i class="glyphicon glyphicon-flag hidden-sm hidden-xs"></i>
                        FAQ
                    </a>
                </li>
                
                <li id="nav-login" class="pull-right">
                    <a href="/login/" class="nav-link">
                        Login
                    </a>
                </li>
                
            </ul>
        </div>
    </div>
</nav>

上面的代码片断只是源页面上整个HTML标记的一小部分。选择页面上的数据和内容可以是广泛的,也可以是集中的,只要你喜欢。


查询响应

我们可以像这样使用XPath来获取上面的整个代码片段。

In [12]: 

上面的代码就是所谓的查询响应。当在响应上调用.xpath**()**或.**css()**方法时,当单个元素被匹配时,你得到的是一个选择器对象,当多个元素被匹配时,得到的是一个选择器对象列表。

单个选择器对象

In [9]: 

选择器对象的列表

In [7]: 

选择器方法

一旦你有了一个选择器对象,你可以使用各种方法从选择器中提取数据。你会使用像**.get().getall().re_first().re()等方法。你还可以使用.attrib**属性来读取源中包含的属性值。


.get() vs .getall()

这是选择器对象上最常用的两个方法。.get()方法提取第一个选择器对象的内容,即使从.xpath()或.css()查询返回的对象不止一个。举个例子,我们知道xpath()查询的'//li/a'实际上返回了几个选择器对象。注意在这种情况下.get()和.getall()的区别。

.get()

In [14]: 

.getall()

In [15]: 

.re()

.re()方法可用于使用正则表达式来提取数据。

In [18]: 

.re_first()

.re_first()方法与.re()的作用相同,只是它只返回第一个正则表达式的匹配。

In [19]: 

选择特定元素

在.css()查询、.xpath()查询以及.get()和.getall()的各种组合之间,你可以在任何时候获得你喜欢的页面的任何部分。下面是一个使用XPath获取每个单独链接的例子。

In [2]:response.xpath('//li[1]/a') Out[2]:[]

In [3]:response.xpath('//li[2]/a') Out[3]:[]

In [4]:response.xpath('//li[3]/a') Out[4]:[]

In [5]:response.xpath('//li[4]/a') Out[5]:[]

这是同一件事,但使用列表索引来获得所需的元素,而不是XPath本身。

In [11]: 

用text()删除HTML标记

在网络搜刮过程中,你感兴趣的并不是标记,而是标记标签中的内容。在构建XPath查询时,你可以使用XPath中的text()节点指定器。DOM中的所有项目都是一个节点,甚至是文本。要指定一个文本节点,你可以使用text()。让我们看看一些例子。

In [11]: 
In [12]: 
In [13]: 

处理空白处和换行符

很多时候,网页上的标记并不漂亮。它的渲染效果很好,因为浏览器抽象出了任何空白或换行字符,但当你在网络上搜刮时,这些不规则的标记就会被发现。例如,请看这个标记。

Python Scrapy Shell教程

在XPath查询过程中,所有这些空白和换行符都会出现。

In [18]: 

如果你愿意,你可以添加Python strip()方法来克服这个问题。

In [19]: 

在外壳中的循环

即使在Scrapy shell中,你也可以在响应数据上循环。

In [25]: 

改变工作响应

你可以通过简单地使用fetch()方法获取一个新的页面来改变你在Scrapy shell中测试的页面。让我们把我们要查询的响应改成别的东西。

In [3]: 

现在我们可以用XPath查询所有段落的页面元素。

In [8]: 

Python Scrapy Shell教程总结

Scrapy shell是一个有趣的测试环境,在这里你可以很快地尝试和调试你的搜刮代码,而不需要运行蜘蛛。它的目的是测试数据提取代码,但你也可以用它来测试任何种类的Python代码,因为它可以作为一个标准的Python shell。

Scrapy shell非常适合测试你的XPath或CSS表达式,看看它们是如何工作的,以及它们从你试图搜刮的网页中提取了哪些数据。它是在你编写蜘蛛程序时交互式地测试你的表达式的一个好方法,而不必运行蜘蛛程序来测试每一个变化。

经过一段时间的练习,你会发现Scrapy shell是开发和调试蜘蛛程序的绝佳工具。

转载自:https://juejin.cn/post/7125790780748693535
评论
请登录