小白爬蟲,數據分析艱辛之路
看到知乎很多爬蟲文章,但總是遇到各種問題,因為分享文章都是大神,很多對於小白來說都是大問題的細節,都被略過,題主是剛剛轉行(實際是準備轉行)學習python和爬蟲不久,分享整個網站爬取,以及數據簡單處理流程
筆者對數據分析,機器學習比較感興趣,作為一個半途開始轉行的人來說,需要一步步記錄自己學習心得
不管是數據分析還是機器學習或者深度學習,第一步是獲得數據
1 獲取數據
python語言簡單,庫多,不多說就python了
beautifoulsoup解析html特別好用,先post代碼(代碼有點丑,拍的話請輕點)
#!/usr/bin/env python# -*- coding: utf-8 -*-import urllib.requestfrom bs4 import BeautifulSoupimport urllib.parseimport timeimport pymysql# 鏈接到mysqlconnection = pymysql.connect(host=127.0.0.1, port=3306, user=root, password=password, db=y1, charset=utf8mb4, cursorclass=pymysql.cursors.DictCursor)curson = connection.cursor()def get_content(kw, page): headers = {User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0 , host:img01.zhaopin.cn} # 模擬瀏覽器 url ="http://sou.zhaopin.com/jobs/searchresult.ashx?jl=%e5%85%a8%e5%9b%bd&kw=" + urllib.parse.quote(kw) + "&sm=0&source=0&sg=c131af6ec2c74dfba41100e1c8925118&p="+str(page)+.html opener = urllib.request.build_opener() opener.addheaders = [headers] data = opener.open(url, timeout=30) html = data.read() data.close() return htmlkws = [java, python, php, 機器學習, 數據分析, BI, go, javascript, r語言, 數據挖掘, 大數據, 智能家居, vr工程師, 機器人, 深度學習, 人工智慧]job_list = []# 寫到mysql中for i in job_list: sql_insert = "insert into job(position,company,salary,location,post_time) " + "values(" + i + ) try: curson.execute(sql_insert) connection.commit() except Exception as e: print(e) connection.rollback()def main(): for kw in kws: for page in range(1, 100): try: soup = BeautifulSoup(get_content(kw, page), lxml) for item in soup.find_all(td, class_=[zwmc, gsmc, zwyx, gzdd, gxsj]): job_list.append(item.get_text().strip()) except: pass with open(job_analyse_zl.csv, a, encoding=utf-8) as f: # 不覆蓋原來內容 f.write(
) f.write(
) f.write(time.strftime("%I:%M:%S")) f.write(
) f.write(
) for i in range(len(job_list)): if i % 5 != 4: f.write(job_list[i]) f.write(,) if i % 5 == 4: f.write(job_list[i]) f.write(
)if __name__ == __main__: main()
本人也是初學python,對爬蟲也是知道基本流程
學習爬蟲需要知識
a.一門爬蟲語言 python/java
b.html/css/js
c.http相關知識
對於初學者,目的驅動是學習第一動力,
筆者對於轉行是否明智,該行業工資待遇怎麼樣?哪個城市需求比較多?哪個城市待遇比較高?
首先我們選擇智聯招聘作為例子 招聘_找工作_搜職位_智聯招聘
需求,我們要隨時了解自己的需要是什麼,而不能因為簡單好玩而迷失方向,知乎等平台可以看到很對分享爬蟲的文章,但都太簡單或者純粹炫技
1.1 查看爬取網站源代碼
對firefox 右鍵選擇查看源代碼,其他瀏覽器,大家可以自行百度,我們可以看到,我們需要爬取的信息
首先我們不能好多,信息不是越多越好,智聯招聘網站職位多,我們只抓取自己感興趣的職位
筆者因為對大數據,機器學習,深度學習,等比較感興趣,同時也想了解java。c#,python,js語言的熱度與待遇,為了敘述,先以python為例,此時的
url = 全國python招聘(求職) python招聘(求職)盡在智聯招聘
我們對職位名稱/公司名稱/職位月薪/發布時間/地區 欄位感興趣,通過對源代碼分析,可以看到這些信息都在『td』標籤下面,具體的是在class=gsmc,zwyx,gsmc,gzdd,gxsj下面
首先我們是獲得html內容
用urllib.request讀取網頁
然後用beautilfulsoup解析網站
html = urllib.request.open(url)
很多網站都有爬蟲手段,第一步我們是模擬瀏覽器,給一個header,他包含瀏覽器代理和網站伺服器,這些信息可以從瀏覽器獲得,具體如下,
在爬取網站,按F12(筆者是firefox其他瀏覽器請自行百度),然後點擊網路可以看到get或者post方法,智聯網站可以看到沒有這些信息,這對我們爬取網站更方便,筆者爬取51網站時,不久就被封了IP,一下子被還狠狠打擊,然後想到可以迂迴,先了解基本知識,再不斷攻克一個一個堡壘
html = urllib.request.open(url,header=header,timeout=30) timeout 也是為了防止被反爬蟲
1.2 解析html
這裡我們需要用的beautifulsoup這個庫,誰用都說好用,
soup = BeautifulSoup(html,lxml)前面是讀取的html,後面是解析器
根據我們前面查看的源碼,我們開始解析網站
items = soup.find_all(td, class_ =[zwmc.gamc,zwyx,gzdd,gsxj] # find_all 獲取內容
for item in items:
print(item.get_text().strip()) # find_all獲得內容是包含標籤的,所以我們選擇get_text()然後用strip函數去除 前後的空格
我們爬取網站可不是為了列印,肯定要把它偷偷的保存下來,為我們所用
1.2 儲存數據
簡單先把他導入到列表中
job_list = []
for item in items: # items請往上喵
job_list.append(item.get_text().strip())
到了這裡發現,這隻能爬取一頁的數據,還不如我一個一個複製,嗯,筆者也發現這個問題,那我們在點擊第二頁,看看url有什麼變化,很容易我們可以發現p=1變成了p=2,問題來了,我怎麼知道一共有多少頁,說實話,我也不知道,筆者認為寫代碼或者做事的話,先想著怎麼把他做出來,然後怎麼去做好,這樣保證項目/事情有進度,邊做邊想,邊想邊做,誰叫筆者腦容量有限,不能一下子打通任督二脈,我們把url p=100(我想網站應該不會顯示那麼多數據),果然沒有那麼多,然後50,然後。。。,這個大家後面應該知道怎麼獲得最大頁面,笨是笨了很多,但it works
然後for 一下就可以獲得整個關鍵詞的信息
1.3 再探url
前面我們講了,我們需要很多職位信息
關鍵詞信息,總不能一個關鍵詞,一個程序或者函數,
我們再看看換一個關鍵詞,url有什麼變化,我們可以看到url有一個kw=,就是kw後面內容不斷變化,這樣我們在構造url是,可以選擇兩個參數,
for循環兩次就okay了,事情往往不是那麼簡單,當你的關鍵詞是大數據等中文時,你就可以看到萬惡的traceback(其實人家可以善意的,就怕有bug,不跟你說的那種程序,吭哧吭哧,爬完都是一堆火星文)
百度一下你就發現,url中文需要轉義,然後你一個一個轉移,放到列表中,for循環兩次(一個kw,一個page),但這樣顯然太麻煩,每每更新一個關鍵詞,得找到url轉移字元,百度一下可以找到,
用下列語句可以輕鬆解決該問題 urllib.parse.quote(kw)
1.4 寫入到文件中
看很多爬蟲都是把數據爬取後放到excel,因為excel大家用的比較多,筆者認為,把數據儲存到csv最簡單,再用excel打開csv,會省事很多
首先用上下文管理器with 打開文件
with open(job_zl.csv,w,encoding=utf-8) as f:
f.write(item) # 寫讀取的內容
# 第一項是文件路徑,大家不需要路徑建該文件,他會自動創建該文件,其中『w』是寫模式,還有『r』 讀模式,這裡用不到,另外一個『a』用的也比較多,他不會覆蓋原文檔,追加內容到文件中
with open(job_zl.csv,w,encoding=utf-8) as f:
for item in job_list;
f.write(item)
當吭哧吭哧寫完,你會發現。這是什麼鬼?怎麼都連成一坨了,當然你想到要加分隔符,由於比較簡單,下面直接post代碼
with open(job_analyse_zl.csv, a, encoding=utf-8) as f: # 不覆蓋原來內容 for i in range(len(job_list)): if i % 5 != 4: f.write(job_list[i]) f.write(,) if i % 5 == 4: f.write(job_list[i]) f.write(
)
由於代碼比較簡單就不贅述了
今天先寫到這裡,有空接著完成數據簡單分析流程
推薦閱讀:
※機器學習:淺談kaggle泰坦尼克號生存概率
※VisPy 中文文檔:基礎內容
※Python 的函數是怎麼傳遞參數的?
※Python基礎語法