2016-11-05 6 views
1

Я следую книге «Автоматизация скучных задач с помощью Python», и я пытаюсь создать прогрму, которая загружает несколько комиксов с http://xkcd.com одновременно, но столкнулась с некоторыми проблемами. Я копирую ту же самую программу, что и в книге.Многопоточность в Python

Вот мой код:

# multidownloadXkcd.py - Downloads XKCD comics using multiple threads. 

import requests, os ,bs4, threading 

os.chdir('c:\\users\\patty\\desktop') 
os.makedirs('xkcd', exist_ok=True) # store comics on ./xkcd 

def downloadXkcd(startComic, endComic):    
    for urlNumber in range(startComic, endComic):     
     #Download the page 
     print('Downloading page http://xkcd.com/%s...' %(urlNumber)) 
     res = requests.get('http://xkcd.com/%s' % (urlNumber)) 
     res.raise_for_status() 

     soup= bs4.BeautifulSoup(res.text, "html.parser")   

     #Find the URL of the comic image. 
     comicElem = soup.select('#comic img') 
     if comicElem == []: 
      print('Could not find comic image.') 
     else: 
      comicUrl = comicElem[0].get('src') 
      #Download the image. 
      print('Downloading image %s...' % (comicUrl)) 
      res = requests.get(comicUrl, "html.parser") 
      res.raise_for_status() 

      #Save the image to ./xkcd. 
      imageFile = open(os.path.join('xkcd', os.path.basename(comicUrl)), 'wb') 
      for chunk in res.iter_content(100000): 
       imageFile.write(chunk) 
      imageFile.close() 

downloadThreads = []    # a list of all the Thread objects 
for i in range(0,1400, 100):  # loops 14 times, creates 14 threads 
    downloadThread = threading.Thread(target=downloadXkcd, args=(i, i + 99)) 
    downloadThreads.append(downloadThread) 
    downloadThread.start() 

# Wait for all threads to end. 
for downloadThread in downloadThreads: 
    downloadThread.join() 
print('Done.') 

Я получаю следующее исключение:

Exception in thread Thread-1: 
Traceback (most recent call last): 
    File "C:\Python\Python35\lib\threading.py", line 914, in _bootstrap_inner 
    self.run() 
    File "C:\Python\Python35\lib\threading.py", line 862, in run 
    self._target(*self._args, **self._kwargs) 
    File "C:\Users\PATTY\PycharmProjects\CH15_TASKS\practice.py", line 13, in downloadXkcd 
    res.raise_for_status() 
    File "C:\Python\Python35\lib\site-packages\requests\models.py", line 862, in raise_for_status 
    raise HTTPError(http_error_msg, response=self) 
requests.exceptions.HTTPError: 404 Client Error: Not Found for url: http://xkcd.com/0 
Exception in thread Thread-2: 
Traceback (most recent call last): 
    File "C:\Python\Python35\lib\threading.py", line 914, in _bootstrap_inner 
    self.run() 
    File "C:\Python\Python35\lib\threading.py", line 862, in run 
    self._target(*self._args, **self._kwargs) 
    File "C:\Users\PATTY\PycharmProjects\CH15_TASKS\practice.py", line 25, in downloadXkcd 
    res = requests.get(comicUrl, "html.parser") 
    File "C:\Python\Python35\lib\site-packages\requests\api.py", line 70, in get 
    return request('get', url, params=params, **kwargs) 
    File "C:\Python\Python35\lib\site-packages\requests\api.py", line 56, in request 
    return session.request(method=method, url=url, **kwargs) 
    File "C:\Python\Python35\lib\site-packages\requests\sessions.py", line 461, in request 
    prep = self.prepare_request(req) 
    File "C:\Python\Python35\lib\site-packages\requests\sessions.py", line 394, in prepare_request 
    hooks=merge_hooks(request.hooks, self.hooks), 
    File "C:\Python\Python35\lib\site-packages\requests\models.py", line 294, in prepare 
    self.prepare_url(url, params) 
    File "C:\Python\Python35\lib\site-packages\requests\models.py", line 354, in prepare_url 
    raise MissingSchema(error) 
requests.exceptions.MissingSchema: Invalid URL '//imgs.xkcd.com/comics/family_circus.jpg': No schema supplied. Perhaps you meant http:////imgs.xkcd.com/comics/family_circus.jpg? 

Это говорит о том, что URL является недействительным, но всякий раз, когда я копировать вставить этот адрес в webrowser, кажется, действительны. Кто-нибудь знает, как я исправить это? Спасибо

+5

Исправить ваш URL. Просто потому, что ваш браузер исправляет его, вы не делаете его действительным. – spectras

+3

Проблема заключается в том, что тег 'src' атрибута' 'не имеет' http: // 'или' https: // 'указанный ..., который действителен в браузере, а не с' запросами'. См. Http://stackoverflow.com/questions/30770213/no-schema-supplied-and-other-errors-with-using-requests-get. – charlierproctor

+0

Спасибо Это работает сейчас. – tadm123

ответ

2

Да, как сказал @spectras, только потому, что ваш URL-адрес исправляет ваш URL-адрес, это не значит, что это действительно так. Попробуйте использовать «http://www». перед ним и попытаться выяснить, работает ли его.

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