Scraper无法从下一页获取姓名

时间:2017-10-16 15:32:54

标签: python python-3.x selenium selenium-webdriver web-scraping

我已经在python中编写了一个与selenium结合使用的脚本来解析网页中的名称。该网站的数据未启用javascript。但是,下一页链接在javascript中。如果我去requests库,那么该页面的下一页链接是没用的,我使用selenium来解析遍历25页的该站点的数据。我在这里面临的唯一问题是,虽然我的刮刀能够到达最后一页点击25页,但它只从第一页获取数据。此外,即使已经完成了点击最后一页,刮刀也会继续运行。下一页链接看起来与javascript:nextPage();完全相同。顺便说一句,即使我点击下一页按钮,该网站的网址也不会改变。我怎样才能从25页获得所有名字?我在刮刀中使用的css选择器完美无瑕。提前谢谢。

这是我写的:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
wait = WebDriverWait(driver, 10)

driver.get("https://www.hsi.com.hk/HSI-Net/HSI-Net?cmd=tab&pageId=en.indexes.hscis.hsci.constituents&expire=false&lang=en&tabs.current=en.indexes.hscis.hsci.overview_des%5Een.indexes.hscis.hsci.constituents&retry=false")

while True:
    for name in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "table.greygeneraltxt td.greygeneraltxt,td.lightbluebg"))):
        print(name.text)

    try:
        n_link = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "a[href*='nextPage']")))
        driver.execute_script(n_link.get_attribute("href"))
    except: break

driver.quit()

2 个答案:

答案 0 :(得分:2)

你不必处理"下一步"按钮或以某种方式更改页码 - 所有条目都已在页面源中。请尝试以下:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
wait = WebDriverWait(driver, 10)

driver.get("https://www.hsi.com.hk/HSI-Net/HSI-Net?cmd=tab&pageId=en.indexes.hscis.hsci.constituents&expire=false&lang=en&tabs.current=en.indexes.hscis.hsci.overview_des%5Een.indexes.hscis.hsci.constituents&retry=false")
for name in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "table.greygeneraltxt td.greygeneraltxt,td.lightbluebg"))):
        print(name.get_attribute('textContent'))

driver.quit()

如果您不强制要求使用Selenium,也可以尝试使用此解决方案:

import requests
from lxml import html

r = requests.get("https://www.hsi.com.hk/HSI-Net/HSI-Net?cmd=tab&pageId=en.indexes.hscis.hsci.constituents&expire=false&lang=en&tabs.current=en.indexes.hscis.hsci.overview_des%5Een.indexes.hscis.hsci.constituents&retry=false")
source = html.fromstring(r.content)

for name in source.xpath("//table[@class='greygeneraltxt']//td[text() and position()>1]"):
        print(name.text)

答案 1 :(得分:0)

看起来这实际上可以比当前的方法更简单地完成。在driver.get方法之后,您可以简单地使用page_source属性来获取它背后的html。从那里,您可以一次从所有25页中获取数据。要查看其结构,只需右键单击并在chrome中“查看源代码”。

html_string=driver.page_source