scrapy再學習與第二個實例

這周對於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

     import sys
     sys.stdout=open('output.txt','w')  ---------------存txt
     sys.stdout=open('output.json','W') --------------存json
(2)法2:命令行——scrapy crawl Test  -o test.json -t json
 
2、Rule
  在有些網絡爬取過程當中,要爬取的url並不是所有是事先定義好的,而是一邊爬取網頁,一邊不停的吸納新的url,在腦海想象一下蟲子爬行四面八方的趕腳...
  在寫爬蟲的時候,首先要定義start_urls,它是一個待爬取頁面的url隊列。
  當爬取一個頁面時,會從這個頁面得到n條url信息,有些種類的url須要加入上述url隊列中,等待進一步爬取;有些種類的url須要進行當即爬取等等。
  Rule的做用簡單來講就是對不一樣類型的url定義不一樣的處理規則。
  下面是一個小例子,注意幾點:
(1)須要引入CrawlSpider和Rule,CrawlSpider是基於最基本的Spider,其定義了一些規則(rule)來提供跟進link的方便的機制。
(2)須要引入LinkExtractor
(3)Rule須要用到正則,正則以'\'做爲標記,經常使用的幾種:
  [A-Z]{2}——兩個大寫字符
  \w+ 至關於 [A-Za-z0-9_]+  ——  一到多個字母、數字、下劃線(+:一到多個;*:0到多個)
  \W+ 匹配的正好和\w+相反
(4)第一個Rule:符合正則的,加入url隊列
    第二個Rule:符合正則的,調用函數parseCom
   Rule裏面有幾個參數,其中有一個叫作follow,它是一個布爾(boolean)值,指定了根據該規則從response提取的連接是否須要跟進,便是否加入url隊列。 若是callback爲None(第一個Rule),follow值爲True,不然爲False。
 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,進行內容爬取

  這種方式的好處:能夠加一個標記,標記頁面是否爬過,這樣就會使得整個爬蟲過程可控一些,知道哪些爬過哪些沒有爬過,第一種方式略亂一點對於我來講.....

相關文章
相關標籤/搜索