我想废弃以下链接中的一些数据:
我的目标只是检索data.frame
中所有乐器的表格(在第1,2,3页的“搜索结果”中显示)等。
我不能简单地使用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
)
答案 0 :(得分: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()
请注意,使用Waits代替time.sleep()
,更可靠的方法是使用{{3}}。
答案 1 :(得分: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)