大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE稳定放心使用
最近写爬虫的时候遇到了一个问题,爬一个专利网站,主要工作流是先把列表页下所有的专利包括专利号、专利名称、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
转载于:https://www.cnblogs.com/yqpy/p/8626696.html
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/187290.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...