1. 程式人生 > >scrapy框架之(CrawlSpider)

scrapy框架之(CrawlSpider)

就是 Coding rip extra 獲得 rule back imp 轉義

一.CrawlSpider簡介

如果想要通過爬蟲程序去爬取”糗百“全站數據新聞數據的話,有幾種實現方法?

方法一:基於Scrapy框架中的Spider的遞歸爬取進行實現(Request模塊遞歸回調parse方法)。

方法二:基於CrawlSpider的自動爬取進行實現(更加簡潔和高效)。

一.簡介


  CrawlSpider其實是Spider的一個子類,除了繼承到Spider的特性和功能外,還派生除了其自己獨有的更加強大的特性和功能。其中最顯著的功能就是”LinkExtractors鏈接提取器“Spider是所有爬蟲的基類

,其設計原則只是為了爬取start_url列表中網頁,而從爬取到的網頁中提取出的url進行繼續的爬取工作使用CrawlSpider更合適。


二.使用


  1.創建scrapy工程:scrapy startproject projectName


  2.創建爬蟲文件:scrapy genspider -t crawl spiderName www.xxx.com


    --此指令對比以前的指令多了 "-t crawl"表示創建的爬蟲文件是基於CrawlSpider這個類的,而不再是Spider這個基類


  3.觀察生成的爬蟲文件

  爬蟲文件.py

#
-*- coding: utf-8 -*- import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule #不再是引入spider,而是引入了crawlspider,還引入了LinkExtracor(連接提取器),Rule解析器 class ChoutiSpider(CrawlSpider): name = chouti #allowed_domains = [www.xxx.com] start_urls
= [‘https://dig.chouti.com/r/scoff/hot/1]
  #allow後面跟著正則匹配,用正則去匹配符合的連接
  #rule規則解析器則會去把提取器提取到的連接發起請求,並把獲得的響應對象用回調函數去解析
  #follow表示是否把連接解析器繼續作用到提取到的url中(是否提取全站的url) rules
= ( Rule(LinkExtractor(allow=rItems/), callback=parse_item, follow=True), ) def parse_item(self, response): item = {} #item[‘domain_id‘] = response.xpath(‘//input[@id="sid"]/@value‘).get() #item[‘name‘] = response.xpath(‘//div[@id="name"]‘).get() #item[‘description‘] = response.xpath(‘//div[@id="description"]‘).get() return item

  案例一:(全站提取)

# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule


class ChoutiSpider(CrawlSpider):
    name = chouti
    # allowed_domains = [‘www.xxx.com‘]
    start_urls = [https://dig.chouti.com/r/scoff/hot/1]
    #把這個單獨寫比較好看
    link=LinkExtractor(allow=r/r/scoff/hot/\d+)
    rules = (
        Rule(link,callback=parse_item, follow=False),
    )

    def parse_item(self, response):
        print(response)

#這樣就可以叠代提取到我們想要的所有內容,因為其起始頁的url為:https://dig.chouti.com/r/scoff/hot/1

  案例二:(第一頁沒有數字編號的)

class ChoutiSpider(CrawlSpider):
name = ‘chouti‘
# allowed_domains = [‘www.xxx.com‘]
start_urls = [‘https://www.qiushibaike.com/text/‘]
#把這個單獨寫比較好看

link=LinkExtractor(allow=r‘/text/page/\d+/‘)
link1=LinkExtractor(allow=r‘/text/‘)
rules = (
Rule(link,callback=‘parse_item‘, follow=True),
Rule(link1, callback=‘parse_item‘, follow=True),
)

def parse_item(self, response):
print(response)


#註意觀察器其實url:
https://www.qiushibaike.com/text/
#第一頁沒有數字表示

  案例三:(正匹配會有很多相似的,限定開頭或者結尾)

class ChoutiSpider(CrawlSpider):
    name = chouti
    # allowed_domains = [‘www.xxx.com‘]
    start_urls = [https://www.qiushibaike.com/pic/]
    # 把這個單獨寫比較好看

  #這邊的?記得轉義\   link = LinkExtractor(allow=r/pic/page/\d+\?s=) link1 = LinkExtractor(allow=r/pic/$) #提取第一頁這個匹配會有很多其他的幹擾,這些並不是我們想要的,要限定結尾$ rules = ( Rule(link, callback=parse_item, follow=True), Rule(link1, callback=parse_item, follow=True), ) def parse_item(self, response): print(response)

  註:如果allow沒有為空,那就是匹配網頁中所有的url

scrapy框架之(CrawlSpider)