找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 5601|回复: 5

[已解决] 在学写爬虫,爬下来的数据遇到了写入mongodb id键重复的报错

5

主题

15

帖子

15

积分

贫民

积分
15
banana499 发表于 2017-1-4 16:00:14 | 显示全部楼层 |阅读模式
按照教程学写了个爬58同城数据的爬虫,存入mongoDB,爬取物品链接很顺利,去掉重复部分一共爬了8万多个。
然后调用这部分链接爬取具体的物品页里的标题,地区,价格的时候出现了个报错
pymongo.errors.DuplicateKeyError: E11000 duplicate key error collection: ceshi.item_info4 index: _id_ dup key: { : ObjectId('586ca27bcc47802708a5455a') }
应该是id重复了
使用的代码如下:
  1. <blockquote>from bs4 import BeautifulSoup
复制代码
以上文件名为pages_parsing
  1. <blockquote>from multiprocessing import Pool
复制代码
我搜了下,网上有人说是要自己建立数据库索引才能避免插入时出现这个错误,请问如何实现??
回复

使用道具 举报

50

主题

1057

帖子

1108

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1108

活跃会员热心会员最佳导师默默耕耘突出贡献优秀版主荣誉管理论坛元老

blueelwang 发表于 2017-1-4 16:55:47 | 显示全部楼层
可以自己加一个计数器, 手动设置一个index, 保证不重复
回复 支持 反对

使用道具 举报

5

主题

15

帖子

15

积分

贫民

积分
15
banana499  楼主| 发表于 2017-1-4 17:03:38 | 显示全部楼层
谢谢,先试试看吧,话说为啥代码会被block掉?有啥原因吗?
回复 支持 反对

使用道具 举报

5

主题

15

帖子

15

积分

贫民

积分
15
banana499  楼主| 发表于 2017-1-5 11:17:47 | 显示全部楼层
blueelwang 发表于 2017-1-4 16:55
可以自己加一个计数器, 手动设置一个index, 保证不重复

我看了下Pymong Tutorial,意思是在数据库生成的_id之外,另外再定义一个索引,这个索引要作为一个元素放在需要插入数据的dict里面,生成一个新的值对吧?如果我爬去的链接是唯一的,那是不是可以直接把那个url作为索引?
回复 支持 反对

使用道具 举报

50

主题

1057

帖子

1108

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1108

活跃会员热心会员最佳导师默默耕耘突出贡献优秀版主荣誉管理论坛元老

blueelwang 发表于 2017-1-5 11:42:36 | 显示全部楼层
banana499 发表于 2017-1-5 11:17
我看了下Pymong Tutorial,意思是在数据库生成的_id之外,另外再定义一个索引,这个索引要作为一个元素放 ...

只要是唯一的url就可以, 建议使用url的md5值
回复 支持 反对

使用道具 举报

5

主题

15

帖子

15

积分

贫民

积分
15
banana499  楼主| 发表于 2017-1-5 12:10:44 | 显示全部楼层
blueelwang 发表于 2017-1-5 11:42
只要是唯一的url就可以, 建议使用url的md5值

之前url的合集我倒是通过设置为set类,除去重复值了
test1.item_info5.ensure_index('url', unique=True)#设置了test1数据库里item_info5这张表作为索引了,
目前使用list(test1.item_info5.index_information()) 查看索引,给的是[u'_id_',u'url_1']
但是运行程序以后还是报原来的错误,pymongo.errors.DuplicateKeyError: E11000 duplicate key error collection: test1.item_info5 index: _id_ dup key: { : ObjectId('586dc164cc47800760677492') },我用的代码如下:

# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup
import requests
import time
import pymongo

client = pymongo.MongoClient('localhost', 27017)
ceshi = client['ceshi']
test1 = client['test1']
item_info = test1['item_info5']

def get_item_info(url):

    if url == 'http://jump.zhineng.58.com/jump':
        pass
    else:
        wb_data = requests.get(url)
        soup = BeautifulSoup(wb_data.text, 'lxml')
        global dict
        if soup.find_all(attrs ={'class':"soldout_btn"}):
            print 'soldout'
            pass
        else:
            titles = soup.select('h1.info_titile')
            prices = soup.select('div.price_li > span.price_now > i')
            # date = soup.select('.time')[0].text
            areas = soup.select('div.palce_li > span > i')
            for title, price, areas in zip(titles,prices,areas):
                dict = {
                    'title':titles[0].get_text(),
                    'price':int(price.text),
                    'area':areas.text,
                    'url':url
                }
            item_info.insert_one(dict)
            print dict
#以上代码存于pages_parsing.py
----------------------------------------------------------------------


# -*- coding: utf-8 -*-
from multiprocessing import Pool
from pages_parsing import get_item_info,item_info,get_links_from
import pymongo

client = pymongo.MongoClient('localhost', 27017)
ceshi = client['ceshi']
links = ceshi['link1']
test1 = client['test1']
item_info = test1['item_info5']
test1.item_info5.ensure_index('url', unique=True)
url_db1 = [item['url'] for item in links.find()]#筛选好的url,无重复值
if __name__ == '__main__':
    pool = Pool()
    pool = Pool(processes=2)
    pool.map(get_item_info,url_db1)

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表