2015-07-10 41 views
2

試圖湊這個網站:http://data.eastmoney.com/xg/xg/如何用刮不變的URL多​​頁 - 我蟒蛇

到目前爲止,我已經使用硒執行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的新網頁上運行後,我點擊每一次?

+0

我以爲我發現了一個重複,但無法找到它了。基本上應該有一種方法來調用一個onclick事件,然後調用一個方法來獲得DOM的新解釋。這是必要的,因爲如果URL沒有改變,這可能是因爲它會隨着某種AJAX調用而改變,需要你在使用美麗的湯之前與驅動程序一起操作。 –

回答

2

這不是一個微不足道的頁面,需要使用Explicit Waits來等待「加載」指示器的隱形。

下面是完整的和工作的實現,你可以作爲一個起點使用:

# -*- 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 "------" 

的想法是有一個無限循環只有在「下一頁」鏈接就被禁止,我們將退出(沒有更多頁面可用)。在每次迭代中,獲取表格結果(爲了舉例而在控制檯上打印),單擊下一個鏈接並等待在網格頂部出現「加載」旋轉圓圈的不可見性。

+0

非常感謝,有沒有辦法在Python中讀取中文字符而不會出錯?我收到非ASCII字符的錯誤。這僅僅是一個Python 2.7的問題? – user3628240

+0

@ user3628240你得到了什麼錯誤,你有腳本頂部的「編碼」行嗎?這實際上可能是一個單獨的問題。謝謝。 – alecxe

+0

哦,我沒有包含編碼行,因爲我認爲它被註釋掉了。感謝您的幫助! – user3628240

0

我發現了另一種在C#中使用Chromedriver和Selen的方法。你所要做的就是將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商店的x路延伸。一旦你獲得了元素的x路徑,你可以找到下一個按鈕的x路徑,並在你的代碼中使用它來在循環中很容易地瀏覽頁面。希望這可以幫助。