Форум программистов, компьютерный форум CyberForum.ru

Python: Web

Войти
Регистрация
Восстановить пароль
 
Дмитрий Л
0 / 0 / 0
Регистрация: 03.03.2016
Сообщений: 37
#1

Python, Selenium - как прокликать страницы - Python

17.12.2016, 20:27. Просмотров 317. Ответов 4
Метки нет (Все метки)

Добрый вечер.
Подскажите, пожалуйста, как пройтись по всем страницам на сайте.
Страницы переключаются js скриптом:
<li>
<a href="javascript:__doPostBack('ctl00$MainContent$ucTopDataPager$ctl00$ctl03','')">4</a>
</li>
Сначала видно только 10 страниц, меняются $ctl03(04,05,06 и т.д.)

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from selenium import webdriver
from bs4 import BeautifulSoup
import re
 
driver = webdriver.Chrome(executable_path=r"C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe")
url = 'http://fedresurs.ru/messages/IsSearching'
 
ef getURLinfo(url):
 
    driver.get(url)
    html = driver.page_source
    next = "ctl00_MainContent_ucTopDataPager"
    soup = BeautifulSoup(html)
    tag = soup.find("div", class_="right")
    while tag.findAll('a', href = True):
        driver.find_element_by_id(next).click()
        soup = BeautifulSoup(driver.page_source)
        print(soup.prettify())
        driver.close()
 
getURLinfo(url)
В таком варианте 10 раз загружаю 1 страницу...
вангую, что сюда driver.find_element_by_id(next).click() нужно передавать ссылку, но не знаю как...

Добавлено через 2 часа 20 минут
для проверки сделал так, 2-10, все равно рефрешит одну и ту же страницу, первую.
Подскажите плз как пройтись по остальным ссылкам?
Python
1
2
3
4
5
   for i in range(2,10):
             driver.find_element_by_xpath('//div/div[2]/table/tbody/tr/td[2]/ul/li' + '[' + str(i) + ']' + '/a').click()
             html = html + driver.page_source
             soup = BeautifulSoup(html)
             print(soup.prettify())
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.12.2016, 20:27     Python, Selenium - как прокликать страницы
Посмотрите здесь:

Изменить размер окна в Selenium Python
Python Selenium + PhantomJS + прокси
Python Selenium, выделение текста на странице
Selenium не запускает браузер Python
Selenium: переход на новыю вкладку Python
Python + Selenium, как переключится на окно? Python
Python Не работает selenium
Python Selenium не находит элемент
Прокси в Selenium (PhantomJS) Python
Selenium не делает скриншот Python
Python Selenium
Python Selenium PhantomJS. Прокси с авторизацией

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jabbson
Модератор
Эксперт по компьютерным сетям
2987 / 2088 / 396
Регистрация: 03.11.2009
Сообщений: 6,625
Записей в блоге: 3
18.12.2016, 07:46     Python, Selenium - как прокликать страницы #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
первых 10 страниц обойти можно так:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
 
 
def get_list(n):  # n page number
    timeout = 3
    try:
        # waiting for the paginator to have current page as class "active" li with span
        element_present = EC.presence_of_element_located((By.XPATH, '//li[@class="active"]/a/span[text()="{}"]'.format(n)))
        WebDriverWait(driver, timeout).until(element_present)
    except TimeoutException:
        print("Timed out waiting for page to load")
 
    # looking for record names and record authors
    lst_divs = driver.find_elements_by_class_name('display-field.message-in-list')
    lst_as = driver.find_elements_by_xpath('//div[starts-with(@id, "ctl00_MainContent_lvMessageList_ctrl")]')
    
    for d, a in zip(lst_divs, lst_as):
        print('\t{} :: {}'.format(d.text, a.text))
 
 
driver = webdriver.Firefox(executable_path='/usr/local/bin/geckodriver')
url = 'http://fedresurs.ru/messages/IsSearching'
 
driver.get(url)
 
# getting last page
a = driver.find_element_by_css_selector('div.right > table.paging td > ul > li:last-child')
last_page = int(a.text)
 
# go over first page
print('Page 1')
get_list(1)
 
# loop thru other pages
for i in range(1, last_page):
    print('Page {}'.format(i+1))
    link = "javascript:__doPostBack('ctl00$MainContent$ucTopDataPager$ctl00$ctl{0:02d}','')".format(i)
    
    # finding next page
    a = driver.find_element_by_xpath('//a[@href="{}"]'.format(link))
    
    # click, wait + parse
    a.click()
    get_list(i+1)
 
driver.close()
дальше в случае необходимости - ткнуть в троеточие и начать все заново.
Дмитрий Л
0 / 0 / 0
Регистрация: 03.03.2016
Сообщений: 37
18.12.2016, 14:05  [ТС]     Python, Selenium - как прокликать страницы #3
Jabbson, круто, спасибо, то что нужно
а можно несколько комментариев по коду, не совсем понимаю пока
и почему мой вариант не так работал как нужно?

Добавлено через 2 часа 16 минут
и еще вопросик, там форма выше, с выпадающим списком - выбрать и ткнуть найти..
с кнопками и кликами более-менее понятно, а как в select подставить значение свое? (или из списка)
Jabbson
Модератор
Эксперт по компьютерным сетям
2987 / 2088 / 396
Регистрация: 03.11.2009
Сообщений: 6,625
Записей в блоге: 3
18.12.2016, 16:29     Python, Selenium - как прокликать страницы #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Обновил с небольшими комментами,

по выпадающему меню:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
from selenium import webdriver
from selenium.webdriver.support.ui import Select
 
 
driver = webdriver.Firefox(executable_path='/usr/local/bin/geckodriver')
url = 'http://fedresurs.ru/messages/IsSearching'
driver.get(url)
 
select = Select(driver.find_element_by_id('ctl00_MainContent_ddlMessageTypeList'))
select.select_by_visible_text('Иные сведения')
 
 
driver.close()
Дмитрий Л
0 / 0 / 0
Регистрация: 03.03.2016
Сообщений: 37
19.12.2016, 16:19  [ТС]     Python, Selenium - как прокликать страницы #5
Jabbson, Спасибо!!))

Добавлено через 15 часов 6 минут
Jabbson,
А не подскажете как с помощью супа разложить тэг тд на пару ключ:значение? На общем примере:
<tr>
<td>name</td>
<td>value</td>
</tr>
На выходе : name:value
У меня получилось все разложить, но только в одну колонку, подряд

Добавлено через 7 часов 43 минуты
Вопрос снят
Yandex
Объявления
19.12.2016, 16:19     Python, Selenium - как прокликать страницы
Ответ Создать тему
Опции темы

Текущее время: 12:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru