1

Я пытаюсь сделать парсер на основе "AngleSharp".
Я использую следующий код для скачивания:

var itemsAttr = document.QuerySelectorAll("img[id='print_user_photo']"); 
string foto_url = itemsAttr[0].GetAttribute("src");
string path = pathFolderIMG + id_source + ".jpg";

WebClient webClient = new WebClient(); 
webClient.DownloadFile(foto_url, path);

Для страниц "type_1" - ссылка - код работает.
Для страниц "type_2" - ссылка - код не работает.

Для "type_2" картинка находится по ссылке - ссылка

Как скачать фотографии для страниц "type_2"?

A K
  • 28,718
eusataf
  • 249
  • 1
  • 8
  • Вероятно, в вопросе следовало как-то акцентировать внимание на том, что "не работает" - это не значит "не находит на странице / не парсится", а что "не работает" - получаю 404 ошибку. В итоге я например сначала отвечал по сути не на тот вопрос, что вы хотели задать. – A K Jan 07 '19 at 06:38

1 Answers1

3

Насколько я вижу, эти картинки имеют два адреса: первоначально грузится картинка в плохом качестве, а потом лениво грузится крупная картинка.

введите сюда описание изображения

Ну тогда так:

var img = document.QuerySelectorAll("img#print_user_photo").First();
//img.Attributes.Dump();
string foto_url = img.GetAttribute("data-pagespeed-lazy-src");

Но сайт отдаёт 404 в случае если реферрер пустой - видимо минимальная защита от скачивания. Делайте так:

WebClient webClient = new WebClient();
webClient.Headers.Add("Referer",@"https://rabota.by/resume/view/342239/");
webClient.DownloadFile(foto_url, path);
A K
  • 28,718
  • 1
    Любопытно, что хотя ссылка нашлась именно та, что вы просили - но она не качается (404 Not Found) при помощи webClient - только из браузера. Видимо, стоит какая-то защита от скачивания, причём только для изображений с этого сервера? (Фото с ссылки type_1 скачалась без проблем) Но это видимо повод для другого вопроса. – A K Jan 06 '19 at 22:05
  • 1
    Можно защиту обойти через взятие скриншота страницы и вырезание по позиции и размеру картинки на странице. – Andrew Stop_RU_war_in_UA Jan 06 '19 at 22:52
  • 1
    А еще можно открыть, например, CEF инстанс и сохранить страницу с разрешением ".png" – Andrew Stop_RU_war_in_UA Jan 06 '19 at 23:26
  • @Andrew Это как построить целый город ради одного бара. Не кажется лишним? – EvgeniyZ Jan 06 '19 at 23:59
  • 1
    @EvgeniyZ Кажется. Но иногда самое правильное решение - самое простое, даже если оно излишне дофига ресурсов жрет. Мы не знаем что за проэкт у парня. Может это какая-то однодневка и нужно не "правильное" решение, а быстрое решение. А то что я предложил - сработает как нужно и достаточно просто и быстро реализуется. – Andrew Stop_RU_war_in_UA Jan 07 '19 at 00:06
  • @A K 0. По моему ваше решение дублирует мой вопрос. Т.е. у меня принцип тотоже: селектор + атриббут = получаю ссылку. Картинка не скачивается. 1. (Фото с ссылки type_1 скачалась без проблем) Но это видимо повод для другого вопроса. - у меня как раз проблема со страницами "type_2". Буду признателен, если предложите решение по этому вопросу. 2. Я не нахожу аттрибут "data-pagespeed-lazy-src". Не могли бы вы уточнить, где он находится? 3. Какую программу вы используете? Т.е., что за программа у вас на картинке? – eusataf Jan 07 '19 at 06:11
  • @Andrew 1. защиту обойти через взятие скриншота страницы - не могли бы вы продемонтстрировать, полностью или кратко. 2. можно открыть, например, CEF инстанс и сохранить страницу - не могли бы вы продемонтстрировать, полностью или кратко. 3. Мы не знаем что за проэкт у парня - просто парсер для длительного использования – eusataf Jan 07 '19 at 06:12
  • Наверное куки нужны – eusataf Jan 07 '19 at 06:17
  • 1
    @eusataf 0 я прочитал ваш вопрос "не могу распарсить", возможно вам нужно более чётко формулировать вопрос, либо мне перестать читать so в полусонном состоянии. 1. см. тут 2. см. img.Attributes - специально оставил в коде комментарий 3. linqpad, очень удобен для быстрого прототипирования – A K Jan 07 '19 at 06:27
  • 1
    @eusataf Посмотрел, почему не качается. Сайт проверяет реферрер. Дополнил ответ. – A K Jan 07 '19 at 06:35
  • @A K Работает. Посмотрел, почему не качается. Сайт проверяет реферрер - если вам несложно, уточните как вы определили, что требуется рефер? – eusataf Jan 07 '19 at 09:22
  • 1
    @eusataf Нужно сравнивать запрос из браузера с отправляемым автоматикой и выискивать минимальный набор свойств, при которых для сайта нет разницы между ручными и автоматическими. Реферрер, заголовки и куки - это всегда нужно проверять в первую очередь при создании парсеров сайтов. За конкретной техникой снова отправлю к этому замечательному ответу. – A K Jan 07 '19 at 09:25
  • 2
    @eusataf 'ScreenshotAsync();' метод у CefOffscreen инстанса. если оно захватит больше чем даную картинку, то нужно еще при помощи js скрипта определить позицию и размер картинки ( https://stackoverflow.com/questions/5633264/javascript-get-image-dimensions ). Но имей ввиду, мегабайт 50-100 оперативы оно пожрет только так. Ведь, это инстанс полноценного браузера. – Andrew Stop_RU_war_in_UA Jan 07 '19 at 13:06