網(wǎng)絡(luò)爬蟲項目實戰(zhàn) 課件3-2 招聘Requests爬蟲實戰(zhàn)(項目實施)_第1頁
網(wǎng)絡(luò)爬蟲項目實戰(zhàn) 課件3-2 招聘Requests爬蟲實戰(zhàn)(項目實施)_第2頁
網(wǎng)絡(luò)爬蟲項目實戰(zhàn) 課件3-2 招聘Requests爬蟲實戰(zhàn)(項目實施)_第3頁
網(wǎng)絡(luò)爬蟲項目實戰(zhàn) 課件3-2 招聘Requests爬蟲實戰(zhàn)(項目實施)_第4頁
網(wǎng)絡(luò)爬蟲項目實戰(zhàn) 課件3-2 招聘Requests爬蟲實戰(zhàn)(項目實施)_第5頁
已閱讀5頁,還剩17頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

項目3招聘Requests爬蟲項目網(wǎng)絡(luò)爬蟲實戰(zhàn)項目式教程《網(wǎng)絡(luò)爬蟲項目實戰(zhàn)》入門篇3.2任務(wù)分解3.1項目介紹3.3項目實施目錄Content3.4課后練習(xí)3.5能力拓展3.3.1項目實施->數(shù)據(jù)采集(1)訪問,顯示網(wǎng)站首頁,代表網(wǎng)站運行正常。如下圖所示。:50001/findjob/index1.html3.3.1項目實施->數(shù)據(jù)采集(2)創(chuàng)建PyCharm項目jobvis,手工填寫項目路徑,選擇Anaconda編譯器。如下圖所示。3.3.1項目實施->數(shù)據(jù)采集(3)訪問網(wǎng)站首頁,右鍵打開檢查->Network,查看User-Agent、cookie、referer屬性值。如下圖所示。3.3.1項目實施->數(shù)據(jù)采集(4)創(chuàng)建findjob_spider.py,定義get_page函數(shù)。importcsvimportreimportrequestsfromlxmlimportetreefromrequests.utilsimportget_encodings_from_contentlist_base_url=":50001/findjob/index1.html"defget_page(url):#從chrome開發(fā)者工具復(fù)制User-Agent和cookie值(如果有的話)

headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/91.0.4472.124Safari/537.36'}#發(fā)送GET請求

res=requests.get(url,headers)

#查看編碼方式

enconding=get_encodings_from_content(res.text)#打印網(wǎng)頁內(nèi)容

html_doc=res.content.decode(enconding[0])returnhtml_doclist_base_url指向網(wǎng)站首頁,headers的“User-Agent”值使用上面RequestHeaders復(fù)制過來的內(nèi)容。3.3.1項目實施->數(shù)據(jù)采集RequestsRequests是基于urllib的HTTP庫,爬蟲通過Requests庫完成發(fā)起請求和獲取相應(yīng)。(1)請求參數(shù)(2)響應(yīng)參數(shù)3.3.1項目實施->數(shù)據(jù)采集(5)選擇“檢查”,在右邊“Elements”窗口查找div元素,對照左邊窗口的顯示,找到各崗位div對應(yīng)的頁面元素。(6)停留在第1個崗位的職位名稱,然后點擊鼠標(biāo)右鍵后,選擇“檢查”,查找職位名稱的XPath路徑。3.3.1項目實施->數(shù)據(jù)采集(7)鼠標(biāo)停留在左面窗口的單位名稱,然后點擊鼠標(biāo)右鍵后,選擇“檢查”,找到單位名稱的XPath路徑。(8)類似上述步驟,查找單位屬性和發(fā)布時間的XPath路徑。單位屬性XPath相對路徑:div[@class=‘er’]/p[@class=‘dcat’]/text()發(fā)布時間對應(yīng)XPath相對路徑:a/p/span[@class='time']/text()。3.3.1項目實施->數(shù)據(jù)采集(9)findjob_spider.py中增加parse_page。defparse_page(url):#解析頁面到html樹

page_content=get_page(url)response=etree.HTML(page_content)#提取崗位屬性

node_list=response.xpath("http://div[@class='j_joblist']/div[@class='e']")fornodeinnode_list:#職位名稱

span_value=node.xpath("./a/p/span[@class='jnameat']/text()")iflen(span_value)>0:jobName=re.sub("\s+","",span_value[0])else:jobName="“#單位名稱

a_value=node.xpath("./div[@class='er']/a/text()")companyName=a_value[0]iflen(a_value)>0else""

#單位屬性,例:['國企|500-1000人']p_value=node.xpath("./div[@class='er']/p[@class='dcat']/text()")iflen(p_value)>0:companyAttr=re.sub("\s+","",p_value[0])else:companyAttr=""#發(fā)布時間,例:06-14發(fā)布

span_value=node.xpath("./a/p/span[@class='time']/text()")pubTime=span_value[0]iflen(span_value)>0else""#保存職位信息

withopen('findjob_raw.csv','a',newline="",encoding='utf-8')asf:csv_write=csv.writer(f)csv_write.writerow([jobName,companyName,companyAttr,pubTime])3.3.1項目實施->數(shù)據(jù)采集defwebsite_crawl():current_page_url=list_base_urlparse_page(current_page_url)

if__name__=='__main__':website_crawl()(10)findjob_spider.py定義website_crawl函數(shù)。(11)findjob_spider.py定義主函數(shù)。運行findjob_spider.py,結(jié)果如下圖所示。嵌入式硬件工程師,上海大唐移動通信設(shè)備有限公司,國企|500-1000人,06-14發(fā)布模擬電路工程師,上海磐諾儀器有限公司,民營公司|150-500人,06-14發(fā)布……電氣工程技術(shù)員,北京中治賽瑞科技有限責(zé)任公司,民營公司|少于50人,06-14發(fā)布硬件工程師,北京寶盈科技發(fā)展有限公司,民營公司|少于50人,06-14發(fā)布3.3.1項目實施->數(shù)據(jù)采集(12)回到網(wǎng)站首頁,滑動頁面到最底端,鼠標(biāo)停留在最后一頁的頁碼“5”,然后點擊鼠標(biāo)右鍵后,選擇“檢查”,查看頁碼“5”的XPath路徑。從下圖看出,頁碼“5”對應(yīng)的XPath路徑為“//div[@class="p_in"]/ul/li[last()-1]/a/text()”,“//”代表任意路徑,“l(fā)ast()”代表最后一個li子結(jié)點,“l(fā)ast()-1”代表倒數(shù)第2個li子結(jié)點。3.3.1項目實施->數(shù)據(jù)采集(13)修改findjob_spider.py,定義list_base_url和offset,start_urls改變?yōu)榭商鎿Q的模板,完善website_crawl函數(shù),使爬蟲具有翻頁爬取功能。importrandomfromtimeimportsleeplist_base_url=":50001/findjob/index#offset#.html"defwebsite_crawl():#獲取首頁內(nèi)容

start_url=list_base_url.replace("#offset#",str(1))first_page_doc=get_page(start_url)first_page_tree=etree.HTML(first_page_doc)#找到總頁數(shù)

page_num=first_page_tree.xpath('//div[@class="p_in"]/ul/li[last()-1]/a/text()')

page_num=(int)(page_num[0])iflen(page_num)>0else0#訪問所有頁面

foriinrange(1,page_num+1)::current_page_url=list_base_url.replace("#offset#",str(i))#sleep(seconds)隨機間隔5~10秒爬取頁面,防止目標(biāo)網(wǎng)站攔截

sleep(random.randint(5,10)+random.random())print("爬取第{}頁".format(i))parse_page(current_page_url)3.3.1項目實施->數(shù)據(jù)采集(14)運行findjob_spider.py,結(jié)果如下圖所示。嵌入式硬件工程師,上海大唐移動通信設(shè)備有限公司,國企|500-1000人,06-14發(fā)布模擬電路工程師,上海磐諾儀器有限公司,民營公司|150-500人,06-14發(fā)布……嵌入式硬件工程師,上海大唐移動通信設(shè)備有限公司,國企|500-1000人,06-14發(fā)布模擬電路工程師,上海磐諾儀器有限公司,民營公司|150-500人,06-14發(fā)布……模擬電路資深設(shè)計工程師,辰芯半導(dǎo)體(深圳)有限公司,民營公司|少于50人,06-14發(fā)布FAE現(xiàn)場應(yīng)用工程師,北京維信諾光電技術(shù)有限公司,民營公司|50-150人,06-14發(fā)布3.3.2項目實施->數(shù)據(jù)清洗(1)創(chuàng)建data_clean.py,讀入findjob_raw.csv到DataFrame類型。(2)刪除重復(fù)記錄。(3)從“單位屬性”列抽取出單位類型和規(guī)模。importpandasaspdlabels=["職位名稱","單位名稱","單位屬性","發(fā)布時間"]df=pd.read_csv('findjob_raw.csv',names=labels,encoding='utf-8')print(df.head())#去重df=df.drop_duplicates()print("去重后記錄行數(shù):{}".format(df.shape[0]))#字段“單位屬性”裂變成二列:單位類型,規(guī)模。pattern="(?P<單位類型>.+)\|(?P<規(guī)模>.+)"compdesc_df=df["單位屬性"].str.extract(pattern)df["單位類型"]=compdesc_df["單位類型"]df["規(guī)模"]=compdesc_df["規(guī)模"]df.drop(["單位屬性"],axis=1,inplace=True)print(df[["單位類型","規(guī)模"]].head())3.3.2項目實施->數(shù)據(jù)清洗(4)刪除“發(fā)布時間”列的“發(fā)布”后綴。(5)保存清洗后的數(shù)據(jù)。打開findjob_clean.csv,結(jié)果如下圖。#字段“發(fā)布時間”去掉“發(fā)布”后綴。df["發(fā)布時間"]=df["發(fā)布時間"].str.replace("發(fā)布","")print(df["發(fā)布時間"].head())#保存清洗后的數(shù)據(jù)df.to_csv("findjob_clean.csv",index=False)3.3.3項目實施->數(shù)據(jù)分析(1)創(chuàng)建data_analysis.py,讀入findjob_clean.csv到DataFrame類型。(2)按照單位類型分組后,統(tǒng)計招聘崗位數(shù)量。運行結(jié)果如下圖所示。importpandasaspd#讀入csv文件到Dataframe對象df=pd.rea

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論