2015-06-30 5 views
0

Я пытаюсь очистить метеорологические данные от weatherunderground и использовать библиотеку multiprocessing.dummy для запуска моих запросов через разные потоки. Я получаю сообщение об ошибке при запуске следующего кода, и мне было интересно, сможет ли кто-нибудь пройти через то, что происходит, и возможное решение. Примечание: мой код может быть отключен.Python Скребок многопоточности

from bs4 import BeautifulSoup # HTML Text Parsing Package 
from urllib2 import urlopen # Package to read URLs 
import requests # Package to actually request URL 
import nltk 
import re 
import itertools as ite 
import pandas as pd 
def scrape(urls): 
    actual_temp = [] 
    string = requests.get(URL) 
    soup = BeautifulSoup(string) 
    actual_temp_tag = soup.find_all(class_ = "wx-value")[0] 
    actual_temp.append(actual_temp_tag.string) 
    return actual_temp 

URLs = [] 
for j in range(1,2): 
    for i in range(1,32): 
     SUB_URL = 'http://www.wunderground.com/history/airport/KBOS/2014/' + str(j) + '/' + str(i) + '/' + '/DailyHistory.html' 
     URLs.append(SUB_URL) 


from multiprocessing.dummy import Pool as ThreadPool 

pool = ThreadPool(8) 
results = pool.map(scrape, URLs) 

pool.close() 
pool.join() 

Ниже приводится сообщение об ошибке я получаю:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Users\bwei\Downloads\WinPython-64bit-2.7.9.4\python-2.7.9.amd64\lib\multiprocessing\pool.py", line 251, in map 
    return self.map_async(func, iterable, chunksize).get() 
    File "C:\Users\bwei\Downloads\WinPython-64bit-2.7.9.4\python-2.7.9.amd64\lib\multiprocessing\pool.py", line 558, in get 
    raise self._value 
TypeError: object of type 'Response' has no len() 

В дополнение раз моя программа была выполнена, как я закрываю все нити? Я заметил, что после того, как мой% доступной памяти повысился, но не возвращается после запуска

+0

Что ошибка вы получаете .. сообщение 'Traceback' сообщение –

+0

Просто добавил сообщение об ошибке на вопрос – mangodreamz

+0

' строка = requests.get (URL) '' request.get' возвращает объект ответа, а не строку. –

ответ

4

Не пропустите string, объект requests.models.Response, до BeautifulSoup. Pass string.contents вместо:

In [124]: type(string) 
Out[124]: requests.models.Response 

In [120]: BeautifulSoup(string) 
TypeError: object of type 'Response' has no len() 

In [126]: soup = BeautifulSoup(string.content) 

Кроме того, ваша scrape функция относится к URL, который должен был NameError, так как он не определен. Вместо того, чтобы передать аргумент url к requests.get:

def scrape(url): 
    actual_temp = [] 
    string = requests.get(url) 
    soup = BeautifulSoup(string.content) 
    actual_temp_tag = soup.find_all(class_ = "wx-value")[0] 
    actual_temp.append(actual_temp_tag.string) 
    return actual_temp 
+0

это прекрасно! Спасибо огромное! – mangodreamz

+0

У меня также есть еще один вопрос. Естественно, когда я запускаю этот код, мой% доступной памяти увеличивается. Однако после того, как я закончу и закрываю бассейн, он фактически не падает. Есть ли способ закрыть потоки после того, как я закончил с кодом? – mangodreamz

+1

[Память не может быть возвращена операционной системе] (http://effbot.org/pyfaq/why-doesnt-python-release-the-memory-when-i-delete-a-large-object.htm) до процесс python завершается. Если вы завернете весь свой существующий код в функции, вы можете использовать 'multiprocessing.Process' для запуска этой функции в отдельном процессе. Затем он может вернуть результат в основной процесс * и * завершить подпроцесс, тем самым возвращая память, потребляемую подпроцессом, в операционную систему. – unutbu

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