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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

3、處理請求的響應內容,數據 通常在該函數內完成。我們使 scrapy.Spider 來建個爬取創(chuàng)商城上所有元件分類的爬,爬名稱命名為 catalog,將 start urls 更換為 函數的代碼,下貼出1234567891011121314151617通過以下命令來啟動爬,觀察爬的爬取過程及結果。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é)中實現(xiàn)了個簡單的單爬,它僅能 在 st art urls 中列明的,法從獲取的中提取出 并跟進。scrapy 通過 CrawlSpider 來實現(xiàn)按照定的規(guī)則從當前中提取出 url,并跟進爬取??梢酝ㄟ^命令 scrapy genspider -t c

6、rawl t est 來指定使 CrawlSpider 建爬。產件內容如下:1234567891011121314151617181920基于 CrawlerSpider 的爬不同之處在于多了個 rules 的屬性,該屬性定義了如何從中提取 url,并使指定的回調函數來處理爬取結果。使遞歸爬來實現(xiàn)創(chuàng)商城中產商的爬取在合適不過了,以下貼出相應的 提取規(guī)則和處理函數。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爬在處理的過程中不可避免的會遇到動態(tài)數據的處理,創(chuàng)商城中元件的列表的翻即是通過 ajax 來實現(xiàn)的,如果僅僅使上節(jié)中的遞歸爬取的法,有很多的元件將會被漏掉,在這可以使 scrapy 模擬 post 法來實現(xiàn)翻的效果。在 scrapy 中向站中提交數據使 scrapy.FormRequest 來實現(xiàn)。FormRequest 類擴展了基 Request 具有處理HT ML表單的功能。通過 FormReques 向翻 API 上提交新的信息,從獲取新中的 Json 數據,通過 Json 數據來獲取整個站中的元件信息。動態(tài)翻所需要的 API 及提交數據的格式在 外學 Py

11、t hon 爬 第六篇 動態(tài)翻 中做過分析,可以在那找到相關的信息。通過 FormRequest 來指定 url、提交數據、返回數據的回調函數等,具體實現(xiàn)如下:1234由于 Scrapy 中帶了 url 去重功能,因此需在 FormRequest 中設置 dont lt er = T rue,否則 FormRequest 只會執(zhí)次。Scrapy 使 It em 來定義通的輸出數據格式,數據通過 It em 在 Scrapy 的各個模塊中進傳遞,以下是個簡單的 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數據的處理通常在 Pipeline 中進,在爬中獲取的數據將通過 It em 傳遞到 Pipeline 的process it em 法中進處理,以下代碼實現(xiàn)了將數據存在 數據庫中。1234567891011121314151617其中 from crawler 法來沖 set t ing 件中獲取數據庫 。It em 按照在 set t ing 中定義的優(yōu)先級在各個 Pipeline 中進傳遞,如果在某個 Pipeline 中對該 It em 處理完成后續(xù)需處理,可以使 DropIt em 來

14、終 It em 向其他的 Pipeline 傳遞。爬不可避免的會遇到站的反爬策略,般的反爬策略是限制 IP 的 間隔, 當前的是否總是爬等。以上策略,可以通過設置兩個請求之間間隔隨機的時間,并設置 User-Agent 來規(guī)避部分的反爬策略。設置請求間隔隨機時間的中間件實現(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 件中修改,在我們的瀏覽器中查看當前瀏覽器的 User- Agent ,將 Scrapy 的 User-Agent 設置為瀏覽器的 User-Agent 。以下是 Chrome 流量中User-Agent 的查找法。前都沒有提到過站

17、的反爬,這次提到的 是真的被創(chuàng)商城給限制 了。今天將前所完成的爬功能使 Scrapy 進了個重構,cat alog 使的是單爬來獲取原件的分類信息,brand 是個遞歸爬來獲取原件產商信息,product 是個通過post 動態(tài)獲取 json 并 的爬,主要來獲取所有元件的信息。有多個爬需要運,可以使以下法逐個運爬123456如果想同時運多個爬,以下法是個不錯的選擇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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論