ECommerceCrawlers项目分析(四)

2021SC@SDUSC

这篇博客将讲述xpath,yield以及其他parse()代码的分析

parse()代码分析先放在下面

#python类中方法的定义,注意要带self
    def parse(self, response):

        #定义item
        item = CnblogItem()

        # 使用xpath搜索
        # xpath(): 传入xpath表达式,返回该表达式所对应的所有节点的selector list列表
        # extract(): 序列化该节点为unicode字符串并返回list
        item['title'] = response.xpath('//a[@class="titlelnk"]/text()').extract()
        item['link'] = response.xpath('//a[@class="titlelnk"]/@href').extract()

        yield item

        # offset的中文意思是偏移量。
        # 在爬虫中,offset一般用于翻页
        print("第{0}页爬取完成".format(self.offset))
        if self.offset < 10:        #爬取到第几页
            self.offset += 1
        url2 = self.url+str(self.offset)    #拼接url
        print(url2)
        yield scrapy.Request(url=url2, callback=self.parse)

一.XPath简述

(先附上博主学习XPath的文档链接:XPath教程

XPath简而言之就是对文档的元素和属性进行遍历的工具。

它使用路径表达式来遍历

比如:

/html/head/title: 选择HTML文档中 <head> 标签内的 <title> 元素
/html/head/title/text(): 选择上面提到的 <title> 元素的文字
//td: 选择所有的 <td> 元素
//div[@class="mine"]: 选择所有具有 class="mine" 属性的 div 元素

下面附上几种经常用到的路径表达式:

表达式 描述
nodename 选取此节点的所有子节点。
/ 从根节点选取。
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点。
.. 选取当前节点的父节点。
@ 选取属性。

XPath的谓语用来查找某个特定的节点或者包含某个指定的值的节点。谓语被嵌在方括号中。

比如:

路径表达式 结果
/bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position()<3] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang] 选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang='eng'] 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
/bookstore/book[price>35.00] 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]/title 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。

在函数parse()里的xpath语句就表示:

//a[@class="titlelnk"]/text()

找到所有具有 class="titlelnk" 属性的a标签元素的文字

//a[@class="titlelnk"]/@href

找到所有具有 class="titlelnk" 属性的a标签元素的链接

二.yield

(先附上博主学习yield的链接:python中yield的用法详解——最简单,最清晰的解释

yield简而言之就是 return。它会返回一个值,并且记住这个返回的位置,下次迭代就从这个位置后开始。

三.其他关键代码分析

这两行代码:

item['title'] = response.xpath('//a[@class="titlelnk"]/text()').extract()
item['link'] = response.xpath('//a[@class="titlelnk"]/@href').extract()

分别用到了xpath()和extract()

xpath(): 传入xpath表达式,返回该表达式所对应的所有节点的selector list列表 。

extract(): 序列化该节点为unicode字符串并返回list

简而言之就是xpath()可以执行xpath语句,选择一系列元素和属性;extract()将它们转化为文字。

上一篇:Java [Leetcode 229]Bulls and Cows


下一篇:Pycharm开发Django项目增删改查操作