python爬蟲----拉勾網爬蟲實踐

 

實現內容:按照城市(程序內列出部分主要城市,可自行在程序中更改)抓取拉勾網的特定職位信息,默認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',  #這個不固定,加上後反而不能連接網站
    }

爬取結果:

 

參考:

https://blog.csdn.net/Auraro__/article/details/99194357

https://mp.weixin.qq.com/s/8wAHBPnQMbrP9La7WZiJA

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章