2016-05-28 50 views
1

簡要已經運行: 我使用Selenium WebDriverPandasPython 2.7版使Web刮即去的網址和擦傷的網址上,一個序列頁。如果它在那裏找到URL,我希望它們被添加到正在運行的序列中。我如何使用pandas.DataFrame.apply來做到這一點?熊貓:追加行數據幀通過pandas.DataFrame.apply


代碼:

import pandas as pd 
from selenium import webdriver 
import re 

df = pd.read_csv(spreadsheet.csv, delimiter=",") 

def crawl(use): 
    url = use["URL"] 
    driver.get(url) 
    scraped_urls = re.findall(r"(www.+)", element.text) 
    something_else = "foobar" 

    #Ideally the scraped_urls list would have to be unpacked here 
    return pd.Series([scraped_urls, something_else]) 

df[["URL", "Something else"]] = df["URL"].apply(crawl) 

df.to_csv("result.csv", delimiter=",") 

上述刮板使用列"URL"spreadsheet.csv導航到每一個新的url。 然後,它會擦除​​頁面上與正則表達式www.+匹配的所有字符串以查找URL,並將結果放入列表scraped_urls

它也得到字符串something_else = "foobar"

當它處理完"URL"中的所有單元格後,它會寫入一個新文件result.csv


我的問題:

我已經很難找到一種方法來列表scraped_urls加刮網址到列"URL" - 讓他們插入略低於「活動「URL(與use["URL"]一起檢索)。

如果源電子表格中的列如下:

"www.angelfire.com" 
"www.gamespy.com" 

我想:

["URL"] 
"www.yahoo.com" 
"www.altavista.com" 
"www.geocities.com" 

而且在www.yahoo.com,刮板通過正則表達式找到這些字符串將這些行添加到www.yahoo.com以下的列"URL",以便它們成爲刮板搜索的下一個關鍵字:

["URL"] 
"www.yahoo.com"   #This one is done 
"www.angelfire.com"  #Go here now 
"www.gamespy.com"  #Then here 
"www.altavista.com"  #Then here 
"www.geocities.com"  #... 

這可能嗎?我可以即時追加已通過apply()運行的DataFrame df嗎?

回答

2

我不認爲有一種方法可以用你設想的方式使用apply。而且即使有辦法,

  • 它最有可能需要保持跟蹤多少項目已經迭代 ,這樣你就知道在哪裏可以插入新項目到df['URL']

  • 插入df['URL']的中間部分需要將當前DataFrame中的所有數據複製到一個新的更大的DataFrame中。每行復制整個數據幀(可能)爲 一次會使代碼不必要地變慢。

相反,更簡單,更好的方法是使用stack。堆棧可以通過一個簡單的列表來實現。您可以將df['URL']推入堆棧,然後從堆棧中彈出一個url並對其進行處理。當找到新的刮片時,可以將它們推入堆疊併成爲下一個要彈出的物品:

import pandas as pd 

def crawl(url_stack): 
    url_stack = list(url_stack) 
    result = [] 
    while url_stack: 
     url = url_stack.pop() 
     driver.get(url) 
     scraped_urls = ... 
     url_stack.extend(scraped_urls) 

     something_else = "foobar" 
     result.append([url, something_else]) 
    return pd.DataFrame(result, columns=["URL", "Something else"]) 

df = pd.read_csv(spreadsheet.csv, delimiter=",") 
df = crawl(df['URL'][::-1]) 
df.to_csv("result.csv", delimiter=",")