【爬取动态网页-以黄河水文站数据为例】
爬取動(dòng)態(tài)網(wǎng)頁-以黃河水文站數(shù)據(jù)為例
一、項(xiàng)目背景
這個(gè)項(xiàng)目來源于我的本科畢業(yè)設(shè)計(jì)的一部分,導(dǎo)師讓我去搜集這方面的數(shù)據(jù)。
二、項(xiàng)目過程
1、問題初探
由于我前期跟著MOOC學(xué)習(xí)了python編程語言,所以我打算用python編寫爬蟲程序來解決這個(gè)問題。但是我沒有學(xué)過爬蟲,所以我花了半天左右的時(shí)間在MOOC上學(xué)習(xí)了爬蟲的基本知識,例如requests庫和bs4庫等等。當(dāng)我學(xué)完去實(shí)踐的時(shí)候發(fā)現(xiàn),這個(gè)教程是針對靜態(tài)網(wǎng)頁的。由于我需要爬取2002年—至今每一天的數(shù)據(jù),所以我必須知道動(dòng)態(tài)頁面是怎么爬取的。我開始在網(wǎng)絡(luò)上搜索相關(guān)的解決辦法,下面的這篇文章給了我啟發(fā),并進(jìn)行了里面方法的嘗試。
爬蟲入門_7:動(dòng)態(tài)加載數(shù)據(jù)處理及案例實(shí)戰(zhàn)
2、難點(diǎn)突破
selenium環(huán)境安裝
第一步是安裝selenium,第二步是下載對應(yīng)的瀏覽器驅(qū)動(dòng)程序,我下的谷歌瀏覽器的驅(qū)動(dòng)程序,注意只有針對32位的驅(qū)動(dòng)程序,64位的也能用,還有要下載對應(yīng)的瀏覽器版本。具體操作步驟網(wǎng)上挺多的,這里不再贅述。
日期控件的處理
網(wǎng)頁上的日期是需要下拉選擇的,不能手動(dòng)輸入日期,如下圖所示:
第一,我得去除日期的只讀屬性。找到標(biāo)簽,并將’readonly’屬性刪除:
第二,清空原來的日期數(shù)據(jù),輸入想要的日期數(shù)據(jù):
browser.execute_script(js) browser.find_element(By.ID,'ContentLeft_menuDate1_TextBox11').clear()#清空原來的數(shù)據(jù) browser.find_element(By.ID,'ContentLeft_menuDate1_TextBox11').send_keys(date[i])最后,最重要的一步。用selenium模擬點(diǎn)擊按鈕:
browser.find_element(By.ID,'ContentLeft_Button1').click()#模擬點(diǎn)擊按鈕至此,最難的一步完成了,接下來的操作就是單純針對靜態(tài)頁面的,不予贅述。
三、項(xiàng)目python代碼
import requests from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium import webdriver from time import sleep from selenium.webdriver.common.by import By import bs4 import csv import datetime import time time_start=time.time()# 生成日期數(shù)據(jù) def create_assist_date(datestart=None, dateend=None):# 創(chuàng)建日期輔助表if datestart is None:datestart = '2016-01-01'if dateend is None:dateend = datetime.datetime.now().strftime('%Y-%m-%d')# 轉(zhuǎn)為日期格式datestart = datetime.datetime.strptime(datestart, '%Y-%m-%d')dateend = datetime.datetime.strptime(dateend, '%Y-%m-%d')date_list = []date_list.append(datestart.strftime('%Y-%m-%d'))while datestart < dateend:# 日期疊加一天datestart += datetime.timedelta(days=+1)# 日期轉(zhuǎn)字符串存入列表date_list.append(datestart.strftime('%Y-%m-%d'))return date_listif __name__ == '__main__':date = create_assist_date("2002-01-01", '2002-12-31') for i in range(len(date)):# 設(shè)置selenium使用chrome的無頭模式chrome_options = Options()chrome_options.add_argument('--headless')chrome_options.add_argument('--disable-gpu')# 在啟動(dòng)瀏覽器時(shí)加入配置browser = webdriver.Chrome(options=chrome_options)# 模擬瀏覽器打開網(wǎng)址browser.get('http://61.163.88.227:8006/hwsq.aspx?sr=0nkRxv6s9CTRMlwRgmfFF6jTpJPtAv87')# 等待加載,最多等待20秒js='document.getElementById("ContentLeft_menuDate1_TextBox11").removeAttribute("readonly");'browser.execute_script(js)browser.find_element(By.ID,'ContentLeft_menuDate1_TextBox11').clear()#清空原來的數(shù)據(jù)browser.find_element(By.ID,'ContentLeft_menuDate1_TextBox11').send_keys(date[i])browser.find_element(By.ID,'ContentLeft_Button1').click()#模擬點(diǎn)擊按鈕sleep(2)html=browser.page_sourcesoup=BeautifulSoup(html,'html.parser')data=soup.find_all('table','mainTxt')f = open('data2002.csv', 'a+', newline="", encoding='utf-8')writer = csv.writer(f)for tr in data[1]('tbody')[0].children:#注意因?yàn)閐ata[1]('tbody')是列表,必須加上[0]if isinstance(tr,bs4.element.Tag):tds=tr('td')writer.writerow([date[i],tds[0].string,tds[1].string,tds[2].string,tds[3].string,tds[4].string])for tr in data[2]('tbody')[0].children:#注意因?yàn)閐ata[2]('tbody')是列表,必須加上[0]if isinstance(tr,bs4.element.Tag):tds=tr('td')writer.writerow([date[i],tds[0].string,tds[1].string,tds[2].string,tds[3].string,tds[4].string])f.close() time_end=time.time() print('共運(yùn)行{}s'.format(time_end-time_start))總結(jié)
以上是生活随笔為你收集整理的【爬取动态网页-以黄河水文站数据为例】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android+多米音乐+自动播放,an
- 下一篇: 电视卡众说纷纭(三):软压卡硬压卡区别