【问题标题】:Pandas: Append rows to DataFrame already running through pandas.DataFrame.applyPandas:将行追加到已经通过 pandas.DataFrame.apply 运行的 DataFrame
【发布时间】:2016-09-26 22:26:55
【问题描述】:

简介: 我正在为 Python 2.7 使用 Selenium WebDriverPandas 来制作一个网络爬虫,该网络爬虫会转到一系列 URL 并在该页面上爬取 URL。如果它在那里找到 URL,我希望将它们添加到运行序列中。如何使用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=",")

上面的爬虫使用spreadsheet.csv 中的"URL" 列导航到每个新的url。 然后它会抓取页面上与正则表达式 www.+ 匹配的所有字符串以查找 URL,并将结果放入列表 scraped_urls

它还获取字符串something_else = "foobar"

当它处理完"URL" 中的所有单元格后,它会写入一个新文件result.csv


我的问题:

我很难找到一种方法来将列表 scraped_urls 中的抓取网址添加 到列 "URL" - 以便将它们插入到下方“活动” URL(使用 use["URL"] 检索)。

如果源电子表格中的列如下所示:

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

www.yahoo.com 上,爬虫通过正则表达式找到这些字符串:

"www.angelfire.com"
"www.gamespy.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 吗?

【问题讨论】:

    标签: python selenium pandas


    【解决方案1】:

    我认为没有一种方法可以像您想象的那样使用apply。即使有办法,

    • 很可能需要跟踪已迭代的项目数 结束,这样你就会知道在哪里插入新项目到df['URL']

    • 插入df['URL'] 的中间需要将当前 DataFrame 中的所有数据复制到 新的、更大的 DataFrame。 (可能)复制整个 DataFrame 一次 每一行都会使代码不必要地变慢。

    相反,一个更简单、更好的方法是使用stack。堆栈可以通过一个简单的列表来实现。您可以将df['URL'] 推入堆栈,然后从堆栈中弹出一个 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=",")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-29
      • 1970-01-01
      • 1970-01-01
      • 2011-04-04
      • 2022-01-09
      • 2020-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多