前言
本次主題分兩篇文章來介紹:
- 一、資料採集
- 二、資料分析
第一篇先來介紹資料採集,即用python爬取網站資料。
1 執行環境和python庫
先說下執行環境:
- python3.5
- windows 7, 64位系統
python庫
本次智聯招聘的網站爬取,主要涉及以下一些python庫:
- requests
- BeautifulSoup
- multiprocessing
- pymongo
- itertools
2 爬取的主要步驟
- 根據關鍵字、城市、以及頁面編號生成需要爬取的網頁連結
- 用requests獲取相應的網頁內容
- 用BeautifulSoup解析,獲取需要的關鍵資訊
- 將爬取的資訊存入MongoDB資料庫中,插入新記錄或更新已有記錄
- 用multiprocessing啟動多程式進行爬取,提高執行效率
3 檔案組成
- 資訊配置檔案“zhilian_kw_config.py”
- 爬蟲主執行檔案“zhilian_kw_spider.py”
在配置檔案中設定需要爬取的資訊,然後執行主程式進行內容抓取。
配置檔案“zhilian_kw_config.py”的內容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# Code based on Python 3.x # _*_ coding: utf-8 _*_ # __Author: "LEMON" TOTAL_PAGE_NUMBER = 90 # PAGE_NUMBER: total number of pages,可進行修改 KEYWORDS = ['大資料', 'python', '投資經理'] # 需爬取的關鍵字可以自己新增或修改 # 爬取主要城市的記錄 ADDRESS = ['全國', '北京', '上海', '廣州', '深圳', '天津', '武漢', '西安', '成都', '大連', '長春', '瀋陽', '南京', '濟南', '青島', '杭州', '蘇州', '無錫', '寧波', '重慶', '鄭州', '長沙', '福州', '廈門', '哈爾濱', '石家莊', '合肥', '惠州', '太原', '昆明', '煙臺', '佛山', '南昌', '貴陽', '南寧'] MONGO_URI = 'localhost' MONGO_DB = 'zhilian' |
爬蟲主執行檔案“zhilian_kw_spider.py”的內容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
# Code based on Python 3.x # _*_ coding: utf-8 _*_ # __Author: "LEMON" from datetime import datetime from urllib.parse import urlencode from multiprocessing import Pool import requests from bs4 import BeautifulSoup import pymongo from zhilian.zhilian_kw_config import * import time from itertools import product client = pymongo.MongoClient(MONGO_URI) db = client[MONGO_DB] def download(url): headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0'} response = requests.get(url, headers=headers) return response.text def get_content(html): # 記錄儲存日期 date = datetime.now().date() date = datetime.strftime(date, '%Y-%m-%d') # 轉變成str soup = BeautifulSoup(html, 'lxml') body = soup.body data_main = body.find('div', {'class': 'newlist_list_content'}) if data_main: tables = data_main.find_all('table') for i, table_info in enumerate(tables): if i == 0: continue tds = table_info.find('tr').find_all('td') zwmc = tds[0].find('a').get_text() # 職位名稱 zw_link = tds[0].find('a').get('href') # 職位連結 fkl = tds[1].find('span').get_text() # 反饋率 gsmc = tds[2].find('a').get_text() # 公司名稱 zwyx = tds[3].get_text() # 職位月薪 gzdd = tds[4].get_text() # 工作地點 gbsj = tds[5].find('span').get_text() # 釋出日期 tr_brief = table_info.find('tr', {'class': 'newlist_tr_detail'}) # 招聘簡介 brief = tr_brief.find('li', {'class': 'newlist_deatil_last'}).get_text() # 用生成器獲取資訊 yield {'zwmc': zwmc, # 職位名稱 'fkl': fkl, # 反饋率 'gsmc': gsmc, # 公司名稱 'zwyx': zwyx, # 職位月薪 'gzdd': gzdd, # 工作地點 'gbsj': gbsj, # 公佈時間 'brief': brief, # 招聘簡介 'zw_link': zw_link, # 網頁連結 'save_date': date # 記錄資訊儲存的日期 } def main(args): basic_url = '招聘(求職)盡在智聯招聘?' for keyword in KEYWORDS: mongo_table = db[keyword] paras = {'jl': args[0], 'kw': keyword, 'p': args[1] # 第X頁 } url = basic_url + urlencode(paras) # print(url) html = download(url) # print(html) if html: data = get_content(html) for item in data: if mongo_table.update({'zw_link': item['zw_link']}, {'$set': item}, True): print('已儲存記錄:', item) if __name__ == '__main__': start = time.time() number_list = list(range(TOTAL_PAGE_NUMBER)) args = product(ADDRESS, number_list) pool = Pool() pool.map(main, args) # 多程式執行 end = time.time() print('Finished, task runs %s seconds.' % (end - start)) |