這周對於Scrapy進一步學習,知識比較零散,須要爬取的網站由於封禁策略帳號還被封了/(ㄒoㄒ)/~~web
1、信息存儲chrome
一、log存儲命令:scrapy crawl Test --logfile=test.log——把運行輸出存入log當中數據庫
也能夠在代碼中定義要存儲的內容:self.log("Fetch home page: %s" % response.url)json
二、將結果存文件瀏覽器
(1)法1:代碼裏增長以下幾條語句cookie
1 # -*- coding: utf-8 -*- 2 from scrapy.spiders import CrawlSpider,Rule 3 from scrapy.linkextractors import LinkExtractor 4 from scrapy.selector import Selector 5 from scrapy.item import Item 6 from qicha.items import QichaItem 7 8 class QichachaSpider(CrawlSpider): 9 name = "qichacha" 10 allowed_domains = ["qichacha.com"] 11 12 start_urls = [ 13 'http://www.qichacha.com/search_hangye', 14 ] 15 rules=( 16 Rule(LinkExtractor(allow=('/search_hangye\?&p=[0-9]+', ),)), 17 Rule(LinkExtractor(allow=('/firm\_[A-Z]{2}\w+', )), callback='parseCom'), 18 ) 19 def parseCom(self,response): 20 print "********************************" 21 print response 22 sel=Selector(response) 23 items=[] 24 item=QichaItem() 25 item['name']='test' 26 item['website']='test' 27 items.append(item) 28 return items
3、帶cookie的訪問網絡
有些網站須要登陸纔可見,換句話說只有登陸了才能夠去爬數據,在這種狀況下,每次爬取頁面的時候把cookie帶在請求信息裏就能夠了,即便有驗證碼也不怕。app
關於scrapy的cookie機制,我查資料的時候查到了一個cookielib包,由於懶沒有去學,就是用最簡單粗暴的方式把cookie加入請求信息當中,竟然意外的能夠。dom
(1)首先登錄網站,而後利用瀏覽器查看一下當前網站的cookie,以豆瓣和chrome瀏覽器爲例scrapy
(2)把cookie那一串拷出來,改爲"key":"value"的形式
(3)再在類中加入下面一段代碼,即把cookie放在請求信息當中,就能夠了(我下面的cookie是虛構的,換成本身的就能夠了)
1 def start_requests(self): 2 for url in self.start_urls: 3 yield Request(url,cookies={'PHPSESSID':'trvet','think_language':'zh-cn','CNZZD':'1916428848-1450-%7676488','pspt':'%722pswd%22%3A%22661bbde70%22%2C%22_cod27%22%7D','SERVERID':'a66d7dffe|145202|1450'})
4、幾點注意與疑問
(1)有些網站不讓頻繁爬取,那就看狀況time.sleep(10)一下,具體睡眠時間視狀況而定
(2)更嚴格的要切帳號(也就是cookie)和加代理,關於如何切代理我接下來再總結
(3)最恐怖的是把帳號給封禁了,就好比我如今爬取的網站,除了多註冊幾個帳號還有其餘方式嗎?
(4)關於爬取規則,我如今也搞不懂Scrapy是按什麼規則進行爬取的,深度優先?廣度優先?先不談加Rule,即便在最初start_urls定義了一串連續的url,結果爬取的時候卻不是按序的,不知道爲何?
5、第二個案例
第二個案例如今還沒弄完,是一個相似博客的網站,就假想成博客吧,第一層頁面是博客列表,有n頁;第二層頁面是博客的具體內容,隨便選一個例子。
一、法1:能夠利用Rule
(1)start_urls只插入一條初始頁面的url,strat_urls=['http://www.cnblogs.com/v-July-v/']
(2)定義兩個Rule,如果博客正文頁面的連接就爬取,如果博客列表的連接就存入url隊列
二、法2:不用Rule,分兩步爬取
(1)爬蟲1:先把全部博客正文頁面的連接爬取下來存入數據庫或者文件中
(2)爬蟲2:把第一步獲取的連接做爲strat_urls,進行內容爬取
這種方式的好處:能夠加一個標記,標記頁面是否爬過,這樣就會使得整個爬蟲過程可控一些,知道哪些爬過哪些沒有爬過,第一種方式略亂一點對於我來講.....