Парсинг картинок с nastol.com.ua - Python

Узнай цену своей работы

Формулировка задачи:

Есть скрипт который успешно парсит обои из нужных категорий, но для одной категории нужна авторизация - авторизавался, а он все равно не дает парсить с этой ссылки как быть? (ош 404) Cкрипт авторизации:
Листинг программы
  1. def auth():
  2. session = requests.Session()
  3. url ='http://www.nastol.com.ua/index.php'
  4. params = {'login':"submit",'login_name':"DarkChirik",
  5. 'login_password':"e2RmE5ars09",
  6. 'image':"%C2%EE%E9%F2%E8"}
  7.  
  8. r = session.post(url,params)
авторизирует нормально: структура страницы меняется

Решение задачи: «Парсинг картинок с nastol.com.ua»

textual
Листинг программы
  1. import requests
  2. import lxml.html
  3. import re
  4. import os
  5. import time
  6.  
  7. def gettime():
  8.     return time.strftime("%d.%m.%Y %H:%M:%S",time.localtime())
  9.  
  10. def get_pagination(html):
  11.     tree = lxml.html.fromstring(html)
  12.     num_page = tree.xpath('.//div[@class="navigation"]//a/text()')
  13.     return int(num_page[-1])
  14.  
  15. pattern = re.compile(r'images/(\d+)/.+_(\d+)\..+')
  16.  
  17. def get_url_by_resolution(url,resolution):
  18.     result = None
  19.     match = pattern.search(url)
  20.     if match:
  21.         images,number = match.groups()
  22.         result ='{host}/download.php?img={images}/{resolution}/nastol.com.ua-{number}.jpg'.format(
  23.                 host=host,
  24.                 images=images,
  25.                 resolution=resolution,
  26.                 number=number)
  27.                
  28.     return result
  29.  
  30. def get_original_url(html):
  31.     tree = lxml.html.fromstring(html)
  32.     url_original = tree.xpath('.//span[@class="orig"]//a/@href')
  33.     return url_original
  34.  
  35. def save_image(image_name,content):
  36.     with open(os.path.abspath(os.path.join('./Images/',image_name)),'wb') as f:
  37.         f.write(content)
  38.         print("Сохранен файл:",image_name,'|',gettime())
  39.  
  40.  
  41. def main(resolution=None):
  42.    
  43.     form = {
  44.     'login':'submit',
  45.     'login_name':login,
  46.     'login_password':password,
  47.     'image':''
  48.     }
  49.    
  50.     session = requests.Session()
  51.     resp = session.post("{}/ero/".format(host),data=form)
  52.     html = resp.text
  53.    
  54.     tree = lxml.html.fromstring(html)
  55.     title = tree.xpath('.//title')[0].text
  56.    
  57.     if title == 'www.nastol.com.ua':
  58.         raise Exception('Авторизация не пройдена!')
  59.     print('Title:',title.encode(resp.encoding,'replace').decode('1251'))
  60.    
  61.     num_page = get_pagination(html)
  62.     print('Всего страниц:',num_page)
  63.    
  64.     for page in range(1,num_page):
  65.         resp = session.get('{}/ero/page/{}'.format(host,page))
  66.         tree = lxml.html.fromstring(resp.text)
  67.         # парсим на каждой странице 9 ссылок на страницы выбора вариантов загрузки
  68.         hrefs = tree.xpath('.//a[@class="screen-link"]/@href')
  69.        
  70.         for href in hrefs:
  71.             resp = session.get(href)
  72.             #  страницы выбора вариантов загрузки берем url на оригинальную картиинку
  73.             url_original = get_original_url(resp.text)
  74.             if not url_original:
  75.                 print('Url для загрузки оригинального изображения не найден.')    
  76.             else:
  77.                 url = '{}/{}'.format(host,url_original[0])
  78.                 #  для выбора по разршению - get_url_by_resolution(url,resolution)
  79.                 if resolution:
  80.                     url = get_url_by_resolution(url,resolution)
  81.                     if url is not None:
  82.                         image_name = url.split('-')[1]
  83.                     else:
  84.                         print('Для данного разрешения {} изображение не найдено' % resolution)
  85.                 else:
  86.                     image_name = url.split('_')[1]
  87.                
  88.                 print(url)
  89.                 resp = session.get(url)
  90.                 status = resp.status_code
  91.                 if status == 200:
  92.                     try:
  93.                         save_image(image_name,resp.content)
  94.                     except OSError as err:
  95.                         print(err)
  96.                 else:
  97.                     print('Status:',status,url)                
  98.  
  99. if __name__ == "__main__":
  100.     host = 'http://www.nastol.com.ua'
  101.     try:
  102.         main(resolution='1920x1080')
  103.     except KeyboardInterrupt:
  104.         pass

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.25 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы