Scrapy框架的學習(5.scarpy實現翻頁爬蟲,以及scrapy.Request的相關引數介紹)
阿新 • • 發佈:2019-01-13
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
如果請求的頁面上的資料會根據時間的變化會更新,這時候就要這個改變引數