web刮取时间过长,python中没有输出

2024-10-02 16:20:55 发布

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

我目前正试图收集发电厂的数据。附件是我的代码如下所示:

#Import packages
import urllib.request
from bs4 import BeautifulSoup
import pandas as pd
import csv


#For loop to scrap details of power plants
gas_lst=[]

for i in range(1,46624):
    pid=str(i)
    url="http://www.globalenergyobservatory.com/form.php?pid=" + pid
    page=urllib.request.urlopen(url)
    soup=BeautifulSoup(page,'html.parser')

    #Distinguish power plants to different types of primary fuel
    types=soup.find(id="Type")
    power_types=types["value"]

    ###Breakdown of different units
    if power_types=="Gas":

        i = 1

        while True:
            if soup.find(id="unitcheck" + str(i)) == None:
                break
            else:
                gas_unit=soup.find(id="unitcheck" + str(i))
                gas_unit_values=gas_unit["value"]
                gas_capacity=soup.find(id="Capacity_(MWe)_nbr_" + str(i))
                gas_capacity_values=gas_capacity["value"]
                gas_commissioned=soup.find(id="Date_Commissioned_dt_" + str(i))
                gas_commissioned_date=gas_commissioned["value"]
                gas_decommissioned=soup.find(id="Decommission_Date_dt_" + str(i))
                gas_decommissioned_date=gas_decommissioned["value"]
                gas_HRSG=soup.find(id="Boiler/HRSG_Manufacturer_" + str(i))
                gas_HRSG_OEM=gas_HRSG["value"]
                gas_turbine=soup.find(id="Turbine_Manufacturer_" + str(i))
                gas_turbine_OEM=gas_turbine["value"]
                gas_generator=soup.find(id="Generator_Manufacturer_" + str(i))
                gas_generator_OEM=gas_generator["value"]

        i = i+1

    else:
        continue


    #Gas units breakdowns
    gas_lst.append([gas_unit_values,gas_capacity_values,gas_commissioned_date,gas_decommissioned_date,gas_HRSG_OEM,gas_turbine_OEM,gas_generator_OEM])
    gas_df=pd.DataFrame(gas_lst)
    gas_df.columns=['Unit','Capacity','Date_commissioned','Date_decommissioned','HRSG_manufacturer','Turbine_manufacturer','Generator_manufacturer']

    print(pid)


    #Convert to csv file
    gas_df.to_csv('gas_units_breakdowns.csv',index=False) 

然而,这个过程耗时太长,而且似乎根本没有任何输出。我想知道是不是因为我的代码错了?任何帮助都是非常感谢的。在


Tags: csvtoimportidvaluefindtypespower
2条回答

我建议多处理。在等待服务器响应每个请求时,您的计算机基本上处于空闲状态。根据我正在抓取的服务器的不同,我可以通过使用多处理来获得10x-20x的加速。在

首先,我将您的循环转换为一个函数,该函数以url为参数并返回: [gas_unit_values,gas_capacity_values,gas_commissioned_date,gas_decommissioned_date,gas_HRSG_OEM,gas_turbine_OEM,gas_generator_OEM]。在

这里有一个大概的轮廓

import urllib.request
from bs4 import BeautifulSoup
import pandas as pd
import csv
from multiprocessing.dummy import Pool

def scrape_gas_data(url):
    # your main code here
    return [gas_unit_values,gas_capacity_values,gas_commissioned_date,gas_decommissioned_date,gas_HRSG_OEM,gas_turbine_OEM,gas_generator_OEM]

url_list = ["http://www.globalenergyobservatory.com/form.php?pid={}".format(i) for i in range(1,46624)]

# Since http requests can sit idle for some time, you might be able to get away
# with passing a large number to pool (say 50) even though your machine probably
# can't run 50 threads at once
my_pool = Pool()
my_pool.map(scrape_gas_data, url_list)

beauthoulsoup文档提到lxml解析器比html.parser更快。我不确定这是限制速率的步骤,但是由于更改解析器通常是容易实现的,所以我也会提到这一点。在

另外,作为一个关于良好实践的注释,您在循环中分配变量i,这不是很干净。在

如果你直接去天然气类型的工厂,你会有更好(更快)的结果,而不是检查每一个工厂,然后看看它是否是天然气。在

您可以使用以下参数获取天然气厂的列表:

payload = {
'op': 'menu_name',
'type': '2',
'cnt': '226',
'st': '0'}

这将减少从46000多个请求到1384个Gas请求的搜索,并去掉if power_grids == "Gas",因为我们已经知道我们已经拥有了"Gas"

您的代码似乎也卡在了while True中。这是因为你在循环之外增加i,所以我修正了这个问题。在

最后,我没有检查你的数据,你在那里收集(即气体单位价值,气体流量,等等)。看起来有些值是空的。所以我将留给您来完成,因为这段代码至少可以帮助您克服第一个障碍。在

^{pr2}$

相关问题 更多 >