Скребковые изображения повреждены

86
11

Привет, я пытаюсь очистить изображения на главной странице digg.com, используя следующий код. Проблема в том, что 0.jpg до 6.jpg являются нормальными. Начиная с 7.jpg до 47.jpg являются коррумпированными. Не знаю, почему.

Вот код. Гитуб здесь: https://github.com/kenpeter/py_mm

# os
import os
# http request
import requests
#
import pprint

import time

# import html from lxml
from lxml import html

# global
global_page_num = 0
pp = pprint.PrettyPrinter(indent=4)

# write to file
def download_image(img_urls):
# total img urls
amount = len(img_urls)

# loop
for index, value in enumerate(img_urls, start=0):
# file name
filename = 'img/%s.jpg' % (index)
# dir
os.makedirs(os.path.dirname(filename), exist_ok=True)

print('--- start ---')
print('filename: %s' % filename)
print('Downloading: %s out of %s' % (index, amount))

# open file
with open(filename, 'wb') as f:
# f write
# time.sleep(1)
f.write(requests.get(value).content)

def get_page_number(num):
url = 'http://digg.com'
response = requests.get(url).content
selector = html.fromstring(response)

img_urls = []
img_urls = selector.xpath("//div[@class='digg-story__image--thumb']/a/img/@src")

news_texts = []
news_texts = selector.xpath("//div[@itemprop='description']/text()")

# test
# print('--- something ---')
# pp.pprint(img_urls)
# pp.pprint(news_texts)

download_image(img_urls)

return img_urls

if __name__ == '__main__':
# input, page_number, everything into the var
# page_number = input('Please enter the page number that you want to scrape:')

# global_page_num
# global_page_num = page_number;
# print('hell world!');

page_number = 4 # hardcode
get_page_number(page_number)

спросил(а) 2017-04-21T06:40:00+03:00 3 года, 10 месяцев назад
1
Решение
96

Причина, по которой изображения являются "поврежденными", заключается в том, что схема изменяется на странице, и изображения начинают "скрываться" в атрибуте data-src вместо src содержимое которого вы захватываете своим кодом. См. Здесь пример исходного кода захваченной страницы с обоими атрибутами:

<img
class="digg-story__image-img js--digg-story__image-img lazy-image-img need-offset"
data-src="http://static.digg.com/images/f0b92c2d8a2c4b7f829abbc0e58a408c_2oijd0Z_1_www_large_thumb.jpeg"
src="http://static.digg.com/static/fe/944294/images/x_455x248.png"
width="312"
height="170"
alt=""
/>

Другими словами, вы должны проверить оба атрибута src и data-src предоставляя приоритет src data-src src при создании списка URL-адресов изображений.

Этот код выполняет "трюк" и загружает правильные изображения:

# os
import os
# http request
import requests
#
import pprint

import time

# import html from lxml
from lxml import html

# global
global_page_num = 0
pp = pprint.PrettyPrinter(indent=4)

# write to file
def download_image(img_urls):
# total img urls
amount = len(img_urls)

# loop
for index, value in enumerate(img_urls, start=0):
# file name
filename = 'img/%s.jpg' % (index)
# dir
os.makedirs(os.path.dirname(filename), exist_ok=True)

print('--- start ---')
print('filename: %s' % filename)
print('Downloading: %s out of %s' % (index, amount))

# open file
with open(filename, 'wb') as f:
# f write
# time.sleep(1)
f.write(requests.get(value).content)

def get_page_number(num):
url = 'http://digg.com'
response = requests.get(url).content
selector = html.fromstring(response)

img_urls = []
img_urls_1a = selector.xpath("//div[@class='digg-story__image--thumb']/a/img/@src")
img_urls_1b = [item for item in img_urls_1a if 'x_455x248.png' not in item]
img_urls_2 = selector.xpath("//div[@class='digg-story__image--thumb']/a/img/@data-src")
img_urls = img_urls_1b + img_urls_2
# print(img_urls)
news_texts = []
news_texts = selector.xpath("//div[@itemprop='description']/text()")

# test
# print('--- something ---')
# pp.pprint(img_urls)
# pp.pprint(news_texts)

download_image(img_urls)

return img_urls

if __name__ == '__main__':
# input, page_number, everything into the var
# page_number = input('Please enter the page number that you want to scrape:')

# global_page_num
# global_page_num = page_number;
# print('hell world!');

page_number = 4 # hardcode
get_page_number(page_number)

ответил(а) 2017-04-21T06:58:00+03:00 3 года, 10 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема