簡體   English   中英

如何使用不變的URL刮取多個頁面 - python

[英]How to scrape multiple pages with an unchanging URL - python

我正試圖抓住這個網站: http//data.eastmoney.com/xg/xg/

到目前為止,我已經使用selenium來執行javascript並獲取表格。 但是,我的代碼現在只獲得第一頁。 我想知道是否有辦法訪問其他17個頁面,因為當我點擊下一頁時,URL不會改變,所以我不能每次都迭代不同的URL

以下是我目前的代碼:

from selenium import webdriver
import lxml
from bs4 import BeautifulSoup
import time

def scrape():
    url = 'http://data.eastmoney.com/xg/xg/'
    d={}
    f = open('east.txt','a')
    driver = webdriver.PhantomJS()
    driver.get(url)
    lst = [x for x in range(0,25)]
    htmlsource = driver.page_source
    bs = BeautifulSoup(htmlsource)
    heading = bs.find_all('thead')[0]
    hlist = []
    for header in heading.find_all('tr'):
        head = header.find_all('th')
    for i in lst:
        if i!=2:
            hlist.append(head[i].get_text().strip())
    h = '|'.join(hlist)
    print h
    table = bs.find_all('tbody')[0]
    for row in table.find_all('tr'):
        cells = row.find_all('td')
        d[cells[0].get_text()]=[y.get_text() for y in cells]
    for key in d:
        ret=[]
        for i in lst:
            if i != 2:
                ret.append(d.get(key)[i])
        s = '|'.join(ret)
        print s     

if __name__ == "__main__":  
    scrape()

或者我可以在瀏覽器中單擊下一步,如果我使用webdriver.Chrome()而不是PhantomJS,然后在每次單擊后點擊Python在新頁面上運行?

這不是一個與之交互的簡單頁面,需要使用顯式等待來等待“加載”指標的隱形。

以下是您可以用作起點的完整且有效的實現:

# -*- coding: utf-8 -*-
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

from selenium import webdriver
import time

url = "http://data.eastmoney.com/xg/xg/"
driver = webdriver.PhantomJS()
driver.get(url)

def get_table_results(driver):
    for row in driver.find_elements_by_css_selector("table#dt_1 tr[class]"):
        print [cell.text for cell in row.find_elements_by_tag_name("td")]


# initial wait for results
WebDriverWait(driver, 10).until(EC.invisibility_of_element_located((By.XPATH, u"//th[. = '加載中......']")))


while True:
    # print current page number
    page_number = driver.find_element_by_id("gopage").get_attribute("value")
    print "Page #" + page_number

    get_table_results(driver)

    next_link = driver.find_element_by_link_text("下一頁")
    if "nolink" in next_link.get_attribute("class"):
        break

    next_link.click()
    time.sleep(2)  # TODO: fix?

    # wait for results to load
    WebDriverWait(driver, 10).until(EC.invisibility_of_element_located((By.XPATH, u"//img[contains(@src, 'loading')]")))

    print "------"

我們的想法是擁有一個無限循環,只有當“下一頁”鏈接被禁用時才會退出(不再有可用的頁面)。 在每次迭代中,獲取表格結果(為了示例而在控制台上打印),單擊下一個鏈接並等待出現在網格頂部的“加載”旋轉圓的不可見性。

我在C#中使用Chromedriver和Selenium找到了另一種方法。 您所要做的就是在代碼中添加selenium引用並放入chromedriver.exe引用。

在您的代碼中,您可以使用導航到網址

using (var driver = new chromedriver())
{
    driver.Navigate().GoToUrl(pathofurl);
    //find your element by using FindElementByXpath
    //var element = driver.FindElementByXpath(--Xpath--).Text;
}

查找Xpath非常簡單 - 您只需通過轉到chrome商店下載chrome中的scraper擴展或x-path擴展即可。 一旦你獲得了元素的x-path,你可以找到下一個按鈕的x-path,並在你的代碼中使用它在循環中非常容易地瀏覽頁面。 希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM