1. 程式人生 > >python實戰(1):簡單的資料採集與分析

python實戰(1):簡單的資料採集與分析

最近忙著做畢業設計,最愛的python當然成了我的切入點。因此特意找了一個專案來練練手,專案很簡單,就是利用python爬取資料,然後再利用matplotlib進行資料視覺化。

專案設計:爬蟲爬取資料並存入mongodb資料庫中,然後再編寫指令碼讀取資料,進行繪圖。

一:資料爬取(以騰訊招聘為列)
這裡寫圖片描述
這四個類別就是我們的爬取目標
然後看一看網頁原始碼,準備利用xpath提取想要的元素
這裡寫圖片描述
可以看到有兩個不同的class屬性,為了將兩個都提取出來,我們只需要使用xpath的運算子“ | ”,計算兩個節點的集

(//tr[@class="even"] | //tr[@class="odd"
])//a/text()

爬蟲原始碼如下

# -*- coding:utf-8 -*-
import requests
from lxml import etree
import time
import pymongo
import random
class Tencent(object):
    def  __init__(self):
        '''
            初始化url
            網頁頁碼下標地址
            爬蟲控制開關
        '''
        self.url="http://hr.tencent.com/position.php?&start="
self.index=0 self.switch=True #建立一個列表用來儲存tencent招聘資訊 self.tencent_data=[] def mongodb(self): ''' 建立mongodb物件 連線mongodb ''' client=pymongo.MongoClient(host="localhost",port=27017) db=client.py3 collection=db.tencent for
data in self.tencent_data: collection.insert(data) print("已將資料全部存入到mongodb中!") def gethtml(self,url): ''' 載入html頁面,並解析為xml文件 ''' headers_list=[ {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0"}, {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.87 Safari/537.36 OPR/37.0.2178.32"}, {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36"}, {"User-Agent":"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"}, {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36"}, {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0"}, ] headers=random.choice(headers_list) #捕獲異常 try: response=requests.get(url=url,headers=headers,timeout=20) except: print("have a error") finally: response=requests.get(url=url,headers=headers,timeout=20) html=response.text content=etree.HTML(html) return content def loadpage(self,url): ''' 利用xpaht獲取資訊,存入mongodb中 ''' content=self.gethtml(url) #職位名稱 job_title=content.xpath('(//tr[@class="even"] | //tr[@class="odd"])//a/text()') #職位類別 job_category=content.xpath('//tr[@class="even"]//td[2]//text() | //tr[@class="odd"]//td[2]//text()') #人數 number=content.xpath('//tr[@class="even"]//td[3]//text() | //tr[@class="odd"]//td[3]//text()') #地點 location=content.xpath('//tr[@class="even"]//td[4]//text() | //tr[@class="odd"]//td[4]//text()') #整合資訊 info_list=zip(job_title,job_category,number,location) for info in info_list: #拼接成字典,方便存入mongodb info={"job_title":info[0],"job_category":info[1],"number":info[2],"location":info[3]} #將資料追加到一個list列表中 self.tencent_data.append(info) print("正在獲取資料"+"-"*10) def startswitch(self): ''' 開關 ''' while self.switch==True: #拼接url地址 tencenturl=self.url+str(self.index) self.loadpage(tencenturl) time.sleep(5) #判斷是否到了最後一頁 if self.index<2500: self.index+=10 else: self.switch=False #將資料存到mongodb中 self.mongodb() print("程式結束") if __name__ == '__main__': tencent=Tencent() tencent.startswitch()

執行結果這裡寫圖片描述

二:資料視覺化
原始碼

# -*- coding:utf-8 -*-
import pymongo
import matplotlib.pyplot as plt
import pylab 
#讓matplotlib顯示中文
pylab.mpl.rcParams['font.sans-serif'] = ['SimHei'] 
#連線mongodb
client=pymongo.MongoClient(host="localhost",port=27017)
db=client.py3
collection=db.tencent
#獲取資訊條數
technology=collection.count({"job_category":"技術類"})
design=collection.count({"job_category":"設計類"})
product=collection.count({"job_category":"產品/專案類"})
market=collection.count({"job_category":"市場類"})
function=collection.count({"job_category":"職能類"})
edit=collection.count({"job_category":"內容編輯類"})
service=collection.count({"job_category":"客戶服務類"})
#數值
values=[technology,design,product,market,function,edit,service]
#標籤
labels=["技術類","設計類","產品/專案類","市場類","職能類","內容編輯類","客戶服務類"]
#突出部分
explode=[0,0,0,0,0,0.2,0.5]
#顏色
colors=["yellow","blue","red","purple","green","brown","black"]
#標題
plt.title("招聘崗位型別比例",fontsize=25,color="red")
#標題
plt.pie(values,labels=labels,colors=colors,autopct="%1.2f%%",explode=explode)
plt.axis("equal")
plt.show()

執行結果
這裡寫圖片描述
感覺在深入一點的話,這就是我的畢業設計了!
這裡寫圖片描述