MongoDB數據庫去重


  最近寫爬蟲的時候遇到了一個問題,爬一個專利網站,主要工作流是先把列表頁下所有的專利包括專利號、專利名稱、URL放到數據庫的一個文檔info中,再抽取info中的URL進行爬取詳情頁,爬取列表頁的信息做了一個去重,爬一個就在數據庫里查一個。。效率就不提了(另一種我能想到的方法是先用線程池爬取一遍,把單個字典放入一個列表中,再采用set去重,但是線程池似乎沒法返回子線程的值?),之后在詳情頁爬取工作的時候,去重遇到了問題(當然也是set去重),就是,最好是根據專利號來去重,而不是URL,因為詳情頁的URL可能會有變化,因此就多了如下很多代碼:

 1      rest_infos = self.obj.get_more_infos()#Mongoengine的查詢對象
 2         rest_texts = self.obj.get_more_texts()#同上
 3         rest_urls = set()#先定義一個集合
 4         '''根據查詢條件獲得的列表頁專利信息,包括url和專利號'''
 5         patents_infos_urls = [item.patent_url for item in rest_infos]#詳情頁URL,表1
 6         patents_infos_nums = [item.patent_num for item in rest_infos]#詳情頁專利號,表2
 7         dict_infos = dict(map(lambda x,y:[x,y],patents_infos_nums,patents_infos_urls))#合成一個字典1{'專利號':'URL'}
 8         '''專利詳情頁文檔下的所有專利信息,包括url和專利號,同上操作'''
 9         patents_texts_urls = [item.Patent_url for item in rest_texts]
10         patents_texts_nums = [item.Patent_num for item in rest_texts]
11         dict_texts = dict(map(lambda x,y:[x,y],patents_texts_nums, patents_texts_urls))#字典2
12         for item in (set(dict_infos)-set(patents_texts_nums)):#遍歷字典1的鍵和字典2的鍵的差集
13             for k,v in dict_infos.items():在列表頁的字典里遍歷
14                 if item == k:#如果查到那個差集里的某個專利名在列表頁里面
15                     rest_urls.add(v)#就把它添加到最終的URL集合里面,之后針對這個集合里的URL,做線程池爬取

但是感覺這種方法還是太麻煩,因為現在學到的東西還是太少,繼續努力。

——————————————————————————

這里還有一個問題要注意,列表頁數據庫里面的專利號是Int格式,所以詳情頁的專利號也要存成Int


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM