咳咳 作為一個(gè)大三的人 正在很努力地想找一份工作 那么究竟要掌握什么樣的技能才能找到工作呢 ? 瞎逼逼 肯定是不行的 所以我打開了 百度
然后 隨便找了個(gè)招聘網(wǎng)站點(diǎn)了進(jìn)去
就它吧
接著 在職位搜索哪里 填進(jìn)去相關(guān)信息
就跳出來 一堆工作了 隨便點(diǎn)進(jìn)去一個(gè)
天貓美工 就能從任職要求里 看到到底需要什么才能成功任職了
下面就是發(fā)揮我們的爬蟲能力 不管他是啥 先把他爬下來再說 分詞什么的 我們一點(diǎn)點(diǎn)做
先放代碼
from urllib import request
import time
from bs4 import BeautifulSoup
if __name__=="__main__":
q = open("url.txt","rt")
f = open('dataaa.txt','wt')
num = 0
for tar_url in q:
head={ }
head['User-Agent'] = 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19'
try:
http_req = request.Request(url=tar_url,headers=head)
http_response = request.urlopen(http_req)
http_content = http_response.read().decode()
#print(http_content)
http_content_soup = BeautifulSoup(http_content,'lxml')
info = http_content_soup.find_all('div',class_="compaydetail-box")
flag = False
try:
for i in info[0]:
try:
text = i.text
if flag :
f.write(text)
f.write("\n")
if(text=="任職要求:" or text=="任職要求" or text=="崗位要求:" or text=="崗位要求"
or text=="任職資格" or text=="任職資格:" or text=="要求" or text=="要求:"
or text=="職位要求:" or text=="職位要求"):
flag = True
num += 1
f.write(str(num))
f.write("\n")
print("over")
except:
continue
except:
continue
time.sleep(0.1)
except:
continue
f.close()
url是用來存放當(dāng)前頁面的網(wǎng)址的 也就是我們?nèi)绾蔚秸衅疙撁娴姆椒?這個(gè)我們放到后面來講
dataaa呢 使用存放招聘需求的也就是 我們需要分詞的句段
好的 接下來將代碼 我是用的bs4庫 那就先看這個(gè)屬于那個(gè)div塊
經(jīng)過重重盤查 發(fā)現(xiàn)這段 屬于 class="tab-inner-cont"
嗯 好的 那就先到這個(gè)塊 但是隨后我就發(fā)現(xiàn)如果把這個(gè)設(shè)為關(guān)鍵字 根本沒有任何匹配內(nèi)容
那就先看看 .read()到什么東西 如果我們把class = "tab_inner-cont" 作為搜索條件 去進(jìn)行文本搜索 就會(huì)發(fā)現(xiàn) 同樣匹配不到任何內(nèi)容 嗯 那就說 html上的內(nèi)容和我們r(jià)equest的內(nèi)容根本不一不一樣 那自然是以 我們r(jià)equest的內(nèi)容為準(zhǔn)
于是 我把.read()到的東西 先開了個(gè)記事本 然后 進(jìn)行搜索 “任職要求” 就發(fā)現(xiàn)了
原來是 在這個(gè)塊里
'div',class_="compaydetail-box"
那么 我們只要設(shè)置這個(gè)為匹配的關(guān)鍵屬性 就能成功獲得數(shù)據(jù)
接著是判斷任職要求 我發(fā)現(xiàn)他是把所有的行都設(shè)為了 <p> </p>
那遍歷我們得到的數(shù)組 如果 發(fā)現(xiàn)滿足要求 就說明 之后所有的內(nèi)容 都是我們要求的任職條件了
但是呢 如果 你打開多個(gè)頁面 就會(huì)發(fā)現(xiàn)他對(duì)任職條件的描述 不一定都命名為 任職要求 也有叫崗位要求的 也有任職資格的 這里 我翻了一頁60個(gè)左右 整合了一下 就以我if中的判斷條件為依據(jù)開始 爬取了
需要注意的是 我們爬到的網(wǎng)址可能過期 和 可能根本沒有這個(gè)class = "compaydetail-box"塊
所以要放置幾個(gè)異常拋擲 并且我感覺這個(gè)網(wǎng)站對(duì)爬取速度也有要求 所以設(shè)置了sleep時(shí)間
接下來 就將第二部分 url的爬取
同樣 先放代碼
from urllib import request
from bs4 import BeautifulSoup
if __name__=="__main__":
f = open("url.txt","wt")
for i in range(1,91):
url_base="http://sou.zhaopin.com/jobs/searchresult.ashx?bj=160000&jl=%E4%B8%8A%E6%B5%B7&sm=0&isfilter=0&fl=538&isadv=0&sg=44b41480a5814a11b14c9379449b7f68&p="
url = url_base+str(i)
head={}
head['User-Agent'] = 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19'
html_req = request.Request(url=url,headers=head)
html_response = request.urlopen(html_req)
html_content = html_response.read().decode()
html_content_soup = BeautifulSoup(html_content,"lxml")
url_list = html_content_soup.find_all("td",class_="zwmc")
num = 1
for url in url_list:
#print(str(num))
#print(url)
#print(url.a.get("href"))
f.write(url.a.get("href"))
f.write("\n")
# <table cellpadding="0" cellspacing="0" width="853" class="newlist">
f.close()
所有的招聘有90個(gè)頁面 然后仔細(xì)觀察這個(gè)90個(gè)url的網(wǎng)址 就會(huì)發(fā)現(xiàn)
http://sou.zhaopin.com/jobs/searchresult.ashx?bj=160000&in=210500%3b160400%3b160000%3b160500%3b160200%3b300100%3b160100%3b160600&jl=%E4%B8%8A%E6%B5%B7&sm=0&kt=2&isfilter=0&fl=538&isadv=0&sg=f8cf4a43df6b46ce80c76044a5f1822b&p=1
只有這個(gè) p不一樣 那么 很容易 只要寫一個(gè) 循環(huán)語句 就能從1到90了
然后 接著分析 div塊
我們只要點(diǎn)擊 這個(gè)子串 就到轉(zhuǎn)向招聘頁面 那么 一定有一個(gè) href 指向招聘頁面
好的 我們根據(jù)頁面的分布 找到了對(duì)應(yīng)的代碼塊 接著只要將這個(gè)找到這個(gè)小塊里的對(duì)應(yīng)的href就可以了
我找的是
url_list = html_content_soup.find_all("td",class_="zwmc")
找到之后 將他write到url中 留給 第一部分解決
下面是第三部分分詞
import jieba
if __name__=="__main__":
q = open("dataaa.txt", "rt")
f = open('divide-text.txt', 'wt')
file_path = "stopwords.txt"
stopwords = [line.strip() for line in open(file_path, "r").readlines()]
for text in q:
word_list = jieba.cut(text, cut_all=False, HMM=True)
for word in word_list:
if word in stopwords:
continue
if len(word) > 1:
f.write(word + " ")
f.write("\n")
f.close()
stopwords是停用詞表 根據(jù)多次詞云返回 設(shè)置停用詞表這個(gè)沒有什么好說的
from wordcloud import WordCloud
import matplotlib.pyplot as plt
f = open("divide-text.txt","rt")
text = f.read()
font_path = "C:\Windows\Fonts\simfang.ttf"
wc = WordCloud(font_path=font_path,background_color="white",max_words=80,width=1000,height=860,margin=2)
wc.generate(text)
plt.figure()
plt.imshow(wc)
plt.axis("off")
plt.show()
wc.to_file("fourth.png")
這里要注意的是 中文詞云屬性的設(shè)置 font_path 設(shè)置中文的字體 如果不設(shè)置的話 就出現(xiàn)了 迷之方框里面什么都沒有 能看到的字 只有幾個(gè)英文 background_color如同字面意思一般是背景顏色 max_words 字面意思 最大單詞數(shù)量 = V = 后面是圖片大小的一般設(shè)置
最后四張圖片 很遺憾的是 第三次詞云的制作 我忘記改代碼 導(dǎo)致被覆蓋了 QAQ
很明顯能夠看出來 礁击。。扛或。瘸彤。 加了許多沒什么用的詞語 加入停用詞表
少了很多 但是依舊沒有 繼續(xù)加入停用詞表
這么一看 似乎差不多了 但是其實(shí)是... ...第四次的 也就是說 中間還有一次 停用詞表的更新
小結(jié):唔 其實(shí)即使是第四次詞云也沒有達(dá)到我原本的打算 我原打算 這將會(huì)是一張全都是技術(shù)名詞的詞云 現(xiàn)在大部分全是虛的品質(zhì) 爬取到的詞條也僅僅接近5千多條 離2w條還差的很遠(yuǎn)
還是要繼續(xù)學(xué)習(xí)啊啊啊啊啊啊啊啊啊