2013-08-02 13 views
2

나는 파이썬의 웹 크롤러를 makin에 게시하면 this tutorial을 팔로우하고 있습니다. 난 내 코드를 얻을 수 있었지만 내가 가지고있는 문제는 위의 비디오에서 발생하지 않는다. 코드의 끝 부분 인 print scraper(url,7)을 8 또는 그 이상으로 증가시킬 때 나는 발생한다. '쉘에서 다음과 같은 오류를 받고 있어요 :Python 웹 크롤러, 심도 문제

Traceback (most recent call last): 
File "<pyshell#30>", line 1, in <module> 
    execfile("threads/mechanizex.py") 
File "threads/mechanizex.py", line 85, in <module> 
    print scraper(url,7) 
File "threads/mechanizex.py", line 21, in scraper 
    for u in step_url: 
TypeError: 'NoneType' object is not iterable 

그리고 나는 비디오에서 저자와 완전히 동일한 코드를 가지고 있기 때문에 내 문제가 무엇인지 모른다, 그는 13에 자신의 번호를 증가시키고 그 결과 링크를 얻을 수 나는 그것을 7 이상으로 늘릴 수는 없지만 내 전체 코드는 다음과 같습니다.

import urllib 
import re 
import time 
from threading import Thread 
import MySQLdb 
import mechanize 
import readability 
from bs4 import BeautifulSoup 
from readability.readability import Document 
import urlparse 

url = "http://adbnews.com/area51" 

def scraper(root,steps): 
    urls = [root] 
    visited = [root] 
    counter = 0 
    while counter < steps: 
     step_url = scrapeStep(urls) 
     urls = [] 
     for u in step_url: 
      if u not in visited: 
       urls.append(u) 
       visited.append(u) 
     counter +=1 

    return visited 

def scrapeStep(root): 
    result_urls = [] 
    br = mechanize.Browser() 
    br.set_handle_robots(False) 
    br.addheaders = [('User-agent', 'Firefox')] 

    for url in root: 
     try: 
      br.open(url) 
      for link in br.links(): 
       newurl = urlparse.urljoin(link.base_url, link.url) 
       result_urls.append(newurl) 
     except: 
      print "error" 
     return result_urls 

d = {} 
threadlist = [] 

def getReadableArticle(url): 
    br = mechanize.Browser() 
    br.set_handle_robots(False) 
    br.addheaders = [('User-agent', 'Firefox')] 

    html = br.open(url).read() 

    readable_article = Document(html).summary() 
    readable_title = Document(html).short_title() 

    soup = BeautifulSoup(readable_article) 

    final_article = soup.text 

    links = soup.findAll('img', src=True) 

    return readable_title 
    return final_article 

def dungalo(urls): 
    article_text = getReadableArticle(urls)[0] 
    d[urls] = article_text 

def getMultiHtml(urlsList): 
    for urlsl in urlsList: 
     try: 
      t = Thread(target=dungalo, args=(urls1,)) 
      threadlist.append(t) 
      t.start() 
     except: 
      nnn = True 

    for g in threadlist: 
     g.join() 

    return d 

print scraper(url,7) 

도움이 될만한 사람이 있습니까?

답변

5

들여 쓰기가 잘못되었습니다. 이는 합리적으로 다음과 같아야합니다.

def scrapeStep(root): 
    result_urls = [] 
    br = mechanize.Browser() 
    br.set_handle_robots(False) 
    br.addheaders = [('User-agent', 'Firefox')] 

    for url in root: 
     try: 
      br.open(url) 
      for link in br.links(): 
       newurl = urlparse.urljoin(link.base_url, link.url) 
       result_urls.append(newurl) 
     except: 
      print "error" 

    return result_urls 

그렇지 않으면 지정된 첫 번째 URL 만보고 URL이없는 경우 없음을 반환합니다.

+0

그래, 그게 내가 의도 한 오류를 전혀 눈치 채지 못했다는 걸 .... 고마워! :) – dzordz