python selenium实现网站表格数据爬取--以波兰太阳能电站补贴数据为例

Posted 文仙草

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python selenium实现网站表格数据爬取--以波兰太阳能电站补贴数据为例相关的知识,希望对你有一定的参考价值。

需要爬取带下拉框选择的网站表格里的数据:波兰民用太阳能补贴项目的网站 https://mojprad.gov.pl/wyniki-naboru

开始打算用BeautifulSoup,不过没研究明白怎么实现下拉框选择和确认(如果有大神知道如何实现的话,求私信!!)。

后来,发现用selenium这个做网站自动化测试的包,用来做网站数据爬取简直不要太方便。

以下为最终实现的对带下拉框的网站表格进行爬取的实例。分步式解析~

前期准备:

这里使用的是chrome+selenium。使用前需要先下载chromdriver.exe并做好配置工作,这里就不详述了,CSDN可以为您解答。

以下是做好配置工作,selenium可以成功调用后的步骤:

第一步,打开网站。

#使用selenium读取网站表格数据
#被读取的表格数据需要进行下拉框选择

#拟爬取的网站
url = 'https://mojprad.gov.pl/wyniki-naboru'

#打开网站
from selenium import webdriver
driver = webdriver.Chrome(executable_path='C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe') 
driver.get(url) 

运行上述步骤后,应该会自动打开拟爬取的网站,同时在浏览器上方会有一行字,提示chrome在收到自动测试软件的控制,如下图:

第二步,定位下拉框位置

#选择网站中的下拉框并点击
from selenium.webdriver.support.select import Select
from selenium.webdriver import ActionChains

e = driver.find_element_by_id('list')
select = Select(e)

完成上述步骤后,会弹出一个提示::3: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead e = driver.find_element_by_id(‘list’)

目前可以忽略,不会对运行结果产生影响。

因为这个网站每页只有一个list,所以我选择了by_id(‘list’)定位下拉框。这一步可以根据不同网站,而选择不同的方式定位下拉框。

第三步:自动模拟用户选择下拉框内容,点击确认,并爬取对应的表格数据

import time
import pandas as pd

list_round_2 = []
error_page = []

#下拉框循环获得数据
for i in range(1,114):
    #因为下拉框选择比较多,打印出来可以清楚了解目前爬取到哪一页了
    print(i)
    #模拟用户在下拉框选择一个表格
    select.select_by_value(str(i)+'/MP2')
    #模拟用户点击确认选择
    #在"Go to the list"按钮位置单击
    button = driver.find_element_by_id("listSearch")
    ActionChains(driver).move_to_element(button).click(button).perform()
    
    #因为网站loading需要时间,所以该步不可缺少
    time.sleep(3)
    
    #获取界面展示的表格元素
    #注意这里用的是find_element
    table_body = driver.find_element_by_tag_name('tbody')
    #print(table_body.text)
    
    #获取表格元素所有行的数据
    #注意这里用的是find_elements
    data =table_body.find_elements_by_tag_name('tr') 
    #将每行数据写入list里
    for td in data:
        if td.text == 'Ładowanie zawartosci listy':
            #万一出现没读取到数据的表格,之后可以单独拎出来爬一次,节省时间。
            error_page.append(i)
            continue
        else:
            list_round_1.append(td.text)

上述步骤中有两个特别重要的注意事项

  • 对于加载需要一定时间的网站,建议使用time.sleep()让程序缓一下,不然的话很容易获取的数据是”the list is loading“之类的提示语。当然,也可以用其他的语句,重点是要留足网页加载的时间。
  • 在获取网页上的表格元素时用的是 “find_element_by_”,而如果获取表格中所有行的数据用的是 ”find_elements_by_",多了一个 ”s“。当时这一步数据出不来,我查了很久。。。
#查看一下获取到的数据
list_round_1[0:9]

[‘IRENA LIMANOWSKA MAŁOPOLSKIE 6.300 5000,00 zł 4’,
‘ANDRZEJ KAPAŁA WIELKOPOLSKIE 5.040 5000,00 zł 4’,
‘MARIUSZ PLUCIŃSKI WIELKOPOLSKIE 10.000 5000,00 zł 4’,
‘EWA WIELEBSKA WIELKOPOLSKIE 5.040 5000,00 zł 4’,
‘ANDRZEJ SZEWELUK ŚLĄSKIE 5.040 5000,00 zł 4’,
‘MIROSŁAW ANDRZEJ BOREJKO MAZOWIECKIE 3.780 5000,00 zł 4’,
‘DARIUSZ MODZELEWSKI ŁÓDZKIE 7.750 5000,00 zł 4’,
‘BOŻENA MAKSYLEWICZ MAŁOPOLSKIE 8.820 5000,00 zł 4’]

第四步:将表格转换为dataframe后导出xlsx文件

#将list 转换为dataframe后输出

df = pd.DataFrame(list_round_1)
df_splited = df[0].str.split(' ',expand=True)

df_splited.to_excel('Poland_home_solar_data_2.xlsx')

爬取下来的数据为list格式,每一个元素对应表格的一行,各列字段混在了一个元素里。为了导出以后更方便处理,初步优化一下,先转换成dataframe格式,然后将每行数据按空格拆开,更像一个表格形式,然后导出。

上述拆分的时候,会碰到一些名字里带”-“等特殊情况,这些特殊情况数量不多,打算用excel处理更方便。

给大家看一下转换后的数据表格。

#查看一下转换成DataFrame格式后的数据
df_splited

以上是关于python selenium实现网站表格数据爬取--以波兰太阳能电站补贴数据为例的主要内容,如果未能解决你的问题,请参考以下文章

python selenium实现网站表格数据爬取--以波兰太阳能电站补贴数据为例

python selenium实现网站表格数据爬取--以波兰太阳能电站补贴数据为例

使用selenium爬取网站动态数据

Python爬取异步加载的网站selenium+PhantomJS

Python网络爬虫之Selenium使用代理登陆:爬取去哪儿网站

python爬取凤凰网站的新闻,及其链接地址,来源,时间和内容,用selenium自动化和requests处理数据