2011-03-15 7 views
1

나는 파이썬에서 크롤러 프레임 워크 "scrapy"를 사용하고 난 수입 JSON 아래에 주어진이 일을 위해] 파일을 코드에 JSON 형식으로 내 항목을 저장하기 위해 pipelines.py 파일을 사용두 번 실행하면 크롤러가 중복을 생성합니까?

class AYpiPipeline(object): 
def __init__(self): 
    self.file = open("a11ypi_dict.json","ab+") 


# this method is called to process an item after it has been scraped. 
def process_item(self, item, spider): 
    d = {}  
    i = 0 
# Here we are iterating over the scraped items and creating a dictionary of dictionaries. 
try: 
    while i<len(item["foruri"]): 
     d.setdefault(item["foruri"][i],{}).setdefault(item["rec"][i],{})[item["foruri_id"][i]] = item['thisurl'] + ":" + item["thisid"][i] 
    i+=1 
except IndexError: 
    print "Index out of range" 
    # Writing it to a file 
    json.dump(d,self.file) 
return item 

문제는 내 크롤러를 두 번 실행하면 파일에서 중복 된 뾰족한 항목이 생깁니다. 파일에서 먼저 읽은 다음 데이터를 새 데이터와 일치시키지 만 읽은 데이터는 파일이 json 형식이므로 json.loads() 함수로 디코딩했지만 작동하지 않습니다.

이렇게하는 방법을 제안하십시오.

참고 : 나는

+0

제가 생각하기에, 해결책은 스크립트의 여러 인스턴스가 동시에 실행되는 것을 방지하는 것입니다. 이것을 위해 파일 잠금을 사용할 수 있습니다 (스크립트 또는 외부에서 flock과 같은 유틸리티 사용). 여러 크롤러 인스턴스의 이유는 무엇입니까? – Gregory

답변

1

두 번 파일에 동일한 데이터를 작성해야 링크의 다른 세트를 크롤링하지만 같은 START_URL 두 번 크롤러를 실행 할 수 있기 때문에 내가 "APPEND"모드에서 파일을 열 필요가 있습니다 일부 사용자 정의 미들웨어 (예 : this)를 사용하여 중복을 필터링 할 수 있습니다. 실제로 스파이더에서 이것을 사용하려면 두 가지가 더 필요합니다. 즉, 필터가 중복을 식별 할 수 있도록 ID를 항목에 할당하고 스파이더 실행간에 방문 ID 세트를 유지하는 몇 가지 방법이 필요합니다. 두 번째는 쉽습니다. 선반처럼 무언가를 사용할 수도 있고 요즘 인기있는 많은 키 - 값 저장소 중 하나를 사용할 수도 있습니다. 첫 번째 부분은 더 어려워 질 것이며, 해결하려는 문제에 달려 있습니다.