分分钟爬取51job
爬取前程無(wú)憂(一)
- 步驟:
- 1.解析url
- 2.獲取url上的內(nèi)容
- 3.對(duì)獲取的內(nèi)容進(jìn)行解析
- 4.對(duì)解析后的內(nèi)容進(jìn)行存儲(chǔ)
步驟:
1.解析url
首先,明確我們的目的:爬取51上所有的python崗位的相關(guān)職位信息
這是我們的原始url:
當(dāng)然我們的有效url僅有:
https://search.51job.com/list/010000,000000,0000,00,9,99,python,2,3.html根據(jù)我們的觀察一共有六頁(yè)
我們打開(kāi)第二頁(yè),第三頁(yè)對(duì)比一下
ok,我們可以很明顯的發(fā)現(xiàn)規(guī)律,
url中python和頁(yè)碼,沒(méi)錯(cuò)這就是我們需要處理的第一個(gè)點(diǎn)
首先將我們的URL進(jìn)行一個(gè)完整的表述,我們可以這樣做:
在這里我們的key可以采取從屏幕上進(jìn)行獲取
這里我們可以輸出看一下我們的url
ok,我們的url就這樣處理好了
2.獲取url上的內(nèi)容
我們已經(jīng)獲取了所有的網(wǎng)頁(yè)地址,接下來(lái)我們使用requests庫(kù)的get請(qǐng)求來(lái)獲取網(wǎng)頁(yè)上的內(nèi)容,同時(shí)給我們的爬蟲(chóng)加上一點(diǎn)小小的偽裝,
首先要導(dǎo)入庫(kù)
然后使用requests庫(kù)的get請(qǐng)求來(lái)得到我們的網(wǎng)頁(yè)源碼,
response = requests.get(url=url,headers=headers)response里面就包含了我們需要的內(nèi)容,我們可以查看其內(nèi)容
print(response.status_code) # 打印狀態(tài)碼,狀態(tài)碼200表示ok print(response.url) # 打印請(qǐng)求url print(response.headers) # 打印頭信息 print(response.cookies) # 打印cookie信息 print(response.text) # 以文本形式打印網(wǎng)頁(yè)源碼 print(response.content) # 以字節(jié)流形式打印headers則是請(qǐng)求頭,是區(qū)分瀏覽器和程序的必要元素,
更多的請(qǐng)求頭信息可以查看大佬:https://blog.csdn.net/gklcsdn/article/details/101522169
如何查看我們的請(qǐng)求頭呢,我們用Google瀏覽器打開(kāi)我們的網(wǎng)頁(yè),按下F12進(jìn)行元素檢查,然后你就可以看到一串前端代碼,
我們找到network,點(diǎn)進(jìn)去,然后刷新我們的頁(yè)面,點(diǎn)開(kāi)文件,這里就可以看到很多的信息了,
然后我們找到我們需要的進(jìn)行添加,
3.對(duì)獲取的內(nèi)容進(jìn)行解析
這里我們使用xpath模塊來(lái)進(jìn)行解析
response.encoding = 'gbk' tree = etree.HTML(response.text) ## 解析HTML文檔,返回根節(jié)點(diǎn)對(duì)象 divs = tree.xpath('//div[@class = "dw_table"]/div[@class = "el"]')tree.xpath:在源碼中找出我們所需要的信息(直接找我們需要的即可,注意)
來(lái)一個(gè)for循環(huán),將我們得到的每一個(gè)值都進(jìn)行保存。
gszw = div.xpath('.//p//a/@title')[0] gsmc = div.xpath('.//span[@class = "t2"]/a/@title')[0] gzdd = div.xpath('.//span[@class = "t3"]/text()')[0] gzxc = div.xpath('.//span[@class = "t4"]/text()')[0] fbsj = div.xpath('.//span[@class = "t5"]/text()')[0]至此,我們就已經(jīng)得到了全部的數(shù)據(jù)
4.對(duì)解析后的內(nèi)容進(jìn)行存儲(chǔ)
我們獲取數(shù)據(jù)自然是為了將數(shù)據(jù)進(jìn)行保存,而后進(jìn)行分析,這里簡(jiǎn)單的將數(shù)據(jù)保存為json文件和csv文件
完整代碼:
import requests from lxml import etree import json,csv,timeif __name__ == '__main__':key = input('請(qǐng)輸入想查詢的職業(yè)/崗位:' )for i in range(6):url = 'https://search.51job.com/list/010000,000000,0000,00,9,99,' + str(key) + ',2,' + str(i+1) + '.html'time.sleep(1)data = []fp = open('./51job_python.json',mode='a',encoding='utf-8')fp2 = open('./51job2_python.csv',mode='a',encoding='utf-8')headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'}response = requests.get(url=url,headers=headers)response.encoding = 'gbk'tree = etree.HTML(response.text)divs = tree.xpath('//div[@class = "dw_table"]/div[@class = "el"]')try:for div in divs:gszw = div.xpath('.//p//a/@title')[0]gsmc = div.xpath('.//span[@class = "t2"]/a/@title')[0]gzdd = div.xpath('.//span[@class = "t3"]/text()')[0]gzxc = div.xpath('.//span[@class = "t4"]/text()')[0]fbsj = div.xpath('.//span[@class = "t5"]/text()')[0]d = dict()d['職位'] = gszwd['公司'] = gsmcd['地區(qū)'] = gzddd['薪酬'] = gzxcd['時(shí)間'] = fbsjdata.append(d)if gzxc == None:gzxc = 'mianyi'print("一條信息獲取成功")reslit = json.dumps(data,ensure_ascii = False)fp.write(reslit)fp2.write('\n\n職位:%s。\n公司:%s。\n地區(qū):%s。\n薪酬:%s。\n時(shí)間:%s'%(gszw,gsmc,gzdd,gzxc,fbsj))except Exception as e:fp2.write('\n\n職位:%s。\n公司:%s。\n地區(qū):%s。\n薪酬:%s。\n時(shí)間:%s' % (gszw, gsmc, gzdd, '面議', fbsj))fp.close()fp2.close()至于為什么是前程無(wú)憂,而不是Boss和智聯(lián)
51job:爬取沒(méi)有限制
boss直聘:需要設(shè)置IP,重點(diǎn)設(shè)置動(dòng)態(tài)IP
智聯(lián):動(dòng)態(tài)抓取,重點(diǎn)獲取數(shù)據(jù)接口
嗯,任重道遠(yuǎn)。
總結(jié)
以上是生活随笔為你收集整理的分分钟爬取51job的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 单片机快速开平方的算法
- 下一篇: rcar-du 通过modetest命令