需求: 爬取2001至今每日的流量数据
存在问题: 按日显示数据,手动复制或抄录存在问题
代码:
"""""""""""""""""""""""""""
任务:爬取水情日报
难点一:网页中使用了时间控件,每页仅显示一天的数据,只允许点击不允许输入;
解决办法:找到时间输入控件,使用selenium对网页源代码进行修改,删除readonly属性,这样就可以输入日期了。
难点二:爬取表格内容
解决办法:pandas读取表格内容十分方便
"""""""""""""""""""""""""""
from selenium import webdriver
from selenium.webdriver.common.by import By
import pandas as pd
import time
# 输入时间序列
Datetime = pd.read_excel('05-09.xlsx')['date']
# datetime格式转化为字符串
Datetime = Datetime.dt.strftime('%Y-%m-%d')
Datelist = list(Datetime)
# 准备空表
Empty_df = pd.DataFrame()
# 设置Selenium驱动器路径
driver = webdriver.Chrome('chromedriver.exe')
# 打开目标网页
url = 'xxx'
driver.get(url)
for i in Datelist:
new_date_time = i
# 定位日期控件元素、定位“查询”控件元素、定位数据所在表格:name为xxx的input
date_picker = driver.find_element(By.XPATH,"//input[@name='ctl00$ContentLeft$menuDate1$TextBox11']")
inquiry = driver.find_element(By.XPATH,"//input[@name='ctl00$ContentLeft$Button1']")
datatable = driver.find_element(By.XPATH,"//table[@class='mainTxt']")
# 执行JavaScript以删除元素的指定属性
script = "arguments[0].removeAttribute('readonly');"
driver.execute_script(script, date_picker)
script = "arguments[0].removeAttribute('value');" # 该属性为时间设置了一个初始值,删掉
driver.execute_script(script, date_picker)
# 输入新的日期时间值
date_picker.send_keys(new_date_time)
# 点击查询
inquiry.click()
# 获取表格
table = pd.read_html(datatable.get_attribute('outerHTML'))[0][2:]
table['Date']=new_date_time
table = table.drop(29)
table = table.set_index('Date')
Empty_df = Empty_df.append(table)
# 刷新页面
driver.refresh()
time.sleep(1)
# 关闭驱动器
driver.quit()
Empty_df.to_excel('05-09_runoff.xlsx')