每日早讀第14周day07爬蟲(chóng)框架scrapy_第1頁(yè)
每日早讀第14周day07爬蟲(chóng)框架scrapy_第2頁(yè)
每日早讀第14周day07爬蟲(chóng)框架scrapy_第3頁(yè)
已閱讀5頁(yè),還剩2頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、先需要在系統(tǒng)中安裝 Scrapy 也可以使 virt ualenv 創(chuàng)建個(gè)虛擬環(huán)境,可以通過(guò)以下式來(lái)安裝 Scrapy。12Scrapy 安裝完成以后,通過(guò)以下式來(lái)創(chuàng)建個(gè)基本的 Scrapy 項(xiàng)。1在 Scrapy 中所有的爬類必須是 scrapy.Spider 的類,你可以定義要發(fā)出的初始請(qǐng)求, 選擇如何跟蹤中的 ,以及如何 的內(nèi)容以提取數(shù)據(jù)。第個(gè)爬我們選擇使 scrapy.Spider 作為類,建個(gè)簡(jiǎn)單的單爬。建個(gè)Scrapy 爬件可以直接在 spider 錄下新建件然后動(dòng)編寫(xiě)相關(guān)內(nèi)容,也可以使scrapy genspider opt ions <name> <domai

2、n> 命令來(lái)建個(gè)空模板的爬件,件內(nèi)容如下:12345# -*- coding: utf-8 -*- import scrapyclass TestSpider(scrapy.Spider):scrapy startproject project#使用 pip 來(lái)安裝 Scrapy pip install Scrapy67891011如上所示 Test Spider 繼承 scrapy.Spider,并定義了些屬性和法: name:當(dāng)前爬的名稱,來(lái)標(biāo)識(shí)該爬。 allowed domains:當(dāng)前爬所爬取的 。 start urls:爬將順序爬取其中的 url。 parse:爬的回調(diào)函數(shù),來(lái)

3、處理請(qǐng)求的響應(yīng)內(nèi)容,數(shù)據(jù) 通常在該函數(shù)內(nèi)完成。我們使 scrapy.Spider 來(lái)建個(gè)爬取創(chuàng)商城上所有元件分類的爬,爬名稱命名為 catalog,將 start urls 更換為 函數(shù)的代碼,下貼出1234567891011121314151617通過(guò)以下命令來(lái)啟動(dòng)爬,觀察爬的爬取過(guò)程及結(jié)果。1scrapy crawl catalogdef parse(self, response):catalogs = response.xpath('/divclass="catalog_a"') for catalog in catalogs:catalog_dl =

4、 catalog.xpath('dl') for tag in catalog_dl:parent = tag.xpath('dt/a/text()').extract() childs = tag.xpath('dd/a/text()').extract() parent =self.catalog_filter_left(self.catalog_filter_right(parent0) yield CatalogItem(parent = parent, child = None,)for child in childs: yield C

5、atalogItem(parent = parent,child = self.catalog_filter_right(child),)name = 'test'allowed_domains = '' start_urls = ''def parse(self, response): pass上節(jié)中實(shí)現(xiàn)了個(gè)簡(jiǎn)單的單爬,它僅能 在 st art urls 中列明的,法從獲取的中提取出 并跟進(jìn)。scrapy 通過(guò) CrawlSpider 來(lái)實(shí)現(xiàn)按照定的規(guī)則從當(dāng)前中提取出 url,并跟進(jìn)爬取??梢酝ㄟ^(guò)命令 scrapy genspider -t c

6、rawl t est 來(lái)指定使 CrawlSpider 建爬。產(chǎn)件內(nèi)容如下:1234567891011121314151617181920基于 CrawlerSpider 的爬不同之處在于多了個(gè) rules 的屬性,該屬性定義了如何從中提取 url,并使指定的回調(diào)函數(shù)來(lái)處理爬取結(jié)果。使遞歸爬來(lái)實(shí)現(xiàn)創(chuàng)商城中產(chǎn)商的爬取在合適不過(guò)了,以下貼出相應(yīng)的 提取規(guī)則和處理函數(shù)。12345678rules = (Rule(LinkExtractor(allow=(r'0- 9+.html', ), callback='parse_item', follow=False),)de

7、f parse_item(self, response):brand_info_logo = response.xpath('/divclass="brand-info- logo"')brand_info_text = response.xpath('/divclass="brand-info- text"')name = brand_info_logo.xpath('h1class="brand-info- name"/text()').extract()mport scrapyfr

8、om scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Ruleclass TestSpider(CrawlSpider): name = 'test'allowed_domains = '' start_urls = ''rules = (Rule(LinkExtractor(allow=r'Items/'), callback='parse_item', follow=True),)def par

9、se_item(self, response): item = #item'domain_id' =response.xpath('/inputid="sid"/value').get()#item'name' = response.xpath('/divid="name"').get() #item'description' =response.xpath('/divid="description"').get() return item

10、910111213141516爬在處理的過(guò)程中不可避免的會(huì)遇到動(dòng)態(tài)數(shù)據(jù)的處理,創(chuàng)商城中元件的列表的翻即是通過(guò) ajax 來(lái)實(shí)現(xiàn)的,如果僅僅使上節(jié)中的遞歸爬取的法,有很多的元件將會(huì)被漏掉,在這可以使 scrapy 模擬 post 法來(lái)實(shí)現(xiàn)翻的效果。在 scrapy 中向站中提交數(shù)據(jù)使 scrapy.FormRequest 來(lái)實(shí)現(xiàn)。FormRequest 類擴(kuò)展了基 Request 具有處理HT ML表單的功能。通過(guò) FormReques 向翻 API 上提交新的信息,從獲取新中的 Json 數(shù)據(jù),通過(guò) Json 數(shù)據(jù)來(lái)獲取整個(gè)站中的元件信息。動(dòng)態(tài)翻所需要的 API 及提交數(shù)據(jù)的格式在 外學(xué) Py

11、t hon 爬 第六篇 動(dòng)態(tài)翻 中做過(guò)分析,可以在那找到相關(guān)的信息。通過(guò) FormRequest 來(lái)指定 url、提交數(shù)據(jù)、返回?cái)?shù)據(jù)的回調(diào)函數(shù)等,具體實(shí)現(xiàn)如下:1234由于 Scrapy 中帶了 url 去重功能,因此需在 FormRequest 中設(shè)置 dont lt er = T rue,否則 FormRequest 只會(huì)執(zhí)次。Scrapy 使 It em 來(lái)定義通的輸出數(shù)據(jù)格式,數(shù)據(jù)通過(guò) It em 在 Scrapy 的各個(gè)模塊中進(jìn)傳遞,以下是個(gè)簡(jiǎn)單的 It em 定義:12class BrandItem(scrapy.Item): name = scrapy.Field()yield

12、scrapy.FormRequest(url=product_post_url, formdata=post_data, callback=self.json_callback, dont_filter = True)url = brand_info_logo.xpath('descendant:aclass="blue"/href').extract()desc = brand_info_text.xpath('divclass="introduce_txt"/text()').extract().return Bran

13、dItem( name = name, url = url,desc = desc_text,)34數(shù)據(jù)的處理通常在 Pipeline 中進(jìn),在爬中獲取的數(shù)據(jù)將通過(guò) It em 傳遞到 Pipeline 的process it em 法中進(jìn)處理,以下代碼實(shí)現(xiàn)了將數(shù)據(jù)存在 數(shù)據(jù)庫(kù)中。1234567891011121314151617其中 from crawler 法來(lái)沖 set t ing 件中獲取數(shù)據(jù)庫(kù) 。It em 按照在 set t ing 中定義的優(yōu)先級(jí)在各個(gè) Pipeline 中進(jìn)傳遞,如果在某個(gè) Pipeline 中對(duì)該 It em 處理完成后續(xù)需處理,可以使 DropIt em 來(lái)

14、終 It em 向其他的 Pipeline 傳遞。爬不可避免的會(huì)遇到站的反爬策略,般的反爬策略是限制 IP 的 間隔, 當(dāng)前的是否總是爬等。以上策略,可以通過(guò)設(shè)置兩個(gè)請(qǐng)求之間間隔隨機(jī)的時(shí)間,并設(shè)置 User-Agent 來(lái)規(guī)避部分的反爬策略。設(shè)置請(qǐng)求間隔隨機(jī)時(shí)間的中間件實(shí)現(xiàn)如下:123class ScrapyTestRandomDelayMiddleware(object): def init (self, crawler):self.delay = crawler.spider.settings.get("RANDOM_DELAY")class BrandPipeline

15、(object):def init (self, database_uri): db.init_url(url=database_uri) self.save = SaveData()classmethoddef from_crawler(cls, crawler): return cls(database_uri=crawler.settings.get('SQLALCHEMY_DATABASE_URI'),)def process_item(self, item, spider): if = 'brand':self.save.sav

16、e_brand(brand=item) raise DropItem('Drop Item: %s' % item)return itemurl = scrapy.Field() desc = scrapy.Field()456789101112然后在 set t ing 件中啟該中間件。12345User-Agent 可以直接在 set t ing 件中修改,在我們的瀏覽器中查看當(dāng)前瀏覽器的 User- Agent ,將 Scrapy 的 User-Agent 設(shè)置為瀏覽器的 User-Agent 。以下是 Chrome 流量中User-Agent 的查找法。前都沒(méi)有提到過(guò)站

17、的反爬,這次提到的 是真的被創(chuàng)商城給限制 了。今天將前所完成的爬功能使 Scrapy 進(jìn)了個(gè)重構(gòu),cat alog 使的是單爬來(lái)獲取原件的分類信息,brand 是個(gè)遞歸爬來(lái)獲取原件產(chǎn)商信息,product 是個(gè)通過(guò)post 動(dòng)態(tài)獲取 json 并 的爬,主要來(lái)獲取所有元件的信息。有多個(gè)爬需要運(yùn),可以使以下法逐個(gè)運(yùn)爬123456如果想同時(shí)運(yùn)多個(gè)爬,以下法是個(gè)不錯(cuò)的選擇1# -*- coding:utf-8 -*-# -*- coding:utf-8 -*- import osos.system("scrapy crawl brand") os.system("scr

18、apy crawl catalog") os.system("scrapy crawl product")RANDOM_DELAY = 3 DOWNLOADER_MIDDLEWARES = 'scrapy_test.middlewares.ScrapyTestDownloaderMiddleware': None, 'scrapy_test.middlewares.ScrapyTestRandomDelayMiddleware': 999,classmethoddef from_crawler(cls, crawler): return cls(crawler)def process_request(self, request, spider): delay = random.randint(0, self.delay)spider.logger.debug("# random delay: %s s #" % d

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論