日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

scrapy.spiders.crawl.CrawlSpider类的使用

發(fā)布時(shí)間:2023/12/16 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 scrapy.spiders.crawl.CrawlSpider类的使用 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這個(gè)類(lèi)比較適用于對(duì)網(wǎng)站爬取批量網(wǎng)頁(yè),相比于Spider類(lèi),CrawlSpider主要使用規(guī)則(rules)來(lái)提取鏈接

  rules = (

    Rule(LinkExtractor(allow=(r'https://movie.douban.com/subject/\d+/')), callback="parse_item1"),

    Rule(LinkExtractor(allow=(r'https://movie.douban.com/subject/.+')), callback="parse_item2"),

    )

  如果接觸過(guò)django,那么可以發(fā)現(xiàn)這個(gè)規(guī)則與django的路由系統(tǒng)十分相似,CrawlSpider的rules屬性是直接從response對(duì)象的文本中提取url,然后自動(dòng)創(chuàng)建新的請(qǐng)求。與Spider不同的是,CrawlSpider已經(jīng)重寫(xiě)了parse函數(shù),因此我們可以看到,scrapy的官網(wǎng)文檔的例子中并沒(méi)有重寫(xiě)parse。

這一切是scrapy自動(dòng)實(shí)現(xiàn)的,具體過(guò)程是:

  scrapy crawl spidername開(kāi)始運(yùn)行,程序自動(dòng)使用start_urls構(gòu)造Request并發(fā)送請(qǐng)求,然后調(diào)用parse函數(shù)對(duì)其進(jìn)行解析,在這個(gè)解析過(guò)程中使用rules中的規(guī)則從html(或xml)文本中提取匹配的鏈接,通過(guò)這個(gè)鏈接再次生成Request,如此不斷循環(huán),直到返回的文本中再也沒(méi)有匹配的鏈接,或調(diào)度器中的Request對(duì)象用盡,程序才停止。

  rules中的規(guī)則如果callback沒(méi)有指定,則使用默認(rèn)的parse函數(shù)進(jìn)行解析,如果指定了,那么使用自定義的解析函數(shù)。

  如果起始的url解析方式有所不同,那么可以重寫(xiě)CrawlSpider中的另一個(gè)函數(shù)parse_start_url(self, response)用來(lái)解析第一個(gè)url返回的Response,但這不是必須的。

  Rule對(duì)象的follow參數(shù)的作用是:指定了根據(jù)該規(guī)則從response提取的鏈接是否需要跟進(jìn)。

參考:?http://scrapy-chs.readthedocs.io/zh_CN/stable/topics/spiders.html#crawling-rules

?

1 #!/usr/bin/python 2 # -*- coding: utf-8 -*- 3 4 import scrapy 5 from tutorial01.items import MovieItem 6 from scrapy.spiders.crawl import Rule, CrawlSpider 7 from scrapy.linkextractors import LinkExtractor 8 9 10 class DoubanmoviesSpider(CrawlSpider): 11 name = "doubanmovies" 12 allowed_domains = ["douban.com"] 13 start_urls = ['https://movie.douban.com/tag/'] 14 # http_user='username' #http協(xié)議的基本認(rèn)證功能 ;http_user和http_pass 15 # http_pass='password' 16 rules = ( #自動(dòng)從response中根據(jù)正則表達(dá)式提取url,再根據(jù)這個(gè)url再次發(fā)起請(qǐng)求,并用callback解析返回的結(jié)果 17 Rule(LinkExtractor(allow=(r'https://movie.douban.com/subject/\d+/')), callback="parse_item"), 18 #Rule(LinkExtractor(allow=(r'https://movie.douban.com/tag/\[wW]+'))), # 從網(wǎng)頁(yè)中提取http鏈接 19 20 ) 21 22 23 def parse_item(self, response): 24 movie = MovieItem() 25 movie['name'] = response.xpath('//*[@id="content"]/h1/span[1]/text()').extract()[0] 26 movie['director'] = '/'.join(response.xpath('//a[@rel="v:directedBy"]/text()').extract()) 27 movie['writer'] = '/'.join(response.xpath('//*[@id="info"]/span[2]/span[2]/a/text()').extract()) 28 movie['url'] = response.url 29 movie['score'] = response.xpath('//*[@class="ll rating_num"]/text()').extract()[0] 30 movie['collections'] = response.xpath('//span[@property="v:votes"]/text()').extract()[0] #評(píng)價(jià)人數(shù) 31 movie['pub_date'] = response.xpath('//span[@property="v:initialReleaseDate"]/text()').extract()[0] 32 movie['actor'] = '/'.join(response.css('span.actor span.attrs').xpath('.//a[@href]/text()').extract()) 33 movie['classification'] = '/'.join(response.xpath('//span[@property="v:genre"]/text()').extract()) 34 print('movie:%s |url:%s'%(movie['name'],movie['url'])) 35 return movie 36 37 def parse_start_url(self, response): 38 urls = response.xpath('//div[@class="article"]//a/@href').extract() 39 for url in urls: 40 if 'https' not in url: # 去除多余的鏈接 41 url = response.urljoin(url) # 補(bǔ)全 42 print(url) 43 print('*'*30) 44 yield scrapy.Request(url)

?

總結(jié)

以上是生活随笔為你收集整理的scrapy.spiders.crawl.CrawlSpider类的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。