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

KashaP

Client
Joined
May 20, 2016
Messages
84
Reaction score
4
Points
8
Пытаюсь спарсить ссылки на товары с определенной категории, на 1 странице 24 ссылки, но результат либо 20 либо 35. Как быть? Может у кого нибудь была подобная проблема?

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

AloneSlamer

Client
Joined
Jan 29, 2013
Messages
1,404
Reaction score
362
Points
83

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

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

KashaP

Client
Joined
May 20, 2016
Messages
84
Reaction score
4
Points
8

qzen4i

Client
Joined
May 1, 2014
Messages
1,404
Reaction score
313
Points
83
Если не разобрался, в скайп напиши, помогу.
 

Moadip

Client
Joined
Sep 26, 2015
Messages
509
Reaction score
823
Points
93
  • Thank you
Reactions: Wide

amyboose

Client
Joined
Apr 21, 2016
Messages
2,312
Reaction score
1,191
Points
113
Понапридумывали языков SQL, XPath, регулярки, LINQ, а новичкам приходится их учить наравне с основным языком программирования наподобие C#, java и т.д.
 
  • Thank you
Reactions: AZANIR and Wide

Wide

Client
Joined
Feb 4, 2013
Messages
944
Reaction score
253
Points
63
Попробуй юзать не регулярки, а xpath.
Code:
.//div[@class='a-row a-spacing-none']/a[contains(@class, 'a-link-normal s-access-detail-page')]/@href
может покажете как на в зеньке использовать? у мну ничего не получается((
 

silent

Client
Joined
Apr 5, 2014
Messages
237
Reaction score
84
Points
28
Понапридумывали языков SQL, XPath, регулярки, LINQ, а новичкам приходится их учить наравне с основным языком программирования наподобие C#, java и т.д.
ты так говоришь, как будто это что-то сложное, бгг
инфы по xpath полно на любом языке.
 

Wide

Client
Joined
Feb 4, 2013
Messages
944
Reaction score
253
Points
63
Пытаюсь спарсить ссылки на товары с определенной категории, на 1 странице 24 ссылки, но результат либо 20 либо 35. Как быть? Может у кого нибудь была подобная проблема?

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

Attachments

Wide

Client
Joined
Feb 4, 2013
Messages
944
Reaction score
253
Points
63
хотя нет, вот через гет. насколько я понял, там ещё какие то результаты добавляются в диве
Code:
<div id="results-atf-next" style="display: none;">
 

Attachments

Moadip

Client
Joined
Sep 26, 2015
Messages
509
Reaction score
823
Points
93
  • Thank you
Reactions: pg2016 and Wide

Wide

Client
Joined
Feb 4, 2013
Messages
944
Reaction score
253
Points
63
Вот пример как юзать через запросы.
http://zennolab.com/discussion/threads/pomogite-s-parsingom-teksta.28069/#post-235994

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

Moadip

Client
Joined
Sep 26, 2015
Messages
509
Reaction score
823
Points
93
друг, я и так с регулярками не дружу, а тут ещё xpath по линку не понял ни чего)) если не не сложно скинь пример, чего уж ломать наши умы))
:D
А в чем там собственно проблема то.
ТС надо вытащить инфу со страницы. Так понимаю не с одной страницы.:-)
Т.е. это парсер. Соответственно он должен работать быстро, чтобы прокачивать большой объем инфы.
И тут вариант только один - делать через запросы. Можно конечно и через браузер, но какбы это помоему извращение.

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

Вот тут и надо воткнуть xpath выражение, в списке будут все ссылки.
Code:
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.

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);
}

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

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

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

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

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

Например есть вот такие ноды
Code:
<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.
Code:
бла-бла-бла/li[contains(@class, 'serp-item']
Т.к. serp-item есть в значении атрибута class в обеих нодах, то такие ноды и возьмутся.

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

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

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

silent

Client
Joined
Apr 5, 2014
Messages
237
Reaction score
84
Points
28
  • Thank you
Reactions: moRL

Wide

Client
Joined
Feb 4, 2013
Messages
944
Reaction score
253
Points
63
:D
А в чем там собственно проблема то.
ТС надо вытащить инфу со страницы. Так понимаю не с одной страницы.:-)
Т.е. это парсер. Соответственно он должен работать быстро, чтобы прокачивать большой объем инфы.
И тут вариант только один - делать через запросы. Можно конечно и через браузер, но какбы это помоему извращение.

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

Вот тут и надо воткнуть xpath выражение, в списке будут все ссылки.
Code:
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.

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);
}

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

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

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

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

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

Например есть вот такие ноды
Code:
<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.
Code:
бла-бла-бла/li[contains(@class, 'serp-item']
Т.к. serp-item есть в значении атрибута class в обеих нодах, то такие ноды и возьмутся.

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

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

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

Wide

Client
Joined
Feb 4, 2013
Messages
944
Reaction score
253
Points
63
ну блин криворукий я в край)) оба метода пробовал. не один не завёлся
 

Attachments

Moadip

Client
Joined
Sep 26, 2015
Messages
509
Reaction score
823
Points
93
ну блин криворукий я в край)) оба метода пробовал. не один не завёлся
Так логи то для кого пишутся? Там же пишется что за ошибка.
Двойные кавычки. Тут даже сразу подсвечивается что косяк.


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


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

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


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



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

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

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

Attachments

silent

Client
Joined
Apr 5, 2014
Messages
237
Reaction score
84
Points
28
ответили выше
 
Last edited:

Wide

Client
Joined
Feb 4, 2013
Messages
944
Reaction score
253
Points
63
Так логи то для кого пишутся? Там же пишется что за ошибка.
Двойные кавычки. Тут даже сразу подсвечивается что косяк.


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


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

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


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



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

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

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

Pastors

Client
Joined
Mar 15, 2017
Messages
6
Reaction score
1
Points
3
Если через браузер, то в зенке уже есть встроенные методы для работы с xpath.
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);
}
Подскажите.. Почему то при таком способе результат выводит только в лог, а в переменную только "ОК"
Как сделать (код подправить?), что бы все сохранялось в список или в переменную.
 
Last edited:

Pastors

Client
Joined
Mar 15, 2017
Messages
6
Reaction score
1
Points
3
Вопрос снят.. Разобрался. Сохранить в список

Code:
[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)
 
  • Thank you
Reactions: Mihalich

Mikhail B.

Moderator
Joined
Dec 23, 2014
Messages
14,333
Reaction score
5,431
Points
113
В firefox есть удобная штука - плаги FirePath, как дополнение к другому плагину - FireBug.
C помощью него очень удобно конструировать/тестить xpath выражения.
К сожалению плагин не поддерживается Firefox. Есть альтернативы?
 

Moadip

Client
Joined
Sep 26, 2015
Messages
509
Reaction score
823
Points
93
К сожалению плагин не поддерживается Firefox. Есть альтернативы?
Адекватного варианта я не нашел, все что перепробовал не понравилось. Поэтому решил эту проблему следующим образом.
Поставил отдельно старый firefox, и запретил ему обновляться.
 

Mikhail B.

Moderator
Joined
Dec 23, 2014
Messages
14,333
Reaction score
5,431
Points
113
Поставил отдельно старый firefox, и запретил ему обновляться.
Я так пробовал, но не смог найти исходники плагина. Нашел на гитхабе, но там формат который Firefox не смог понять.
 

Moadip

Client
Joined
Sep 26, 2015
Messages
509
Reaction score
823
Points
93
но не смог найти исходники плагина
А зачем исходники? Ставишь отдельно firefox, ставишь плагин firebug, потом firepath.
 

Mikhail B.

Moderator
Joined
Dec 23, 2014
Messages
14,333
Reaction score
5,431
Points
113

Moadip

Client
Joined
Sep 26, 2015
Messages
509
Reaction score
823
Points
93
Его нет в магазине.
Глянул. Ну да, убрали. Значит или искать альтернативные источники, по любому где нибудь есть. Или собирать из исходников.
 

Mikhail B.

Moderator
Joined
Dec 23, 2014
Messages
14,333
Reaction score
5,431
Points
113
Глянул. Ну да, убрали. Значит или искать альтернативные источники, по любому где нибудь есть. Или собирать из исходников.
Пытался в вебархиве посмотреть, не получилось. Ниужели плагин просто пропал =(
 

Yuriy Zymlex

Moderator
Staff member
Joined
Oct 24, 2016
Messages
6,381
Reaction score
3,304
Points
113

Moadip

Client
Joined
Sep 26, 2015
Messages
509
Reaction score
823
Points
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
 

Attachments

Users Who Are Viewing This Thread (Total: 1, Members: 0, Guests: 1)