Python爬虫实战(2) 爬取中国土壤数据库部分数据
生活随笔
收集整理的這篇文章主要介紹了
Python爬虫实战(2) 爬取中国土壤数据库部分数据
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前幾天,因為學校的通信感知實習需要作者利用一些邊緣設備像傳感器來獲取土壤的相關數據,奈何作者家境貧寒,買不起傳感器,所以說打算去到中國土壤數據庫上面去爬取一些數據下來(白嫖真爽)
1.分析網頁的結構
要設計一個網絡爬蟲程序設計,首先要分析網頁的代碼結構。
打開要獲取數據信息的網站:
**網頁:**http://vdb3.soil.csdb.cn
這里我們選擇福建省作為要爬取數據的對象
選擇漳州市
隨便點擊一個土種信息,這里我點擊了青底灰泥田
點擊查看,進入到最終的網頁
我們只需要獲取這些數據就可以了
PS:數據有些是空的,我們爬取下來后需要改成null字樣,不能讓它空著
我們這時候看下網站的域名:
網站域名
可以看到后面跟了參數:id = 10503
打開網頁的代碼查看器(按下F12鍵),則可以看到當前頁面的代碼結構,如下圖
可以看到,標題存放在<div>中,而標題所對應的數據也存放在<div>中。只不過這兩個標簽它們的屬性不一樣。
2.獲取數據
根據頁面的代碼結構分析,我們知道只要找到 <div>標簽,就能獲得相對應的數據
首先我們利用 requests 來獲取網頁內容
其中:
- kw是來存放我們的 URL 參數的,我們手動輸入的參數會添加到URL后面,這樣就能實現隨便爬取任何一個地方一個土種的數據信息了
- 設置模擬瀏覽器和時間間隔為5s,用來防止目標服務器的反爬蟲機制
將獲取到的內容進行解析
這部分比較長,因為我們還要將獲取到的數據進行二次加工:
- 將爬取到的數據進行有目的的選擇,挑選出我們需要的數據:只需要:土地利用、有機質、全氮、全磷、全鉀這幾個標題
- 如果標題的數據值為空,則顯示 null 字樣。
將獲取的數據進行歸并
合并成一個字典
def download_data(url):contents = get_pages(url)info_list, data_list = parse_content(contents)# 將兩個列表合并為一個字典,用zip方法dic1 = {}dic1 = dict(zip(info_list, data_list))return dic1結果
最后,我們來看一下結果如何
可以看到,我們要爬取的這一當前頁面參數為id = 10013
其中相關數據為
結果如下:
3.源代碼
最后,附上源代碼:
# -*- conding=utf-8 -*- import requests import bs4def get_pages(url):kw = {}args = str(input("請輸入要查詢的參數:"))kw["id"] = argsheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}response = requests.get(url=url, params=kw, headers=headers, timeout=5)content = response.textreturn contentdef parse_content(contents):soup = bs4.BeautifulSoup(contents, "lxml")# 獲取 土地利用, 有機質(%), 全氮(%), 全磷(%),全鉀(%)title_col_list = soup.find_all('div', class_="titlecol")list1 = []list2 = []for info in title_col_list:list1.append(info.text.strip())list1 = list1[-7:]list2.append(list1[0])list2.extend(list1[-4:])# 將‘土地利用, 有機質(%), 全氮(%), 全磷(%),全鉀(%)’信息列表賦值info_list = list2# 獲取 對應的詳細數據data_col_list = soup.find_all('div', class_="datacol")list3 = []list4 = []for data in data_col_list:list3.append(data.text.strip())list3 = list3[-7:]del list3[1:3]for i in list3:if i == '':# 將空格元素修改為nullindex = list3.index(i)list3[index] = 'null'data_list = list3# 返回兩個列表return info_list, data_listdef download_data(url):contents = get_pages(url)info_list, data_list = parse_content(contents)# 將兩個列表合并為一個字典,用zip方法dic1 = {}dic1 = dict(zip(info_list, data_list))return dic1if __name__ == "__main__":url = '''vdb3.soil.csdb.cn/front/detail-%E5%85%A8%E5%9B%BD%E7%AC%AC%E4%BA%8C%E6%AC%A1%E5%9C%9F%E5%A3%A4%E6%99%AE%E6%9F%A5%E5%86%9C%E7%94%B0%E8%82%A5%E5%8A%9B%E6%95%B0%E6%8D%AE%E5%BA%93$fer_second_nutrient?'''print("------------------------開始爬取數據-----------------------------------------")dict1 = download_data(url)print("數據為:\n", dict1)print("\n------------------------爬取數據完畢!----------------------------------")總結
以上是生活随笔為你收集整理的Python爬虫实战(2) 爬取中国土壤数据库部分数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: O_RDWR, O_CREAT等open
- 下一篇: php spl_autoload_reg