我選擇的**是中國天氣網中的蘇州天氣,準備抓取最近7天的天氣以及最高/最低氣溫
程式開頭我們新增:
# coding : utf-8
這樣就能告訴直譯器該py程式是utf-8編碼的,源程式中可以有中文。
要引用的包:
requests:用來抓取網頁的html源**
csv:將資料寫入到csv檔案中
random:取隨機數
time:時間相關操作
socket和http.client 在這裡只用於異常處理
beautifulsoup:用來代替正則式取原始碼中相應標籤中的內容
urllib.request:另一種抓取網頁的html源**的方法,但是沒requests方便(我一開始用的是這一種)
獲取網頁中的html**:
header是requests.get的乙個引數,目的是模擬瀏覽器訪問
header 可以使用chrome的開發者工具獲得,具體方法如下:
開啟chrome,按f12,選擇network
重新訪問該**,找到第乙個網路請求,檢視它的header
timeout是設定的乙個超時時間,取隨機數是因為防止被**認定為網路爬蟲。
然後通過requests.get方法獲取網頁的源**、
rep.encoding = 『utf-8』是將源**的編碼格式改為utf-8(不該源**中中文部分會為亂碼)
下面是一些異常處理
返回 rep.text
獲取html中我們所需要的字段:
這裡我們主要要用到beautifulsoup
beautifulsoup 文件
首先還是用開發者工具檢視網頁原始碼,並找到所需字段的相應位置
找到我們需要欄位都在 id = 「7d」的「div」的ul中。日期在每個li中h1 中,天氣狀況在每個li的第乙個p標籤內,最高溫度和最低溫度在每個li的span和i標籤中。
感謝joey_ko指出的錯誤:到了傍晚,當天氣溫會沒有最高溫度,所以要多加乙個判斷。
**如下:
def get_data(html_text):
final =
bs = beautifulsoup(html_text, "html.parser") # 建立beautifulsoup物件
body = bs.body # 獲取body部分
data = body.find('div', ) # 找到id為7d的div
ul = data.find('ul') # 獲取ul部分
li = ul.find_all('li') # 獲取所有的li
for day in li: # 對每個li標籤中的內容進行遍歷
temp =
date = day.find('h1').string # 找到日期
inf = day.find_all('p') # 找到li中的所有p標籤
if inf[1].find('span') is none:
temperature_highest = none # 天氣預報可能沒有當天的最高氣溫(到了傍晚,就是這樣),需要加個判斷語句,來輸出最低氣溫
else:
temperature_highest = inf[1].find('span').string # 找到最高溫
temperature_highest = temperature_highest.replace('℃', '') # 到了晚上**會變,最高溫度後面也有個℃
temperature_lowest = inf[1].find('i').string # 找到最低溫
temperature_lowest = temperature_lowest.replace('℃', '') # 最低溫度後面有個℃,去掉這個符號
return final
寫入檔案csv:將資料抓取出來後我們要將他們寫入檔案,具體**如下:
def write_data(data, name):
file_name = name
with open(file_name, 'a', errors='ignore', newline='') as f:
f_csv = csv.writer(f)
f_csv.writerows(data)
主函式:
if __name__ == '__main__':
url =''
html = get_content(url)
result = get_data(html)
write_data(result, 'weather.csv')
然後執行一下:
生成的weather.csv檔案如下:
總結一下,從網頁上抓取內容大致分3步:
1、模擬瀏覽器訪問,獲取html源**
2、通過正則匹配,獲取指定標籤中的內容
3、將獲取到的內容寫到檔案中
【看老師主頁簡介,一起學習吧!】
來自乙個react SPA的總結 redux篇
本文是自己這幾天做乙個reactspa的其中之一篇總結,主要總結在實踐中,學習到的有關redux的一些思想 並沒有太多細節 方便日後自己的重溫 redux用作管理應用的data state和ui state,在react中元件間的通訊一般是parent child間,兄弟間鑑於我初出茅廬,暫時沒遇到...
來自乙個前端新手的感悟
初入社會,我只是乙個前端路上飛行的菜鳥,經過一段時間的工作之後,才知道,我踩了無數的坑。希望,看過我寫的文章的同胞們,不要再和我犯同樣的錯誤。純屬個人思考 1.當負責專案中乙個模組的開發時,不要忘記,它只是專案中的乙個模組。當我拿到專案經理安排好的工作計畫書時,開始對自己負責的部分的需求進行熟悉,這...
乙個閉環負反饋的設計經驗
乙個閉環負反饋的設計經驗 在上游指令更新快,而下游調節慢,反饋有延時的情況下,指令每一次更新並下發前,都要等待接收到上次指令下發後最新的反饋,確保負反饋是可靠的,因此指令的更新頻次必須比下游調節速度更慢。否則會出現指令的過調。例如 同期函式中,頻率調節的給定更新 下發頻次要慢於反饋更新延時。例如 軟...