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