工欲善其事必先利其器,準備作一個拉鉤的app,可是沒數據可怎麼辦,那就直接扒褲衩去爬吧 通常爬蟲的思路爲:前端
按照以上的思路,先分析了一波拉鉤網的結構,發現拉鉤是直接經過接口傳遞數據的(這也太爽了),可是有ip訪問限制,大概是1分鐘請求5次的頻率,因此準備一個ip代理池(土豪能夠直接買一個)java
接下來直接上代碼了python
配置信息:git
client = pymongo.MongoClient(host='localhost', port=27017) db = client['data_name'] data_collection = db['data_collection '] headers = { "Referer": "https://www.lagou.com/jobs/list_",#必填,不然沒數據 "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 " "(KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", }
篩選關鍵詞:github
keywords = [ 'java', 'python', '前端', ...#你想要的崗位或要求 ]
主要爬取流程 先使用本地ip獲取->當被限制時,從代理ip池中取出ip爬取數據(該ip不可用則刪除,能夠使用則連續使用該ip)->將爬取的數據,進行查重並存儲。數據庫
base_request = requests.post(url, data=data, headers=headers, timeout=3) if not base_request.json().get('content', ''): flag = False while not flag: # 若代理ip沒走通則換一個 try: r = requests.post(url, data=data, headers=headers, timeout=3, proxies=proxies) if not r.json().get('content', ''): raise Exception('這個ip不能用') save_to_db(r.json().get('content', '')) # 存入數據庫 flag = True # 成功獲取數據跳出循環 except Exception as e: if 'HTTPSConnectionPool' in str(e): delete_proxy(proxy) # 代理自己不可用則刪除該代理 proxy = str(get_proxy(), encoding='utf-8') proxies = { 'http': 'http://{}'.format(proxy), 'https': 'http://{}'.format(proxy), } # 切換代理 else: save_to_db(base_request.json().get('content', ''),'data') # 存入數據庫 def save_to_db(content, now_type): if now_type == 'data': data_list = content for item in data_list: print(item) find_data = data_collection .find_one( {'companyId': item.get('companyId')}) if not find_data: # 查重後插入數據庫 data_collection .insert(item)
詳細代碼戳json