2014-12-14 2 views
0

Я хочу лом некоторых данных по следующей ссылке:данные скоблить с Духом

http://www.six-structured-products.com/en/search-find/new-search#search_type=profi&class_category=svsp

Моя цель просто получить таблицу всех инструментов (отображается в разделе «Результаты поиска» на стр 1,2 , 3 и т. Д.) В data.frame. Я не могу просто использовать urllib и urllib2 для извлечения статических данных, так как мне нужно подражать человеку, нажимая на кнопки: Ghost или Selenium - это путь.

Однако, я действительно не понимаю, как перевести код в «нажмите на страницу 2», «щелкните на странице 3» ..., а также получите общее количество страниц.

Мой код:

from ghost import Ghost 

url = "http://www.six-structured-products.com/en/search-find/new-search#search_type=profi&class_category=svsp" 

gh = Ghost() 
page, resources = gh.open(url) 

Я застрял там и не знаю, какой идентификатор поставить вместо XXX:

page, resources = ghost.evaluate(
"document.getElementById(XXX).click();", expect_loading=True) 

(я бы также принять решение, используя Selenium)

ответ

1

Вы также можете использовать следующие кнопки таким образом:

import logging 
import sys 

from ghost import Ghost, TimeoutError 


logging.basicConfig(level=logging.INFO) 

url = "http://www.six-structured-products.com/en/search-find/new-search#search_type=profi&class_category=svsp" 

ghost = Ghost(wait_timeout=20, log_level=logging.CRITICAL) 
data = dict() 


def extract_value(line, ntd): 
    return line.findFirst('td.DataItem:nth-child(%d)' % ntd).toPlainText() 


def extract(ghost): 
    lines = ghost.main_frame.findAllElements(
     '.derivativeSearchResult > tbody:nth-child(2) tr' 
    ) 

    for line in lines: 
     symbol = extract_value(line, 2) 
     name = extract_value(line, 5) 
     logging.info("Found %s: %s" % (symbol, name)) 
     # Persist data here 

    ghost.sleep(1) 

    try: 
     ghost.click('.pagination_next a', expect_loading=True) 
    except TimeoutError: 
     sys.exit(0) 

    extract(ghost) 


ghost.open(url) 
extract(ghost) 
+0

Благодарим вас за подробный ответ! На самом деле очень ясно, ожидаем, что объект PySide и QtWebkit я вообще не знаком ... например, как я могу получить доступ к объектам 'lines [0]', значение атрибута 'data-isin' в первом' td' ? И название изображения, расположенного в 6-м 'td' (значение - Deutsche bank)? –

+0

Все в порядке, синтаксис jquery был далек от моих знаний, но он хорошо документирован :) –

1

Сделайте бесконечный цикл, увеличивая индекс страницы. Выход из цикла, когда вы не можете найти кнопку с текущим индексом:

from selenium import webdriver 
from selenium.common.exceptions import NoSuchElementException 
import time 

driver = webdriver.Firefox() 
driver.get('http://www.six-structured-products.com/en/search-find/new-search#search_type=profi&class_category=svsp') 

page = 2 # starting page 
while True: 
    try: 
     button = driver.find_element_by_xpath('//ul[@id="pagination_pages"]/li[@class="pagination_page" and . = "%d"]' % page) 
    except NoSuchElementException: 
     break 

    time.sleep(1) 
    button.click() 

    page += 1 

print page # total number of pages 

driver.close() 

Обратите внимание, что вместо time.sleep(), более надежный подход будет использовать Waits.

+0

Спасибо большое! Но quesiton: как вы получили путь к кнопке: '// ul [@ id = "pagination_pages"]/li [@ class = "pagination_page" и. = "5"] 'на стр. 5, например? Я не считаю это настолько очевидным, даже если я могу найти в исходном коде html, где находятся кнопки ... –

+0

@ColonelBeauvel использовал инструменты разработчика браузера для проверки элемента. Затем появилась идея проверить номер страницы (текст элемента). – alecxe

+0

Hum У меня есть эта ошибка, но может быть, потому что я использую Chrome ... *** WebDriverException: Сообщение: неизвестная ошибка: элемент не может быть нажат на элемент получит клик: .. (Информация о сессии: chrome = 39.0.2171.95) (Информация о драйвере: chromedriver = 2.9.248315, платформа = Windows NT 6.1 SP1 x86_64) –

Смежные вопросы