UR2M–基础抓取过程
每个网站都是不同的,对每个网站进行研究是不可避免的,尤其是遇到一些生僻的问题时,还需要去Scrapy的邮件列表咨询。因此我们需要熟悉Scrapy整个过程。Scrapy的基本过程,可以写成缩略语UR2M,见下图。
The URL
一切都是从url开始。你需要目标网站的URL。
请求和相应
我们在输出日志中,Scrapy自动为我们做了一些工作。我们输入一个地址,Scrapy做了一个GET请求,并得到一个成功响应值200。这说明网页信息已经成功加载,并可以使用了。
抓取对象
下一步是从响应文件中提取信息,输入到Item。因为这是个HTML文档,我们用XPath来做。我们以https://www.gumtree.com/为例子。首先来看一下网页:
页面上的信息很多,但大多数是关于版面的:logo、搜索框、按钮等等。从抓取的角度,它们不重要。我们关注的是,例如,列表的标题、地址、电话。它们对应着HTML里的元素,我们要在HTML中定位,将信息提取出来。先从标题开始。
在标题上右键点击,选择检查元素。在自动定位的HTML上再次右键点击,选择复制XPath。Chrome给的XPath总是很复杂,并且很容易失效。我们要对其进行简化。我们只取最后面的h1。这是因为从SEO的角度,每页HTML只有一个h1最好,事实上大多是网页只有一个h1,所以不用担心重复。
让我们看看h1标签行不行:
>>> response.xpath('//h1/text()').extract()
[u'set unique family well']
我们在h1后面加上text(),表示只提取h1标签里的文字。我们已经成功得到了title,但是再仔细看看,还能发现更简便的方法。
Gumtree为标签添加了属性,就是itemprop=name。所以XPath可以简化为//*[@itemprop=“name”][1]/text()。在XPath中,切记数组从1开始的,所以这里[]里面是1。
接下来看价格。价格在HTML中的位置如下:
<strong class="ad-price txt-xlarge txt-emphasis" itemprop="price">£334.39pw</strong>
我们又看到了itemprop="name"这个属性,XPath表达式为//*[@itemprop=“price”][1]/text()。验证一下:
>>> response.xpath('//*[@itemprop="price"][1]/text()').extract()
[u'\xa3334.39pw']
注意Unicode字符和价格。这说明要对数据进行清理。在这个例子中,我们用正则表达式提取数字和小数点。使用正则方法如下:
>>> response.xpath('//*[@itemprop="price"][1]/text()').re('[.0-9]+')
[u'334.39']
提取房屋描述的文字、房屋的地址也类似,如下:
//*[@itemprop="description"][1]/text()
//*[@itemtype="http://schema.org/Place"][1]/text()
相似的,抓取图片可以用//img[@itemprop=“image”][1]/@src。主要这里没使用text(),因为我们只想要图片的URL。
目前为止,使用的还只是HTML和XPath,接下来用Python来做一个项目。