2016-06-28 44 views
0

所以,因爲它看起來像Scrapy下載圖像隨機順序,我一直試圖找到一種方法,在圖像排序以下兩種方法之一:如何訂購scrapy下載的物品?

  1. 下載順序其中的URL被刮掉
  2. 排序 文件(比如用元數據?),由他們在 來源網址列表中的順序

我想做到這一點的最有效的方式,但現在我可以」弄清楚如何使用這兩種方法來做到這一點。我看着可能修改Scheduler,但我不認爲有任何改變這一點的選擇。

回答

1

一個解決方案可能會或可能不會取決於頁面將是你解析HTML使用lxml和建立你自己的樹形結構的圖像。您遍歷HTML樹並查找圖像的級別並從中構建自己的樹。假設你有這個頁面:

|x| |x| |x| 
|x| |x| |x| 
|x| |x| |x| 

其中每個x對應一個圖像。解析HTML文檔的結構可以是這樣的

<HTML> 
    <Table>  
      <Column 1> 
       Pic 1 
       Pic 2 
       Pic 3 

      <Column 2> 
       Pic 1 
       Pic 2 
       Pic 3 

      <Column 3> 
       Pic 1 
       Pic 2 
       Pic 3 
    </Table> 
</HTML> 

如果你走通過LXML創建的樹和分配深處的圖像和他們的父母,你可以創建這個結構可以告訴你圖片的順序:

Depth 1  Column 1   Column 2   Column 3 
Depth 2 Pic  1     1     1    
Depth 3 Pic  2     2     2   
Depth 4 Pic  3     3     3  

這只是一個想法,可能不適用於沒有規律和/或格式不正確的網頁。


我也有這個問題。快速解決方法是在鏈接排隊等待被抓取之後(基本上當主函數被調用或者當您返回更深的請求時),您將鏈接寫入文件,以便它與您的訂單順序相關刮。

對不起,現在在家裏,所以我沒有訪問與代碼的機器。所以你有一個解析功能。我假設你遵循鏈接。 我會寫一些僞

def parse(self,response): 
    currentlink = response.url 
    uniqueid = (a sequential number) #callerid refers to starting link 

    with open("mylog.txt","a") as f: 
     f.write(currentlink+"\t"+str(uniqueid) 
    (whatever your logic for your start link) 
    (logic for following links, something something callback="otherfn") 
    (add uniqueid to your request.meta) 
    return request 


def otherfn(self,response): 
    take current link, take the unique id you created in parse 
    with open("mylog.txt","a") as f: 
     f.write(picturelink+"\t"+str(uniqueid)) 

這是一個粗線條的,但也有這麼多的變化。我不知道這是否是最佳解決方案,但它並不真正需要任何運行時間,並假設您沒有經歷大量圖像/鏈接,不會佔用太多空間。

有兩個鍵來告訴你真正的順序:

def parse(self,response): 
    currentlink = response.url 
    callerid = (a sequential number) #callerid refers to starting link 
    sequentialid = 1 

    with open("mylog.txt","a") as f: 
     f.write(currentlink+"\t"+str(uniqueid) 
    (whatever your logic for your start link) 
    (logic for following links, assign each link you follow a sequential id that tells you the order of the request calls. callback="otherfn") 
    (add callerid,sequentialid to your request.meta) 
    return request 


def otherfn(self,response): 
    take current link, take the unique id you created in parse 
    with open("mylog.txt","a") as f: 
     f.write(picturelink \t %s \t %s %(uniqueid,sequentialid)) 
+0

我能請得到一些代碼?不太確定你在說什麼。 – dtgee

+0

一個粗略的例子。你可以做一個獨特的,通過你的其他鏈接(這將被順序處理)引用。您也可以選擇創建一個uniqueid以及另一個號碼,以確保您的訪問順序。現在補充說.. – Jason

+0

我在這裏有點困惑。這只是寫文件,其中包含您的圖像應該在哪些鏈接?或者它實際上是否自動對圖像自動排序?對不起,我不太瞭解你在這裏做什麼,沒有更詳細的代碼。 – dtgee

相關問題