python實戰(1):簡單的資料採集與分析
阿新 • • 發佈:2019-01-09
最近忙著做畢業設計,最愛的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()
執行結果
感覺在深入一點的話,這就是我的畢業設計了!