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

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

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

Есть скрипт который успешно парсит обои из нужных категорий, но для одной категории нужна авторизация - авторизавался, а он все равно не дает парсить с этой ссылки как быть? (ош 404) Cкрипт авторизации:
авторизирует нормально: структура страницы меняется

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

textual
Листинг программы
import requests
import lxml.html
import re
import os
import time
 
def gettime():
    return time.strftime("%d.%m.%Y %H:%M:%S",time.localtime()) 
 
def get_pagination(html):
    tree = lxml.html.fromstring(html)
    num_page = tree.xpath('.//div[@class="navigation"]//a/text()')
    return int(num_page[-1])
 
pattern = re.compile(r'images/(\d+)/.+_(\d+)\..+')
 
def get_url_by_resolution(url,resolution):
    result = None
    match = pattern.search(url)
    if match:
        images,number = match.groups()
        result ='{host}/download.php?img={images}/{resolution}/nastol.com.ua-{number}.jpg'.format(
                host=host,
                images=images,
                resolution=resolution,
                number=number)
                
    return result
 
def get_original_url(html):
    tree = lxml.html.fromstring(html)
    url_original = tree.xpath('.//span[@class="orig"]//a/@href')
    return url_original
 
def save_image(image_name,content):
    with open(os.path.abspath(os.path.join('./Images/',image_name)),'wb') as f:
        f.write(content)
        print("Сохранен файл:",image_name,'|',gettime())
 
 
def main(resolution=None):
    
    form = {
    'login':'submit',
    'login_name':login,
    'login_password':password,
    'image':''
    }
    
    session = requests.Session()
    resp = session.post("{}/ero/".format(host),data=form)
    html = resp.text
    
    tree = lxml.html.fromstring(html)
    title = tree.xpath('.//title')[0].text
    
    if title == 'www.nastol.com.ua':
        raise Exception('Авторизация не пройдена!')
    print('Title:',title.encode(resp.encoding,'replace').decode('1251'))
    
    num_page = get_pagination(html)
    print('Всего страниц:',num_page)
    
    for page in range(1,num_page):
        resp = session.get('{}/ero/page/{}'.format(host,page))
        tree = lxml.html.fromstring(resp.text)
        # парсим на каждой странице 9 ссылок на страницы выбора вариантов загрузки
        hrefs = tree.xpath('.//a[@class="screen-link"]/@href')
        
        for href in hrefs:
            resp = session.get(href)
            #  страницы выбора вариантов загрузки берем url на оригинальную картиинку
            url_original = get_original_url(resp.text)
            if not url_original:
                print('Url для загрузки оригинального изображения не найден.')     
            else:
                url = '{}/{}'.format(host,url_original[0])
                #  для выбора по разршению - get_url_by_resolution(url,resolution)
                if resolution:
                    url = get_url_by_resolution(url,resolution)
                    if url is not None:
                        image_name = url.split('-')[1]
                    else:
                        print('Для данного разрешения {} изображение не найдено' % resolution)
                else:
                    image_name = url.split('_')[1]
                
                print(url)
                resp = session.get(url)
                status = resp.status_code
                if status == 200:
                    try:
                        save_image(image_name,resp.content)
                    except OSError as err:
                        print(err)
                else:
                    print('Status:',status,url)                
 
if __name__ == "__main__":
    host = 'http://www.nastol.com.ua'
    try:
        main(resolution='1920x1080')
    except KeyboardInterrupt:
        pass

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

8   голосов , оценка 4.25 из 5
Похожие ответы