redis - 爬虫如何保存已经访问过的url
大家讲道理
大家讲道理 2017-04-21 10:57:04
0
6
803

话说同志们在爬取数据的时候如何保存已经访问过的url和队列?对于爬取过的url,我使用redis的set来保存,访问队列是用list来保存,数据量是直线上升,内存不大,也只有4g,扛不住。不知道以前的方法是什么?

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回覆 (6)
左手右手慢动作

佇列和判斷是否存取我都是用的MySQL,考慮到Redis的持久化特性不是很好,而且當時也沒想過用Redis或其他的,暫時現在用MySQL也沒問題。
具體的做法就是對url的md5值做唯一索引,每次查詢都很快,表結構也簡單。
隊列的話使用的是查表的形式,SQL如下(具體status是表示一些自己定義的狀態):
select * from t_down_task where status = 0 order by id limit 1;
定期刪除已經執行的任務

    刘奇

    http://en.wikipedia.org/wiki/Bloom_fi...

    4G記憶體可以開很大的BloomFilter了,每個URL只需要幾個比特,URL長度無關。 BloomFilter有一定錯誤率(例如千分之一、百分之一,取決於設定),會導致漏爬一些網頁,但不會重複爬。

    如果4G內存開BloomFilter還不夠的話,樓主更需要考慮的問題是怎麼存爬出來的網頁。

      左手右手慢动作

      md5的hash儲存在資料量不是很大的時候,存在KV儲存中還是比較可靠的,索引量很大的話,估計不太夠用,就得使用帶空間壓縮的一些特別演算法,比如上面有人提到的bloom filter

      也有人把這個演算法儲存用Memcache協定實作了,http://code.google.com/p/mc-bloom-fil...

        巴扎黑

        一些持久化的k/v資料庫可以考慮採用,我建議可以用leveldb。

          左手右手慢动作

          這種還是不要用redis來做了,直接用檔案系統

          已經採集過的url透過MD5成16進位字串,然後每4個字元作為一層目錄,最後4個字元作為檔案名,檔案內容為空即可

          判斷url有沒有採集過,直接把目前url MD5以後,依照上述規則產生檔案路徑,直接判斷檔案路徑是否存在即可。

            巴扎黑

            頂bloomfilter。可以這樣使用:使用leveldb來儲存url,然後查詢的時候先用bloomfilter擋掉大部分不在庫裡面的的url,這樣應該就差不多了。
            lz要爬多少url?如果url非常多,例如上億,有hadoop的話也可以用hadoop做新url和老url的去重,MapReduce很快的

              最新下載
              更多>
              網站特效
              網站源碼
              網站素材
              前端模板
              關於我們 免責聲明 Sitemap
              PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!