2013-07-27 13 views
3

Я пишу код, который использует механизацию для доступа к веб-сайту, но часто, когда я запускаю код Python, он бесконечно останавливается на строке, в которой я использовал mechanize.ParseResponse. Это не дает мне ошибку, и вместо этого я должен прервать ее через CTRL+C. Кроме того, я считаю, что я использую правильные аргументы для метода. Однако я смущен тем, почему моя программа внезапно перестает работать. Есть идеи?Python: механизация случайным образом останавливает программу бесконечно

В качестве дополнительного фона, я бегу на Mac.

Любая помощь была бы высоко оценена!

Edit: Ниже мой код

Примечание: я назвал python bikes.py и останавливается иногда на следующей строке:

form = mechanize.ParseResponse(response, backwards_compat=False) 

Время от времени, он также будет остановить на:

text = response.read() 

# bikes.py 
import re 
import webbrowser 
import mechanize 
import urllib 

brands = ["cannondale", "felt", "fuji", "giant", "specialized", "trek"] 
keywords = ["52", "53", "54", "shimano", "sora", "tiagra", "105", "ultegra", \ 
"road", "allez", "defy"] 
avoid = ["bmx", "mountain", "kids", "fixie", "jacket", "clothing", "fixed gear", \ 
"hybrid", "mtb"] 

def openLink(text): 
    text = text.lower() 
    open = False 
    for word in avoid: 
     if word in text: 
      return False 
    for word in keywords: 
     if word in text: 
      open = True 

    return open 

def scourPage(text, fileRead, fileWrite): 
    links = re.findall(r'class="row".+?href="(.+?)"', text) 

    for link in links: 
     if "http:" in link: 
      url = link 
     else: 
      url = homePage + link 

     page = urllib.urlopen(url) 
     pageText = page.read() 
     title = re.search(r'"postingtitle">.{0,10}<span.+?>[\s\'"]+(.+?)[\s\'"]{0,10}</h2>', \ 
     pageText, re.DOTALL) 
     body = re.search(r'"postingbody">(.+?)</section>', pageText, re.DOTALL) 
     openBody = False 
     openTitle = False 

     if body != None: 
      body = body.group(1) 
      openBody = openLink(body) 

     if title != None: 
      title = title.group(1) 
      openTitle = openLink(title) 

     if (openTitle and openBody) and (url not in fileRead) and (title not in fileRead): 
      fileWrite.write(title + "\n" + url + "\n") 

     fileWrite.close() 

homePage = "http://sfbay.craigslist.org" 
request = mechanize.Request(homePage) 
response = mechanize.urlopen(request) 
forms = mechanize.ParseResponse(response, backwards_compat=False) 
form = forms[0] 

request = form.click() 
response = mechanize.urlopen(request) 
emptySearch = response.geturl() 
request = mechanize.Request(emptySearch) 
response = mechanize.urlopen(request) 
forms = mechanize.ParseResponse(response, backwards_compat=False) 
form = forms[0] 

form["catAbb"] = ["bik"] 
form["maxAsk"] = "500" 
form.find_control("hasPic").items[0].selected = True 

for brand in brands: 
    form["query"] = brand 

    request = form.click() 
    response = mechanize.urlopen(request) 
    text = response.read() 

    fileR = open('bikes.txt', 'r').read() 
    fileA = open('bikes.txt', 'a') 

    scourPage(text, fileR, fileA) 

    fileA.close() 

    next = re.findall(r'class="nplink next".{0,50}<a href=\'(.+?)\'>', text, re.DOTALL) 

    while len(next) != 0: 
     text = urllib.urlopen(next[0]).read() 

     fileR = open('bikes.txt', 'r').read() 
     fileA = open('bikes.txt', 'a') 

     scourPage(text, fileR, fileA) 

     fileA.close() 

     next = re.findall(r'class="nplink next".{0,50}<a href=\'(.+?)\'>', text, re.DOTALL) 

Этот код гребни через Craigslist объявлений в попытке отсеять тех, что я не желаю. В этом случае я пытаюсь найти дорожный велосипед и избегать любых горных велосипедов и других списков.

UPDATE:

Прождав довольно долго, я, наконец, клавиатура снова прервали бег, и он остановился на form = mechanize.ParseResponse(response, backwards_compat=False) линии. Я попытался запустить его снова и получил эту ошибку:

Traceback (most recent call last): 
    File "bikes.py", line 97, in <module> 
    forms = mechanize.ParseResponse(response, backwards_compat=False) 
    File "build/bdist.macosx-10.8-intel/egg/mechanize/_form.py", line 945, in ParseResponse 
    File "build/bdist.macosx-10.8-intel/egg/mechanize/_form.py", line 981, in _ParseFileEx 
    File "build/bdist.macosx-10.8-intel/egg/mechanize/_form.py", line 758, in feed 
    File "build/bdist.macosx-10.8-intel/egg/mechanize/_sgmllib_copy.py", line 110, in feed 
    File "build/bdist.macosx-10.8-intel/egg/mechanize/_sgmllib_copy.py", line 192, in goahead 
    File "build/bdist.macosx-10.8-intel/egg/mechanize/_form.py", line 654, in handle_charref 
    File "build/bdist.macosx-10.8-intel/egg/mechanize/_form.py", line 149, in unescape_charref 
ValueError: unichr() arg not in range(0x10000) (narrow Python build) 
+0

Не могли бы вы предоставить нам код? – svineet

+0

Добавлено. Надеюсь, поможет. : X – Zhouster

ответ

0

Ваш while цикл может идти до бесконечности, который объясняет поведение. Вы проверяли это не так?

Ошибка выполнения, которую вы получаете, когда вы CTRL-C, ваш код не обязательно означает, что код не работает.

+0

Я разместил инструкции печати во всем цикле for for, и он не останавливается на строке «text = response.read()». Я уверен, что цикл while работает нормально, потому что, если бы он был бесконечным, это было бы печать множества заявлений, но это не так. Я думаю, что это связано с urllib, но это всего лишь предположение. – Zhouster

Смежные вопросы