scrapy meta的高级应用

Posted tangkaishou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了scrapy meta的高级应用相关的知识,希望对你有一定的参考价值。

下面以一个网站的图书爬取为例,数据需要记录大分类 、小分类等信息。

页面有 大分类页面、小分类页面、列表页面、详情页面、

需要一条数据,包括所有的信息,所以借助meta的作用来把当前响应的数据进行传递给下一个解析函数。

为什么需要深拷贝呢?防止一条数据还没有收集完全,就被下一个请求重新定义item给洗刷掉之前所得到的数据。

    def parse(self, response):
        #1.大分类分组
        li_list = response.xpath("//ul[@class=‘ulwrap‘]/li")
        for li in li_list:
            item = {}
            item["b_cate"] = li.xpath("./div[1]/a/text()").extract_first()
            #2.小分类分组
            a_list = li.xpath("./div[2]/a")
            for a in a_list:
                item["s_href"] = a.xpath("./@href").extract_first()
                item["s_cate"] = a.xpath("./text()").extract_first()
                if item["s_href"] is not None:
                    item["s_href"]= "http://snbook.suning.com/" + item["s_href"]
                    yield scrapy.Request(
                        item["s_href"],
                        callback=self.parse_book_list,
                        meta = {"item":deepcopy(item)}
                    )

    def parse_book_list(self,response):
        item = deepcopy(response.meta["item"])
        #图书列表页分组
        li_list = response.xpath("//div[@class=‘filtrate-books list-filtrate-books‘]/ul/li")
        for li in li_list:
            item["book_name"] = li.xpath(".//div[@class=‘book-title‘]/a/@title").extract_first()
            item["book_img"] = li.xpath(".//div[@class=‘book-img‘]//img/@src").extract_first()
            if item["book_img"] is None:
                item["book_img"] = li.xpath(".//div[@class=‘book-img‘]//img/@src2").extract_first()
            item["book_author"] = li.xpath(".//div[@class=‘book-author‘]/a/text()").extract_first()
            item["book_press"] = li.xpath(".//div[@class=‘book-publish‘]/a/text()").extract_first()
            item["book_desc"] = li.xpath(".//div[@class=‘book-descrip c6‘]/text()").extract_first()
            item["book_href"]= li.xpath(".//div[@class=‘book-title‘]/a/@href").extract_first()
            yield scrapy.Request(
                item["book_href"],
                callback=self.parse_book_detail,
                # 传递给下一个解析函数
                meta = {"item":deepcopy(item)}
            )

        #翻页
        page_count = int(re.findall("var pagecount=(.*?);",response.body.decode())[0])
        current_page =  int(re.findall("var currentPage=(.*?);",response.body.decode())[0])
        if current_page<page_count:
            next_url = item["s_href"] +"?pageNumber={}&sort=0".format(current_page+1)
            yield scrapy.Request(
                next_url,
                callback=self.parse_book_list,
                meta = {"item":response.meta["item"]}
            )



    def parse_book_detail(self,response):
        item = response.meta["item"]
        item["book_price"] = re.findall(""bp":‘(.*?)‘,",response.body.decode())
        item["book_price"] = item["book_price"][0] if len(item["book_price"])>0 else None
        print(item)

 

以上是关于scrapy meta的高级应用的主要内容,如果未能解决你的问题,请参考以下文章

scrapy按顺序启动多个爬虫代码片段(python3)

scrapy meta不用pipe用命令-o

Scrapy数据建模-构造并发送请求(翻页实现)

比较有用的php代码片段

[转]scrapy中的request.meta

关于Scrapy爬虫框架中meta参数的使用示例演示(上)