2016-10-18 7 views
1

scrapy runspider 명령을 사용하여 동일한 구조의 동일한 도메인에서 ~ 10,000 개의 링크 집합을 긁어 내고 있습니다. 내 구문 분석 방법에서 페이지의 특정 요소를 평가하기 때문에 페이지의 다른 요소를 긁어내어 일부 페이지 (중요도 40 % ~ 50 % 페이지) 사이가 무작위로 크롤링되지만 스크랩되지는 않습니다. 그러나 일부 이유 (이 이유에 대해서는 나중에 자세히 설명)에 따라 일부 요소가 잘못 평가되는 경우가 있습니다. 이 문제를 해결하려면이 URL에 대한 구문 분석 방법을 최대 5 회까지 반복해서 호출해야합니다. 5 회를 실행하면 페이지가 조건에 올바르게 응답 할 것으로 기대됩니다. 그렇지 않으면 요소가 진정으로 평가된다고 가정합니다. 잘못으로). 이 코드를 작성하는 방법 (아래의 부품 코드)?크롤링 크롤링 (스크래핑 없음)

위의 동작에 대한 가능한 이유 : 웹 링크의 유형이 www.example.com/search_term/이며 실제로 www.example.com에 "search_term"을 입력 한 후 실제로 동적으로 생성 된 페이지입니다. 그래서 내 추측에 따르면 Scrapy는 www.example.com/search_term/ 페이지가 완전히 생성되기 전에도 응답을받습니다. 어쩌면 이상적인 해결책은 웹 드라이브와 모든 것을 사용하는 것입니다. 그러나이 모든 단계는 나에게 너무 복잡 할 것입니다. 내가 95 % 긁어 모으는 한 행복합니다.

아래

관련 코드 (모든 세부 사항을 떠나지 않고 가독성을 위해 소독) :

class mySpider(scrapy.Spider): 
    name = "spidername" 

def start_requests(self): 
    urls = [url1, ... url10000] 

    for url in urls: 
     yield scrapy.Request(url=url, callback=self.parse,headers={ 
      "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B179 Safari/7534.48.3"}) 

def parse(self, response): 
    if (value of particular_item in page == 10): 
    yield {'someitem':  
      response.xpath('/html/body/div').extract())} 
    else: 
    <<Once again call this parse fuction with the same url upto a  maximum of 5 times - Need help in writing the code here>> 

답변

0

당신의 XPath는 당신이 구문 분석하는 HTML의 body가 첫 번째 요소로 div가 있어야 :

<html> 
    <body> 
     <div>... 

모든 사이트가 그렇게 보입니까? 에 대한 정보가 없으면 무엇을 긁으려고하면 더 많은 조언을 드릴 수 없습니다.

for div in response.xpath('//div').extract(): 
    yield {'div': div} 
+0

본질적으로 같은 다양한 가능한 쿼리의 결과를 검색하는 사이트의 목록 : – Scyber

+0

이 ... (죄송합니다, 위의 완료

또는 당신은 당신이 웹 사이트에서 모든 div의 압축을 풉니 다 다른 해결책을 시도 할 수 있습니다 검색어) ... ... 가능한 검색어는 다음과 같습니다. www.exapmle.com/abcd/ www.exapmle.com/shjk/ www.exapmle.com/dued/ 따라서 동일한 구조입니다. 다른 60 % 페이지를 긁어 낸 성공은 xpath가 정확하다는 증거입니다. 또한 다른 실행에서 서로 다른 링크가 누락 되어도 반드시 동일한 링크가 누락되지는 않습니다. 때로는 www.exapmle.com/shjk/을 놓친 경우가 있습니다. 때로는 긁힐 수도 있습니다. – Scyber

+1

이 경우'response's를 로그 파일에 로깅하여 예상 한 것과 같은 결과를 얻는 지 확인하십시오. 서버가 요청 양을 제한하고 검색 결과 대신 오류 메시지가 표시 될 수 있습니다. – GHajba