自學Python之路--入門菜鳥的菜鳥篇:爬蟲
第一次寫部落格&第一次自學Python&第一次實戰
Hi,親們,本部落格只是個人瞎寫著記錄的:
- 作為已經做BI工程師三年的人竟然第一次接觸Python,自學Python 哎~~是不是很晚呢
- 畢業第一年進入SAP BW模組
- 第二年已經差不多開始懂點什麼是資料建模,什麼是資料倉庫,資料集市
- *第三年在公司開始做ETL,資料清洗,資料整合,報表展示
到目前所使用過的資料庫:
SAP HANA,SQL server,Greenplum,Mysql,Hadoop,MongoDB,Oracle**
所使用過的BI工具:
SAP BO,Tableau,PowerBI,Microsoft CUBE,Tabular等
唯獨目前最火的Python,R等語言 一次都沒接觸過,因此藉此正好有空閒時間來自學一下Python
入門學習篇
先明確學習的內容:爬蟲!!
去各種網站搜Python自學教學等教材。
最好用的還是 w3cschool的資料,不懂得問題直接去Bing搜,就是這麼簡單粗暴邊學習邊應用:
個人是比較習慣於一一邊學習一邊實戰的方式。所以一邊學習爬蟲相關的庫, 一邊直接應用學習到的庫:
BS4
urlopen
pyhdb
datetime
requests
re
也不能說是學完了,應該是有一點點知道了怎麼應用,網上資料很多,不懂直接去Bing搜就出來一堆東西啦~哈哈哈哈選定一個目標就直接實戰:
稱為我獵物的是某DM論壇。(因為個人比較喜歡遊戲)
廢話不多說下面就獻醜自己亂寫的程式碼,因為沒有考慮效率問題,希望能得到更好的建議
實戰篇
分析
先進入論壇首頁,分析網站結構,找出規律。
1、發現搜尋列右邊已經給出所有遊戲類目,找到定位就更簡單了。
把所有類目都放在class=”scbar_hot_td”下的id=”scbar_hot”下 class=‘xi2’
Href=後面直接有每個類目地址
2、開啟每個類目地址又發現一個很有規律性的邏輯~~哈哈太有趣
每個類目下都按一定規律寫了遊戲論壇地址和名稱,讓我更簡單的利用爬蟲來爬取資料提供了很強大的支援。
3、進入每款遊戲論壇地址也一樣,都按一定規律編寫每個帖子的基本資訊
比如class=”new” 存放帖子型別、帖子標題、熱度等資訊
class=”by”存放建立者建立日期、最後回覆人以及最後回覆日期等
class=”num”存放檢視數、回覆次數
編寫Python
提取每款遊戲資訊:
def getgrand(url):
#URL就是網頁地址
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'} # 設定標頭檔案資訊 #
response = requests.get(url, headers=headers).content # 提交requests get 請求
soup = BeautifulSoup(response, "html.parser") # 用Beautifulsoup 進行解析
commid = soup.findAll('a', class_='xi2') ##這裡找出所有xi2類
for commid2 in commid[2:-1]: ##爬取論壇首頁
href=commid2.get("href") ##這裡要抽取每個遊戲類目地址
if len(href.split("-"))>=2 :
id=href.split("-")[1] ##這裡要抽取每個類目ID,後面做資料模型的時候用
site=url+href #完整的遊戲類目地址
print(site)
cate=commid2.text #這裡要抽取每個遊戲類目名稱
if check_contain_chinese(cate) == True: ## 相當於資料清洗,因為抽取有可能不是類目名稱,排除不是中文的名稱
response2 = requests.get(site, headers=headers).content # 提交requests get 請求
soup2= BeautifulSoup(response2, "html.parser") # 用Beautifulsoup 進行解析
catmid=soup2.findAll('dt')
intohana_grandcat(conn, id, cate, site)##匯入到HANA資料庫裡 建立類目維表
# print(catmid)
# print(cate)
for catmid2 in catmid: ##爬取每個遊戲首頁
a=catmid2.findAll("a")[0]
href2=a.get("href")
gamename=a.text ## 提取遊戲名稱
# print(gamename)
if (len(href2.split("-"))>=2) & (href2[-4:]=="html") : ##資料清洗,清理垃圾資料
site2=url+href2 ## 提取出每款遊戲地址
id2=href2.split("-")[1] ##每款遊戲ID
# print(a)
# print(id2)
# print(site2)
intohana_game(conn, id, cate, id2, gamename, site2) ###建立遊戲維度維表
getdetail(site2,conn,id,id2,gamename) ## get detail of blog information ##要爬取每個遊戲論壇地址
爬取每個遊戲論壇地址:
def getdetail(site,conn,GRAND_ID,GAME_ID,GAME_NAME): ## get detail of blog information
globals() #定義所用到的所有全域性變數
type=''
theme=''
replynum=''
readnum=''
editor=''
createdate=''
lastreply=''
lastreplydate=''
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'} # 設定標頭檔案資訊 #
response3 = requests.get(site, headers=headers).content # 提交requests get 請求
soup3 = BeautifulSoup(response3, "html.parser") # 用Beautifulsoup 進行解析
gamemid = soup3.findAll('th', class_='new')
td = soup3.findAll('td', class_='by')
for tbody in soup3.findAll('tbody'): ##對每個tbody進行解析
for tr in tbody.findAll('tr'): ##對每個tbody的tr進行解析
for new in tr.findAll('th', class_='new'): ##對每個tbody的tr下class_=new進行解析
em = new.find('em') #抽取帖子型別
if em: ##資料清洗
type = em.text[1:-1]
else:
type = ''
theme = new.find('a', class_='s xst').text #抽取帖子主題
num = tr.find('td', class_='num') ###get reply & read #抽取帖子檢視和回覆次數
if num: ##資料清洗
replynum = num.find('a').text
readnum = num.find('em').text
else:
replynum='0'
readnum='0'
# print(type, theme, replynum, readnum)
by = tr.findAll('td', class_='by') # get editor & date #抽取每個帖子 建立者和最後回覆人
if by: ##資料清洗
for uby in by[:1]: # get editor & date
createdate = uby.find('em').text
editor = uby.find('cite').text
# print(editor,createdate)
for uby in by[1:]: # get editor & date
lastreply = uby.find('cite').text
lastreplydate = uby.find('em').text
# print(editor, createdate, lastreply, lastreplydate)
# print(lastreply, lastreplydate)
intohana_blogdetail(conn,GRAND_ID,GAME_ID,GAME_NAME,type,theme,replynum,
readnum,editor,createdate,lastreply,lastreplydate,current_daytime) # 對每條資料逐步insert到資料庫表建立Fact實時表
整個程式碼釋出到GIT上,做了點簡單的現狀分析
簡單分析:
工具
PyCharm
SAP HANA
SAP BO
EXCEL
改進
1、不知道怎麼改進程式碼,就感覺做的太粗糙,希望有人指導
2、分析目的不明確,導致抽取的資料沒有目的性。
3、希望有大神能教點分析方法。