2013-06-26 6 views
0

현재 파이썬으로 웹 크롤러를 개발 중이며 여러 개의 CPU 코어를 활용할 예정입니다. 이것은 멀티 프로세싱에 대한 나의 첫 번째 시도이며, 구현과 개념 모두에서 몇 가지 문제가 발생합니다. 지금까지 웹 사이트를 크롤링하고 원하는 콘텐츠를 얻을 수있는 개발을 위해 하나의 프로세스를 작성했습니다. 이는 문제가되지 않습니다.파이썬 다중 처리 웹 크롤러 문제

내 문제는 모든 하위 프로세스가이 큐에 액세스하여 더 많은 작업을 수행 할 수 있도록 페이지에서 하위로 구문 분석 된 URL을 큐에 보내려 할 때 시작됩니다.

이걸로, 나는 여러 프로세스로이 프로그램을 시작하는 방법을 알지 못하고, 계속해서 일을하고 /해야하며, 한 번 끝내면 join()이된다. URL의 수가 분명히 크고 알려지지 않은 숫자이기 때문에 종료 전에 여러 가지 일을 설정할 수는 없습니다.

제가 신진 파이썬 개발자로서 모든 비판과 비판을 환영합니다. 나는 이것이 오히려 관련된 질문이며 커뮤니티의 도움에 크게 감사함을 또한 알고 있습니다!

기존의 웹 크롤러를 사용하는 것은 권장하지 않습니다. 이는 다른 어떤 것보다 저에게 더 많은 학습 경험이므로, 기존의 일부 소프트웨어를 사용하여 나를 크롤링하는 것은 도움이되지 않을 것입니다.

다음은 내가 가지고있는 것과 이해하는 것에 대한 아이디어를 제공하기위한 지금까지의 코드입니다.

import multiprocessing as mp 
import re 
import subprocess 
import time 

from bs4 import BeautifulSoup as bs4 
import requests 


class CrawlParseProcess(mp.Process): 
    def __init__(self, url): 
     mp.Process.__init__(self) 
     # This implies that a new process per URL which is not smart. 
     # Instead should the link queue be passed or something? 
     self.url = url 

    def run(self): 
     proc_name = self.name 
     response = requests.get(self.url) 
     links = self.link_parse(response.text, self.url) 

    def link_parse(self, html, url): 
     soup = bs4(html) 
     for link in soup.find_all('a'): 
      if link.has_attr('href'): 
       link = link.get('href') 
      if str(link).startswith('http') and 'example.com' in link: 
       print link 
     pattern = re.compile('http://www.example.com/.+\d/*') 
     if pattern.search(url): 
      return_obj = self.parse(html) 
      return_obj["date"] = time.time() 

    def parse(self, html): 
     soup = bs4(html) 
     return_obj = { 
      "url" : self.url, 
      "title" : soup.find('h1', {'itemprop' : 'name'}).text, 
      "date-added" : soup.find('div', {'class' : 'addedwhen clrfix'}).text, 
      "p" : soup.find('p', {'class' : 'time1'}).text, 
      "c" : soup.find('p', {'class' : 'time2'}).text, 
      "t" : soup.find('h3', {'class' : 'duration'}).text, 
      "items" : soup.find_all('li', {'itemprop' : 'items'}), 
     } 
     return return_obj 


if __name__ == '__main__': 
    p = CrawlParseProcess("www.example.com") 
    p.start() 
    p.join() 

답변