Как нажать «Далее» для разбивки на страницы с помощью библиотеки Requests-HTML - PullRequest
1 голос
/ 21 мая 2019

Я новичок в webscraping, и поэтому я изучаю кучу разных подходов.Одним из них (который меня больше всего волнует) является использование библиотеки Python 'orders-html', которая поддерживает рендеринг содержимого Javascript.

По сути, мне интересно, как я могу нажать кнопку «Далее», чтобы перейти на данную страницу, чтобы получить больше визуализированного контента JS.Используя пример веб-страницы "https://us -proxy.org / ".Я довольно легко могу получить xpath для кнопки «Далее», но я не знаю, как ее активировать.

Насколько я понимаю, «messages-html» заключается в том, что она работает в основном путем управления экземпляром безголового хромаи используя его для рендеринга страниц с помощью Javascript.Пока все хорошо, я немного поэкспериментировал с ним, и он работает довольно хорошо, но в документации упоминается, что он включает в себя функциональность разбиения на страницы.Честно говоря, мне кажется, я не могу заставить его работать, и, кроме того, что он там, документы для авторов не очень детализированы.

Мне бы понравилось, если бы кто-то мог объяснить, как люди делают это с этой библиотекой илидаже если бы они могли просто указать мне на более детальные документы, если они есть в сети.Я потратил некоторое время на троллинг вокруг, пытаясь выяснить, смогу ли я найти что-нибудь, но на удивление мало что мне удалось вспомнить о «request-html» вообще, учитывая, насколько мощным оно кажется.Я также проверил ReadTheDocs, и он практически не имел информации.Я полагаю, что я могу немного выйти за рамки проблемы и покопаться в pyppeteer, но это похоже на потенциально другую кроличью нору ...

---------------------------- Мой пример скрипта ----------------------

targetURL = "https://us-proxy.org/"

print("script running")

# create an HTML Session Object
session = HTMLSession()

# Use the object to needed webpage
responseObject =  session.get(targetURL)
responseObject.html.next()

option_tagsNoRender = responseObject.html.xpath("//td")
print("\n\nNo Rend: ", len(option_tagsNoRender) )
print("\n\n", option_tagsNoRender[0].full_text)


# Run Javascript Code on target webpage
responseObject.html.render(sleep=10)


option_tags = responseObject.html.xpath("//td")
print("\n\nPost Render: ", len(option_tags) )
#print(dir(option_tags[0]))

print("\n\n", option_tags[0].full_text)

for tag in option_tags:
    #pass
    print(tag.full_text)

---------------- Конец ------------------------------------------

Поскольку документация создателей фактически упоминала метод .next (), я попытался его выполнить (как видно из примера сценария).Судя по выводу, он ничего не делает (хотя понятия не имею, правильно ли я его реализую).Результаты поиска по тегу получаются одинаковыми, независимо от того, комментирую я эту строку или оставляю ее. Похоже, она НЕ продвигает отображаемую страницу JS.

Цените любые указания или идеи.Спасибо!

Обновление:

Хорошо, поэтому я более внимательно посмотрел на документы, и они упоминают, что вы можете взаимодействовать со страницей, если вы используете опцию keep_page во время вызова рендеринга.Это привело меня к открытию пути к документам pyppeteers (которые, конечно, используются в запросах-html), которые, кажется, раскрывают довольно прямой метод .click (), который, похоже, не давил селектору xpath следующегоКнопка, которую я кормил.К сожалению, я до сих пор не вижу никаких доказательств того, что он успешно перешел по ссылке, и все время получаю сообщение об ошибке «RuntimeWarning: сопрограмма« clickNext »никогда не ожидалась».

Вот простая функция, которую я написал, чтобы нажать следующую кнопку, которая теперь дает мне это сообщение:

-------------------------------------------------------

async def clickNext ():

await asyncio.wait([ responseObject.html.page.click('//a[@aria-controls][@data-dt-idx="9"]'), 
                     responseObject.html.page.waitFor(5000),])

-------------------------------------------------------

У меня пока нет опыта работы с асинхронным программированием и сопрограммами, поэтому он имеет в виду время, когда я копаюсь в этом, но если у кого-то есть пониманиечто я делаю не так с этим, я был бы признателен за любую информацию, которой вы хотели поделиться.Спасибо!

...