Проблема с парсингом в Amazon

KashaP

Client
Регистрация
20.05.2016
Сообщения
84
Благодарностей
4
Баллы
8
Пытаюсь спарсить ссылки на товары с определенной категории, на 1 странице 24 ссылки, но результат либо 20 либо 35. Как быть? Может у кого нибудь была подобная проблема?

Как я пытаюсь это сделать:
1. Захожу в дом страницы нахожу там ссылку первого товара
2. Заполняю это есть перед и это есть после искомого текста
3. Получаю результат, либо 20 либо 35, но никак не 24 (
 

AloneSlamer

Client
Регистрация
29.01.2013
Сообщения
1 404
Благодарностей
362
Баллы
83

Обращаем Ваше внимание на то, что данный пользователь заблокирован.
Не рекомендуем проводить с AloneSlamer какие-либо сделки.

вот поэтому я и назначал за парсинг амазона нормальную цену
 

KashaP

Client
Регистрация
20.05.2016
Сообщения
84
Благодарностей
4
Баллы
8

qzen4i

Client
Регистрация
01.05.2014
Сообщения
1 408
Благодарностей
314
Баллы
83
Если не разобрался, в скайп напиши, помогу.
 

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
  • Спасибо
Реакции: Wide

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
Понапридумывали языков SQL, XPath, регулярки, LINQ, а новичкам приходится их учить наравне с основным языком программирования наподобие C#, java и т.д.
 
  • Спасибо
Реакции: AZANIR и Wide

Wide

Client
Регистрация
04.02.2013
Сообщения
945
Благодарностей
257
Баллы
63
Попробуй юзать не регулярки, а xpath.
Код:
.//div[@class='a-row a-spacing-none']/a[contains(@class, 'a-link-normal s-access-detail-page')]/@href
может покажете как на в зеньке использовать? у мну ничего не получается((
 

silent

Client
Регистрация
05.04.2014
Сообщения
237
Благодарностей
85
Баллы
28
Понапридумывали языков SQL, XPath, регулярки, LINQ, а новичкам приходится их учить наравне с основным языком программирования наподобие C#, java и т.д.
ты так говоришь, как будто это что-то сложное, бгг
инфы по xpath полно на любом языке.
 

Wide

Client
Регистрация
04.02.2013
Сообщения
945
Благодарностей
257
Баллы
63
Пытаюсь спарсить ссылки на товары с определенной категории, на 1 странице 24 ссылки, но результат либо 20 либо 35. Как быть? Может у кого нибудь была подобная проблема?

Как я пытаюсь это сделать:
1. Захожу в дом страницы нахожу там ссылку первого товара
2. Заполняю это есть перед и это есть после искомого текста
3. Получаю результат, либо 20 либо 35, но никак не 24 (
попробуй мой способ. сперва парсим блок с результатами, потом блок с товаром, а из него уже тянем ссылку
 

Вложения

Wide

Client
Регистрация
04.02.2013
Сообщения
945
Благодарностей
257
Баллы
63
хотя нет, вот через гет. насколько я понял, там ещё какие то результаты добавляются в диве
Код:
<div id="results-atf-next" style="display: none;">
 

Вложения

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
  • Спасибо
Реакции: pg2016 и Wide

Wide

Client
Регистрация
04.02.2013
Сообщения
945
Благодарностей
257
Баллы
63
Вот пример как юзать через запросы.
http://zennolab.com/discussion/threads/pomogite-s-parsingom-teksta.28069/#post-235994

А то что на скрине, конструктор xpath/JSONPath, это для xml.
друг, я и так с регулярками не дружу, а тут ещё xpath по линку не понял ни чего)) если не не сложно скинь пример, чего уж ломать наши умы))
 

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
друг, я и так с регулярками не дружу, а тут ещё xpath по линку не понял ни чего)) если не не сложно скинь пример, чего уж ломать наши умы))
:D
А в чем там собственно проблема то.
ТС надо вытащить инфу со страницы. Так понимаю не с одной страницы.:-)
Т.е. это парсер. Соответственно он должен работать быстро, чтобы прокачивать большой объем инфы.
И тут вариант только один - делать через запросы. Можно конечно и через браузер, но какбы это помоему извращение.

Соответственно по ссылке было показано, как через запросы брать html страницу, а потом через xpath используя HtmlAgilityPack вытащить нужную инфу.

Вот тут и надо воткнуть xpath выражение, в списке будут все ссылки.
Код:
var list= doc.DocumentNode
    .SelectNodes("".//div[@class='a-row a-spacing-none']/a[contains(@class, 'a-link-normal s-access-detail-page')]"") // взяли нужные узлы
    .Select(n => n.GetAttributeValue("href", "")) //взяли значение атрибута href
    .ToList();
Если через браузер, то в зенке уже есть встроенные методы для работы с xpath.

Код:
var hrefs = instance
   .ActiveTab
   .GetDocumentByAddress("0")
   .FindElementsByXPath(".//div[@class='a-row a-spacing-none']/a[contains(@class, 'a-link-normal s-access-detail-page')]")
   .Select(h => h.GetAttribute("href"))
   .ToList();
  
foreach(var href in hrefs)
{
   project.SendInfoToLog(href, true);
}

А вообще в xpath ничего сложного нет. Не надо лезть в дебри xpath и разбираться с конструкциями, которые посути нах не нужны.
Ну по крайней мере для начала.:-)

В 90% случаев достаточно понимать две конструкции.
тэг[@атрибут='значение атрибута')]
тэг[contains(@атрибут, 'значение атрибута')]

Тэг может быть или какой то конкретный, скажем div, a, span и т.д. или любой, обозначается *.
Также * можно обозначить любой атрибут.
То что в скобках, не обязательно, это условие поиска нужной ноды, если например просто указать div, то будут взяты все ноды с таким тегом.

/ — корневой узел
// — множество узлов удовлетворяющих следющему условию
* — любые символы
@ — атрибут
[] — задает условие
Все. Вот эти пять элементов понимать, и как их собирать в конструкцию, и этого хватит в большинстве случаев.

По двум конструкциям.
Первый вариант, это строгое условие.
Второй - "содержит", значение атрибута содержит какой то текст.

Например есть вот такие ноды
Код:
<li class="serp-item" data-16sh="" data-sb8j="" data-cid="1">
<li class="serp-item serp-item_keyboard-shortcuts-ignore_yes" data-cid="4">
Как взять именно такие ноды? Вот тут и нужен contains.
Код:
бла-бла-бла/li[contains(@class, 'serp-item']
Т.к. serp-item есть в значении атрибута class в обеих нодах, то такие ноды и возьмутся.

А дальше все просто, путь до нужных нод указывается как путь к какой то папке на компе, через слэш - / .
Код:
//тэг[@атрибут='значение атрибута')]/тэг[@атрибут='значение атрибута')]/тэг/тэг[contains(@атрибут, 'значение атрибута')]
Вложенность может быть любая. Основная трабла, это в каждом конкретном случает приходится поломать голову, как спуститься до нужной ноды.:-)

В firefox есть удобная штука - плаги FirePath, как дополнение к другому плагину - FireBug.
C помощью него очень удобно конструировать/тестить xpath выражения.

Аналогичная возможность есть и в других браузерах. Но я привык к firefox, и юзаю в нем.
Надеюсь данная памятка поможет осилить xpath.:-)
 

silent

Client
Регистрация
05.04.2014
Сообщения
237
Благодарностей
85
Баллы
28
  • Спасибо
Реакции: moRL

Wide

Client
Регистрация
04.02.2013
Сообщения
945
Благодарностей
257
Баллы
63
:D
А в чем там собственно проблема то.
ТС надо вытащить инфу со страницы. Так понимаю не с одной страницы.:-)
Т.е. это парсер. Соответственно он должен работать быстро, чтобы прокачивать большой объем инфы.
И тут вариант только один - делать через запросы. Можно конечно и через браузер, но какбы это помоему извращение.

Соответственно по ссылке было показано, как через запросы брать html страницу, а потом через xpath используя HtmlAgilityPack вытащить нужную инфу.

Вот тут и надо воткнуть xpath выражение, в списке будут все ссылки.
Код:
var list= doc.DocumentNode
    .SelectNodes("".//div[@class='a-row a-spacing-none']/a[contains(@class, 'a-link-normal s-access-detail-page')]"") // взяли нужные узлы
    .Select(n => n.GetAttributeValue("href", "")) //взяли значение атрибута href
    .ToList();
Если через браузер, то в зенке уже есть встроенные методы для работы с xpath.

Код:
var hrefs = instance
   .ActiveTab
   .GetDocumentByAddress("0")
   .FindElementsByXPath(".//div[@class='a-row a-spacing-none']/a[contains(@class, 'a-link-normal s-access-detail-page')]")
   .Select(h => h.GetAttribute("href"))
   .ToList();

foreach(var href in hrefs)
{
   project.SendInfoToLog(href, true);
}

А вообще в xpath ничего сложного нет. Не надо лезть в дебри xpath и разбираться с конструкциями, которые посути нах не нужны.
Ну по крайней мере для начала.:-)

В 90% случаев достаточно понимать две конструкции.
тэг[@атрибут='значение атрибута')]
тэг[contains(@атрибут, 'значение атрибута')]

Тэг может быть или какой то конкретный, скажем div, a, span и т.д. или любой, обозначается *.
Также * можно обозначить любой атрибут.
То что в скобках, не обязательно, это условие поиска нужной ноды, если например просто указать div, то будут взяты все ноды с таким тегом.

/ — корневой узел
// — множество узлов удовлетворяющих следющему условию
* — любые символы
@ — атрибут
[] — задает условие
Все. Вот эти пять элементов понимать, и как их собирать в конструкцию, и этого хватит в большинстве случаев.

По двум конструкциям.
Первый вариант, это строгое условие.
Второй - "содержит", значение атрибута содержит какой то текст.

Например есть вот такие ноды
Код:
<li class="serp-item" data-16sh="" data-sb8j="" data-cid="1">
<li class="serp-item serp-item_keyboard-shortcuts-ignore_yes" data-cid="4">
Как взять именно такие ноды? Вот тут и нужен contains.
Код:
бла-бла-бла/li[contains(@class, 'serp-item']
Т.к. serp-item есть в значении атрибута class в обеих нодах, то такие ноды и возьмутся.

А дальше все просто, путь до нужных нод указывается как путь к какой то папке на компе, через слэш - / .
Код:
//тэг[@атрибут='значение атрибута')]/тэг[@атрибут='значение атрибута')]/тэг/тэг[contains(@атрибут, 'значение атрибута')]
Вложенность может быть любая. Основная трабла, это в каждом конкретном случает приходится поломать голову, как спуститься до нужной ноды.:-)

В firefox есть удобная штука - плаги FirePath, как дополнение к другому плагину - FireBug.
C помощью него очень удобно конструировать/тестить xpath выражения.

Аналогичная возможность есть и в других браузерах. Но я привык к firefox, и юзаю в нем.
Надеюсь данная памятка поможет осилить xpath.:-)
прям мозг мне вынес этим сообщением)) я думал что всё уже видел в этой жизни, но микро диссертация в одном посте это сильно)) аплодирую стоя!!
 
Последнее редактирование:

Wide

Client
Регистрация
04.02.2013
Сообщения
945
Благодарностей
257
Баллы
63
ну блин криворукий я в край)) оба метода пробовал. не один не завёлся
 

Вложения

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
ну блин криворукий я в край)) оба метода пробовал. не один не завёлся
Так логи то для кого пишутся? Там же пишется что за ошибка.
Двойные кавычки. Тут даже сразу подсвечивается что косяк.


Если используется HtmlAgilityPack кто ее будет добавлять и using прописывать?
Зенка сама не добавит.))
https://htmlagilitypack.codeplex.com/


Дальше, ссылка что была у ТС и у тебя разная. Проверяем xpath. Не пашет. Значит разбираемся почему и делаем другой xpath.

А теперь работает


Ок, ссылки взялись, но как ты собрался получить их количество? Список то ты создал, а добавлять в него строчки кто будет.
Зенка?))



Чтобы сделать xpath, который бы норм парсил амазон, это надо проверить множество вариантов, т.к. амазон любит менять разметку.
Поэтому естественно, если в одном месте работает, то вдругом может не работать. Т.е надо посидеть поковыряться, пошевелить мозгом.

Ну и как бы на будущее. Надо учиться работать с логом, читать что там пишется, и учиться решать проблемы.
Т.к без этого тяжеловато будет.))

В архиве либа HtmlAgilityPack, ее надо закинуть в ExternalAssemblies в папке зенки.
 

Вложения

  • Спасибо
Реакции: artinet, jenchy и Wide

silent

Client
Регистрация
05.04.2014
Сообщения
237
Благодарностей
85
Баллы
28
ответили выше
 
Последнее редактирование:

Wide

Client
Регистрация
04.02.2013
Сообщения
945
Благодарностей
257
Баллы
63
Так логи то для кого пишутся? Там же пишется что за ошибка.
Двойные кавычки. Тут даже сразу подсвечивается что косяк.


Если используется HtmlAgilityPack кто ее будет добавлять и using прописывать?
Зенка сама не добавит.))
https://htmlagilitypack.codeplex.com/


Дальше, ссылка что была у ТС и у тебя разная. Проверяем xpath. Не пашет. Значит разбираемся почему и делаем другой xpath.

А теперь работает


Ок, ссылки взялись, но как ты собрался получить их количество? Список то ты создал, а добавлять в него строчки кто будет.
Зенка?))



Чтобы сделать xpath, который бы норм парсил амазон, это надо проверить множество вариантов, т.к. амазон любит менять разметку.
Поэтому естественно, если в одном месте работает, то вдругом может не работать. Т.е надо посидеть поковыряться, пошевелить мозгом.

Ну и как бы на будущее. Надо учиться работать с логом, читать что там пишется, и учиться решать проблемы.
Т.к без этого тяжеловато будет.))

В архиве либа HtmlAgilityPack, ее надо закинуть в ExternalAssemblies в папке зенки.
ну что ту ещё можно сказать? выше всяких похвал!! попробовал оба способа работают как часики. спасибо друг за подробные разъяснение!! теперь ты мой президент))
 

Pastors

Client
Регистрация
15.03.2017
Сообщения
6
Благодарностей
1
Баллы
3
Если через браузер, то в зенке уже есть встроенные методы для работы с xpath.
Код:
var hrefs = instance
   .ActiveTab
   .GetDocumentByAddress("0")
   .FindElementsByXPath(".//div[@class='a-row a-spacing-none']/a[contains(@class, 'a-link-normal s-access-detail-page')]")
   .Select(h => h.GetAttribute("href"))
   .ToList();
foreach(var href in hrefs)
{
   project.SendInfoToLog(href, true);
}
Подскажите.. Почему то при таком способе результат выводит только в лог, а в переменную только "ОК"
Как сделать (код подправить?), что бы все сохранялось в список или в переменную.
 
Последнее редактирование:

Pastors

Client
Регистрация
15.03.2017
Сообщения
6
Благодарностей
1
Баллы
3
Вопрос снят.. Разобрался. Сохранить в список

Код:
[CODE]var hrefs = instance
   .ActiveTab
   .GetDocumentByAddress("0")
   .FindElementsByXPath(".//div[@class='a-row a-spacing-none']/a[contains(@class, 'a-link-normal s-access-detail-page')]")
   .Select(h => h.GetAttribute("href"))
   .ToList();
foreach(var href in hrefs)
{
   project.SendInfoToLog(href, true);
}
project.Lists["тот самый список"].AddRange(hrefs)
 
  • Спасибо
Реакции: Mihalich

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 415
Благодарностей
5 454
Баллы
113
В firefox есть удобная штука - плаги FirePath, как дополнение к другому плагину - FireBug.
C помощью него очень удобно конструировать/тестить xpath выражения.
К сожалению плагин не поддерживается Firefox. Есть альтернативы?
 

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
К сожалению плагин не поддерживается Firefox. Есть альтернативы?
Адекватного варианта я не нашел, все что перепробовал не понравилось. Поэтому решил эту проблему следующим образом.
Поставил отдельно старый firefox, и запретил ему обновляться.
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 415
Благодарностей
5 454
Баллы
113
Поставил отдельно старый firefox, и запретил ему обновляться.
Я так пробовал, но не смог найти исходники плагина. Нашел на гитхабе, но там формат который Firefox не смог понять.
 

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 415
Благодарностей
5 454
Баллы
113

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 415
Благодарностей
5 454
Баллы
113
Глянул. Ну да, убрали. Значит или искать альтернативные источники, по любому где нибудь есть. Или собирать из исходников.
Пытался в вебархиве посмотреть, не получилось. Ниужели плагин просто пропал =(
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 518
Благодарностей
3 370
Баллы
113
del
 
Последнее редактирование:

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
Пытался в вебархиве посмотреть, не получилось. Ниужели плагин просто пропал =(
1. Отсюда берем firefox - https://ftp.mozilla.org/pub/firefox/releases/52.9.0esr/win64/ru/

2. Делаем отдельный профиль для этого фаерфокса, чтобы не где нибудь был а в нужном месте.
https://support.mozilla.org/ru/kb/upravlenie-profilyami

3. Ставим с кастомным путем куда надо. Снимаем галку запустить в конце установки.

4. Делаем ярлык для фаерфокса, в свойствах прописываем это.
upload_2019-1-22_17-27-38.png
Ну т.е. в конце -no-remote -P "Dev"
Dev это у меня так папка и профиль называется. Соответственно прописываем свой какой надо.

5. Запускаем через ярлык, отключаем обновления.
upload_2019-1-22_17-22-23.png

6. Закрываем, смотрим успела ли появиться папка updated. Если появилась, удаляем, иначе при повторном запуске обновится.
upload_2019-1-22_19-17-35.png

6.Запускаем. Ставим плагины. Просто перетаскивая их на окно фаерфокса.

7. Пользуемся.:-)
upload_2019-1-22_19-19-4.png
 

Вложения

Кто просматривает тему: (Всего: 3, Пользователи: 0, Гости: 3)