Парсинг картинок с 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