一摇幻、概述
一般情況下垒迂,一套完整的數(shù)據(jù)分析的主要過程是:
- 需求分析
- 數(shù)據(jù)獲取
- 數(shù)據(jù)清洗
- 數(shù)據(jù)分析的邏輯構建
- 可視化
- 報告撰寫
- 總結反思
很多時間牵舵,公司的數(shù)據(jù)是從網(wǎng)站后臺直接導出給數(shù)據(jù)分析師堂污。但是在某些情況下家肯,數(shù)據(jù)并不能從后臺直接獲取,或者只能從別的公司的網(wǎng)站獲取盟猖,這時候數(shù)據(jù)分析師不光需要掌握數(shù)據(jù)分析的邏輯讨衣,還需要掌握一定的數(shù)據(jù)獲取能力,最便捷的數(shù)據(jù)獲取方式就是python爬蟲式镐。
本文內(nèi)容:
本文主要爬取并下載教育部從1981年至今發(fā)布的所有通知反镇、公告、政策文件娘汞,進而通過數(shù)據(jù)分析來呈現(xiàn)中國近30年的教育發(fā)展及未來走向歹茶。
二、運行環(huán)境
- python3.7
- win10或mac
- pycharm (一款好用的IDE)
- 所需要的python庫:
(1) requests: python中較為基礎的爬蟲庫你弦,多數(shù)情況用于獲取網(wǎng)頁信息,具體學習移步:
requests官方教程
(2) PyQuery:一個好用的解析庫惊豺,用來定位你所需要的信息在網(wǎng)頁中的位置。具體學習移步:
PyQuery官方教程
(3) pandas:python數(shù)據(jù)分析中最常用的庫禽作,功能異常強大尸昧。
具體學習移步:
pandas官方教程
(4) json:讀取json文件的庫(python默認已安裝)
(5) xlwt:讀取excel文件的庫(讀取excel報庫缺失錯誤時手動安裝)
具體的安裝直接在cmd或者終端中輸入:
pip(或pip3) install 庫命,例如
pip install requests
注:也可以直接使用現(xiàn)成的一些python爬蟲輪子领迈,例如強大的Scrapy(本文不做介紹)
三彻磁、爬蟲過程
1. 在程序中導入所需的庫:
import requests # 導入requests
from pyquery import PyQuery as pq # 導入PyQuery
import time
import pandas as pd
import json
import xlwt
2. 構造爬蟲的headers
顧名思義,就是一些爬蟲的偽裝狸捅,需要向瀏覽器提交的數(shù)據(jù)等衷蜓,統(tǒng)一放入headers中。
User-Agent 后面是跟的瀏覽器的偽裝尘喝,由于服務器一般拒絕爬蟲爬取磁浇,因為會造成服務器壓力,因此一般都需要偽裝
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
}
3. 一些變量賦值朽褪,如網(wǎng)站的地址置吓,輸出文件的名字
url_base1 = 'http://www.moe.gov.cn/was5/web/search?channelid=258518&searchword=&page='
# 網(wǎng)站的部分ID地址,page=的后面是頁碼的數(shù)缔赠,在之后的循環(huán)中使用
file_name = 'Policy.cvs'
4. 爬蟲邏輯及網(wǎng)站預分析
在Chrome瀏覽器打開地址:
http://www.moe.gov.cn/was5/web/search?channelid=258518&searchword=&page=1
右鍵 “檢查” 衍锚,如圖:
需要爬取并下載的內(nèi)容:
(1)文章標題
(2)發(fā)布時間
檢查源代碼發(fā)現(xiàn)一些標題由于過長而只顯示了部分,后面是...嗤堰,這就需要進入二級的網(wǎng)站戴质,再從二級網(wǎng)站獲取標題。如圖
有了這些,那么具體的爬蟲過程也就很清楚了:
(1)首先告匠,進入第一頁
(2)獲取一個標題的鏈接與時間戈抄,時間直接存儲,用鏈接打開二級網(wǎng)站
(3)在二級網(wǎng)站獲取標題
(4)重復(2)(3)后专,直到這一頁中的題目與時間全部存儲完畢
(5)轉入第二頁
(6)重復(2)(3)(4)遍歷這一頁中的題目與時間
(7)轉入第三頁.......之后就是程序的循環(huán)了
5. 具體代碼爬取過程
- 定義爬取一頁的函數(shù)以便在后續(xù)程序中調(diào)用
def get_one_page(url):
try:
response = requests.get(url, headers=headers) # 用requests獲取網(wǎng)站代碼
response.encoding = response.apparent_encoding
#提前設置encoding划鸽,避免后續(xù)解析亂碼問題
content = response.text
# 將獲取的代碼內(nèi)容,也就是text屬性直接給content
print('進入頁面成功')
doc = pq(content)
# 將網(wǎng)頁文字代碼戚哎,也就是content賦值給doc裸诽,其類型為PyQuery
for item in doc('.gongkai_wenjian ul li').items():
# 定位要爬取題目的超鏈接
date = item('span').text()
# 獲取發(fā)文日期
response_title = requests.get(item('a').attr('href'),headers=headers)
# 重新用requests庫打開這個超鏈接并獲取網(wǎng)頁代碼
response_title.encoding = response_title.apparent_encoding
content_title = response_title.text
doc_title = pq(content_title)
title = doc_title('h1').text().replace('\n','')
# 定位二級網(wǎng)站標題位置并返回給title
Policy = (
item('a').attr('href'),
title,
date
)
# 定義一個元組,包含鏈接型凳、題目與日期
print(Policy)
write_to_file(Policy)
# 用write_to_file()函數(shù)將其存儲起來崭捍,后面進行函數(shù)定義
except Exception as e:
print('Error', e.args)
- 定義write_to_file()函數(shù),補上上一個函數(shù)的坑
def write_to_file(content):
with open(file_name, 'a', encoding='utf-8') as f:
f.write(content[0]+','+content[1]+','+content[2]+'\n')
# 存儲為.cvs文件啰脚,之后再輸出為excel
- 定義一個輸出excel文件的函數(shù):
def creat_excel(file_name):
df = pd.DataFrame(pd.read_csv(file_name, encoding='utf-8', names=['Url', 'Title','date']))
df.drop_duplicates(subset='Url', keep='last', inplace=True)
# 舍去重復的標題殷蛇,保留最后一個
df.to_excel('Policy_qingdao.xlsx')
- 有了以上三個函數(shù),就可以定義主函數(shù)了:
def main():
for i in range(1,680):
# 獲取1到680頁的內(nèi)容橄浓。(如果網(wǎng)站有更新頁碼此項也要更新)
print('即將爬取第'+str(i)+'頁')
url = url_base1 + str(i)
get_one_page(url)
time.sleep(0.1) # 爬取一頁休眠0.1秒
creat_excel(file_name)
# 輸出excel
- 定義了主函數(shù)粒梦,還需要執(zhí)行:
if __name__ == '__main__':
main()
至此,程序代碼已完整荸实,直接運行匀们,過10分鐘左右就可以獲取1萬多條信息存在excel中。
下一篇文章將具體分析這一萬多條大數(shù)據(jù)准给;在正式開始之前泄朴,讀者可以閱讀一些基礎知識。數(shù)據(jù)分析環(huán)境搭設以及關于excel文件的讀取與分析可以參考之前的一篇文章:Python 數(shù)據(jù)分析實例:
Pandas分析問卷選擇率