實現內容:按照城市(程序內列出部分主要城市,可自行在程序中更改)抓取拉勾網的特定職位信息,默認30頁
程序運行方法:python3 lagou_JobSearch.py 索索崗位名稱(中文/英文)
爬蟲結果文件自動保存到 city_搜索名稱.tsv文件中
第一層:導入模塊和程序
requests:網頁請求模塊
time:主要是等待一段時間,避免頻繁訪問網頁而被禁止訪問請求
sys:參數傳遞模塊
urllib:對中文進行編碼置於url中
外層函數傳入參數都main函數,main函數是爬蟲的主函數
import requests
import time
import random
import sys
from urllib import parse
#定義一個表示爬去數量的全局變量,每爬到一條職位信息就打印出當前爬取狀態
n = 0
if __name__ == '__main__':
key_word = sys.argv[1]
out_file = 'city_{}.tsv'.format(key_word)
main(key_word,out_file)
第二層:main函數
實現內容:按照城市分別進行爬取,對每個城市分頁(1~30)進行訪問,對具體的抓取過程放在get_json()函數中,
其返回抓取的頁面職位數據列表,在main()函數中保存數據到文件
def main(key_word,out_file):
out_hd = open(out_file,'w')
head_list = ['職位','公司簡稱','學歷要求','工作經驗','工資','城市','縣區','位置','創建時間', '工作性質','經營範圍','公司規模','公司
全稱','福利待遇','公司優勢','類型1','類型2','類型3']
out_hd.write('\t'.join(head_list)+'\n')
city_name_list = ['北京','上海','深圳','廣州','杭州','成都','南京','武漢','長沙']
for k in range(len(city_name_list)):
n = 0
city_name = parse.quote(city_name_list[k])
page = 1
while page<31:
t = random.uniform(5,15)
time.sleep(t)
result = get_json(page,key_word,city_name)
for each in result:
each_info = '\t'.join(each)
out_hd.write(each_info+'\n')
out_hd.flush()
page += 1
out_hd.close()
第三層:get_json()函數具體爬取過程
定義headers信息,定義data上傳數據,定義Myparams參數
首先訪問主頁面保存cookie信息,然後再訪問AJAX請求得到數據,最後解析json並提取數據
def get_json(page,key_word,city):
key_word_raw = key_word
key_word = parse.quote(key_word)
MyParams = {'labelWords':'','fromSearch':'true','suginput':''}
headers['Referer'] = 'https://www.lagou.com/jobs/list_{}?px=default&city={}'.format(key_word,city)
url_start = 'https://www.lagou.com/jobs/list_{}?px=default&city={}#filterBox'.format(key_word,city)
s = requests.Session()
s.get(url_start,headers=headers,params=MyParams,timeout=3)
time.sleep(random.uniform(5,15))
cookie = s.cookies
data = {'first':'true','pn':str(page),'kd':key_word_raw}
MyParams = {'px':'default','city':city,'needAddtionalResult':'false'}
url = 'https://www.lagou.com/jobs/positionAjax.json?px=default&city={}&needAddtionalResult=false'.format(city)
r = s.post(url, data=data, headers=headers,cookies=cookie, timeout=3)
print('\n狀態碼{}'.format(str(r.status_code)))
json = r.json()
time.sleep(random.uniform(5,15))
list_con = json['content']['positionResult']['result']
info_list = []
global n
m = 0
for i in list_con:
n += 1
m += 1
info = []
info.append(i.get('positionName','no'))
info.append(i.get('companyShortName','no'))
info.append(i.get('education','no'))
info.append(i.get('workYear','no'))
info.append(i.get('salary','no'))
info.append(i.get('city','no'))
info.append(i.get('district','no'))
info.append(i.get('createTime','no'))
info.append(i.get('stationname','no'))
info.append(i.get('jobNature','no'))
info.append(i.get('industryField','no'))
info.append(i.get('companySize','no'))
info.append(i.get('companyFullName','no'))
info.append(';'.join(i.get('companyLabelList','no')))
info.append(i.get('positionAdvantage','no'))
info.append(i.get('firstType','no'))
info.append(i.get('secondType','no'))
info.append(i.get('thirdType','no'))
for i in range(len(info)):
if info[i] is None:
info[i] = 'no'
print('城市:{}; 總共第{}條數據; 第{}頁 第{}條數據'.format(info[5],str(n),str(page),str(m)))
info_list.append(info)
return info_list
當然,還要定義headers信息
headers = {
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
'Connection': 'keep-alive',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Host': 'www.lagou.com',
'Origin': 'https://www.lagou.com',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-origin',
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Mobile Safari/537.36',
'X-Anit-Forge-Code': '0',
'X-Anit-Forge-Token': None,
'X-Requested-With': 'XMLHttpRequest',
#'Content-Length': '23', #這個不固定,加上後反而不能連接網站
}
爬取結果:
參考: