zoukankan      html  css  js  c++  java
  • 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

    人生苦短,何不用python
  • 相关阅读:
    (48)zabbix报警媒介:自定义脚本Custom alertscripts
    Centos7下cratedb数据导入导出copy to copy from
    CentOS7下cratedb备份及恢复(快照)
    Centos7下mysql5.7.22主从配置
    Centos7安装配置MySQL5.7
    Centos7安装配置iptable
    Centos7 LNMP 一键安装
    Centos7防范SYN
    Centos7安装RabbitMQ解决Erlang依赖报错
    centos7安装配置zabbix4.0
  • 原文地址:https://www.cnblogs.com/yqpy/p/8626696.html
Copyright © 2011-2022 走看看