1. 程式人生 > >Scrapy框架的學習(5.scarpy實現翻頁爬蟲,以及scrapy.Request的相關引數介紹)

Scrapy框架的學習(5.scarpy實現翻頁爬蟲,以及scrapy.Request的相關引數介紹)

1. 建立爬蟲專案 : scrapy startporject tencent 

   然後進入到專案中: cd tencent

   建立爬蟲:scrapy genspider tencent_spider tencent.com

2. 在開始寫程式碼之前,有些知識要知道

   

   可以找到頁面上的下一頁的url地址,然後用解析函式去處理,解析函式可以是當前函式,類似於函式遞迴

  通過在Request中指定callback引數來確定哪個解析函式來解析

  

3. 爬蟲的程式碼 。 tencent_spider.py     爬取騰訊招聘的網站。

# -*- coding: utf-8 -*-
import scrapy


class TencentSpiderSpider(scrapy.Spider):
    name = 'tencent_spider'
    allowed_domains = ['tencent.com']
    start_urls = ['https://hr.tencent.com/position.php']

    def parse(self, response):
        tr_list = response.xpath("//table[@class='tablelist']//tr")[1:-1]
        for tr in tr_list:
            item = {}
            item["position"] = tr.xpath("./td/a/text()").extract_first()
            item["category"] = tr.xpath(".//td[2]/text()").extract_first()
            item["date"] = tr.xpath(".//td[5]/text()").extract_first()
            yield item
        # 找到下一頁的url地址
        next_url = response.xpath("//a[@id='next']/@href").extract_first()
        if next_url != "javascript:;":
            next_url = "https://hr.tencent.com/"+next_url
            yield scrapy.Request(
                next_url,
                # callback 指定傳入的url交給那個解析函式去處理
                callback=self.parse
            )

   開啟pipeline : 

   在pipelines.py裡面寫上列印,先不儲存,看列印的結果   

class TencentPipeline(object):
    def process_item(self, item, spider):
        print(item)
        return item

  執行爬蟲框架: scrapy crawl tencent_spider

   可以看到結果不斷打印出來:  

   

可以在pipelines進行相應的儲存程式碼的編寫

4.  calkback引數:當callback引數指定解析函式時,

      自已可以在爬蟲中定義解析函式

     meta: 兩個解析函式之間傳遞資料

    例如:

    def parse(self,response):
            """其他的先省略,主要看下面的引數傳遞"""
            yield scrapy.Request(
                next_url,
                # callback 指定傳入的url交給那個解析函式去處理
                callback=self.parse,
                meta={"item": item}
            )

    """如果還有一解析函式,資料就通過meta傳遞過來"""
    def parese1(self,response):
        """可以直接通過鍵取出裡面的值"""
        response.meta["item"]
    

  dont_filter: 在Scrapy中預設請求是會去重的,請求過的url不會再請求 

                     想要不去重的話  ,就設定為True

                    如果請求的頁面上的資料會根據時間的變化會更新,這時候就要這個改變引數