将url和嵌套CSV与python结合时出现问题

2024-09-28 01:31:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我的项目要求我从一个网站上抓取信息分几个步骤,每一步都添加新的页面和变量,以便在接下来的步骤中获取。我用Python来做这个…仅仅在3个月前就学会了非常基本的方面,仍然是非常新的。在

刮削顺序如下:

第0步: CSV1文件的顶级类别网址刮(url_1),约20个网址总数

——>

第一步: 以scrape1.py为例,它使用Selenium Firefox Webdriver加载CSV1中的每个(url_1)链接,使CSV2在列中包含以下中间类变量:(variable1),(variable2),(variable3),(variable4),(variable5),(url_2)…每次加载(url_1)将产生12-24个新行,其中包含一个惟一的(url_2)链接,因此总共大约有400多行

——>

第二步: 使用scrape2.py和Beautiful Soup加载CSV2中的每个(url_2)链接,并使CSV3在列中包含以下结束类别变量:(variable_A)、(variable_A)、(url_A)、(variable_B)、(variable_B)、(url_B)、(url_B)。每个(url_2)链接产生每个变量(A,A,B,B)和url(A,B,B)的20+个,因此输出将远远超过10000行(目前只在CSV2的较小版本上运行,它只有5行url_2)

——>

第三步:

将所有变量合并到一个CSV4文件中。在

我遇到的问题是在第三步。我能够创建CSV1、CSV2和(一个截断的)CSV3。我能够创建scrape1.py和scrape2.py并成功地收集变量和url。但是我不知道如何将所有变量放入一个CSV文件中。尤其是因为每个阶段都会以指数级的方式增加后面的变量数量,因此CSV1中的一行(url_1)将在CSV3中产生200-400行以上的变量。我需要将变量从一个CSV文件“结转”到下一个CSV文件,但是对于每一个新的行迭代,新文件中必须包含很多次的结转变量,而不仅仅是一次,所以仅仅将它们作为新列添加是行不通的。在

最终输出应为:

CSV1:(url_1)[x20]

CSV2:对于每个(url_1),大约22行: (变量1),(变量2),(变量3),(变量4),(变量5),(url 2)

CSV3:对于每个(url_2),大约30行: (变量?A)、(变量?A)、(url?A)、(变量?B)、(变量?B)、(url?B)、(url?B)

每个CSV4行都复制了以下变量: (url_1),(变量1),(变量2),(变量3),(变量4),(变量5),(url_2),(变量_A),(变量_A),(url_A),(变量_B),(变量_B),(url_B),(url_B)

有人建议我试试熊猫,但我不知道如何利用别人的项目来实现这一点。在

如有任何帮助,将不胜感激!在


Tags: 文件csv项目pygturl链接步骤
2条回答

我终于解决了这个问题。感谢其他用户的帮助。解决方案不是合并CSV,而是将一些变量转移到新的变量中。我想我会把解决方案贴出来,以防以后别人发现它有用。在

CSV1,每个变量在单独的行中:

    url_1_00.html
    url_1_01.html
    url_1_02.html

(完整的CSV1包含约50个url)

每个URL都指向一个页面,其中包含一个(复杂的)所需信息列表,该列表有10-30个条目,其中一个条目是第二个URL。我需要把每个列表中的每一项从50个url中的每一个抓取到一个新的CSV中。在

Scrape1.py:(注意:我已经将此代码设为通用代码;实际上scraper变量需要更多的导航和一些单击和下拉菜单,这就是为什么我要特别使用Selenium)。

^{pr2}$

这里有几个注意事项: CSV1包含所有初始url,定义为url_1。在

这就产生了CSV2,它有我需要在其中抓取的下一组url。CSV2的行数超过800行(因此url_1的大约50个url产生了800多个url是url_2)

CSV2示例,每组变量位于不同的行中,变量以逗号分隔:

    url_1_00, var_1_00, var_2_00, var_3_00, var_4_00, var_5_00, url_2_00.html  
    url_1_00, var_1_01, var_2_01, var_3_01, var_4_01, var_5_01, url_2_01.html  
    url_1_00, var_1_02, var_2_02, var_3_02, var_4_02, var_5_02, url_2_02.html  
    url_1_00, var_1_03, var_2_03, var_3_03, var_4_03, var_5_03, url_2_03.html  
    url_1_00, var_1_04, var_2_04, var_3_04, var_4_04, var_5_04, url_2_04.html

(完整的CSV2包含大约800行以上的可变url集)

现在我需要刮取每个url_2和另一个(复杂)变量列表。url_2页面上的每个列表包含30-100个带有~4个可变属性的项目,我需要将每个项目刮到自己的行中,同时添加变量属性,同时保留上一次刮取的信息(url_1,var_1,var_2…到url_2)。在

结果如下:

Scrape2.py:(注意:我已经将此代码设为通用代码;这个部分不需要单击,所以我使用了beauthoulsoup)。

    ### HEADER: IMPORTS AND DEFINITIONS ###

    import requests
    from bs4 import BeautifulSoup
    import time 
    import csv, codecs, cStringIO

    raw_data_file = open("CSV2.csv", 'rU')
    csv_data_file = csv.reader(raw_data_file, delimiter=',', quotechar='"')
    csv_data_file.next()

    ###DEFINE FUNCTIONS HERE###

    def scrapertron():
            moarvarslist=soup.find_all('tr')
            for each in moarvarslist:
                    var_a = None
                    try: 
                            var_a = each.find('td', class_="classwhut")
                    except: pass
                    url_a = None
                    try: 
                            url_a = each.find('a').get('href')
                    except: pass
                    var_b = None
                    try: 
                            var_b = each.find('tr', class_="heyyyanotherone")
                    except: pass
                    url_b = None
                    try: 
                            url_b = each.find('a').get('href')
                    except: pass
                    newsummary=[url_1, var_1, var_2, var_3, var_4, var_5, url_2, var_a, url_a, var_b, var_b]
                    # NOTICE as in the previous scrape, this carries over
                    # variables that aren't in the scrape from CSV2, namely
                    # url_1, var_1, var_2, var_3, var_4, var_5, and url_2
                    scrapeallvars.append(summary)

    def write_to_csv():
            with open('CSV3.csv', 'wb') as outfile:
            writer = csv.writer(outfile)
            writer.writerow(["url_1", "var_1", "var_2", "var_3", "var_4", "var_5", "url_2", "var_a", "url_a", "var_b", "var_b"])
            # NOTICE again, the carry over variables from CSV2 here ^^^
            writer.writerows(scrapeallvars)

    ###BEGIN ACTUAL PROGRAM###

    scrapeallvars=[]

    for each in csv_data_file:
            url_1=each[0]
            var_1=each[1]
            var_2=each[2]
            var_3=each[3]
            var_4=each[4]
            var_5=each[5]
            url_2=each[6]
            # The variables from CSV2 are actually defined here, after
            # they are pulled using csv_data_file

            response = requests.get(url_2)  
            soup = BeautifulSoup(response.content, "lxml")

            scrapertron()
            write_to_csv()
            time.sleep(3)

    print "ALL DONE!"

这将在最终文件CSV3中生成所有需要的变量。不再需要CSV4。所有url_2 url在列表中生成30-100个新变量项,这将在最终文件中生成120000多行。这个scrape需要更长的时间,因为它遍历了800多行url_2。对我来说,这大约花了一个小时,如果我没用的话时间。睡觉()它可能需要15-20分钟,但我不想压倒我正在抓取的网站。在

CSV3输出示例,每组变量位于不同的行中,变量以逗号分隔:

    url_1_00, var_1_00, var_2_00, var_3_00, var_4_00, var_5_00, url_2_00, var_a_000, url_a_000, var_b_000, url_b_000  
    url_1_00, var_1_00, var_2_00, var_3_00, var_4_00, var_5_00, url_2_00, var_a_001, url_a_001, var_b_001, url_b_001  
    url_1_00, var_1_00, var_2_00, var_3_00, var_4_00, var_5_00, url_2_00, var_a_002, url_a_002, var_b_002, url_b_002  
    url_1_00, var_1_00, var_2_00, var_3_00, var_4_00, var_5_00, url_2_00, var_a_003, url_a_003, var_b_003, url_b_003

你知道这很长时间,但也许某个地方有人需要它!在

对于带列的CSV:

  • CSV1型
    • 网址1
  • CSV2型
    • 网址1
    • 变量1
    • 网址2
  • CSV3
    • 网址2
    • 变量_A

如果要合并这些csv,只需使用pandas.merge。在

熊猫。合并(CSV1,CSV2)将使用它们的公共列连接CSV1和CSV2(在示例中,columnurl_1)。在

看看这个例子here。在

相关问题 更多 >

    热门问题