爬個妹子總是沒過,沒辦法,咱們來爬爬招聘網站吧~
本次以前程無憂為例,看看Python的工資如何。
這是今天的重點
1、爬蟲的基本流程 2、re正則表達式模塊的簡單使用 3、requests模塊的使用 4、保存csv
使用的軟件
python 3.8
pycharm 2021專業版
pycharm 社區版 (免費) 沒有主題
專業版 (需要激活碼)
使用的模塊
requests >>> pip install requests (數據請求模塊) 第三方模塊
re
json
csv
time
爬蟲最基本的思路
一. 數據來源分析
1. 確定我們要的爬取的內容是什么?
招聘基本數據信息
2. 通過開發者工具進行抓包分析, 分析這些數據是從哪里可以獲得
開發者工具怎么打開 : F12 或者 鼠標右鍵點擊檢查
二. 代碼實現步驟: 發送請求 >>> 獲取數據 >>> 解析數據 >>> 保存數據
1. 發送請求, 對於url地址發送請求
https://search.51job.com/list/010000%252C020000%252C030200%252C040000%252C090200,000000,0000,00,9,99,python,2,1.html
2. 獲取數據, 獲取服務器發給我們返回的數據響應數據
3. 解析數據, 提取我們想要的數據內容 (比如 招聘標題, 招聘薪資…)
4. 保存數據, 保存到csv文件
OK,思路都清楚的話,咱們來康康代碼。
import requests # 數據請求 第三方模塊 pip install requests import re # 正則表達式模塊 import json # 序列化與反序列化 import pprint # 格式化輸出模塊 import csv # 保存csv數據
算了,我直接貼代碼吧,流程都寫清楚了,我把注釋也標上了。
關於這篇文章,也有相對應的視頻教程:
f = open('python招聘數據1.csv', mode='a', encoding='utf-8', newline='') csv_writer = csv.DictWriter(f, fieldnames=[ '標題', '公司名字', '城市', '薪資', '招聘信息', '公司屬性', '公司規模', '企業性質', '招聘發布日期', '公司詳情頁', '招聘詳情頁', ]) csv_writer.writeheader() # 寫入表頭數據 for page in range(1, 11): # 1. 發送請求, 對於url地址發送請求 url = f'https://search.51job.com/list/010000%252C020000%252C030200%252C040000%252C090200,000000,0000,00,9,99,python,2,{page}.html' # 把python代碼進行偽裝, 偽裝瀏覽器對服務器發送請求 # User-Agent 瀏覽器的基本信息 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36' } response = requests.get(url=url, headers=headers) # 調用 requests這個模塊里面get方法對於 url發送請求 # 2. 獲取數據, 獲取服務器發給我們返回的數據響應數據 # <Response [200]> <> 表示response響應對象 200 狀態碼 表示請求成功 # response.text 獲取響應體的文本數據(網頁源代碼) # print(response.text) # 3. 解析數據, 提取我們想要的數據內容 (比如 招聘標題, 招聘薪資...) # 解析方法: re正則表達式, css選擇器 xpath 根據服務器返回的數據內容, 選擇最適合的解析方式 # 遇事不決 .*? 元字符 . 可以匹配任意字符串除了換行符以外 * 匹配前一個字符串 0個或者多個 ? 非貪婪匹配模式 # [] 表示列表 # {} 可能想到的是字典數據類型 # .*? 可以匹配任意字符串 除了 換行符\n # 通過re模塊調用 findall 方法 'window.__SEARCH_RESULT__ = (.*?)</script>' 要匹配的數據內容 response.text從哪里匹配數據 [0] 列表索引取第一個元素 # 正則表達式詳細內容講解 在VIP課程里面 要講三個小時左右 html_data = re.findall('window.__SEARCH_RESULT__ = (.*?)</script>', response.text, re.S)[0] # print(html_data) # print(type(html_data)) # 把這個字符串數據類型 轉成 字典數據類型 通過鍵值對取值方式提取想要的內容 json_data = json.loads(html_data) # print(type(json_data)) # 字符串的時候 里面的引號是雙引號 字典時候就變成了單引號 # print(json_data) # pprint.pprint(json_data['engine_jds']) # 字典取值 根據冒號左邊的內容, 提取冒號右邊的內容 # parsel 數據解析 for index in json_data['engine_jds']: # pprint.pprint(index) dit = { '標題': index['job_name'], '公司名字': index['company_name'], '城市': index['workarea_text'], '薪資': index['providesalary_text'], '招聘信息': '|'.join(index['attribute_text']), '公司屬性': index['companyind_text'], '公司規模': index['companysize_text'], '企業性質': index['companytype_text'], '招聘發布日期': index['issuedate'], '公司詳情頁': index['company_href'], '招聘詳情頁': index['job_href'], } csv_writer.writerow(dit) print(dit)
注釋在手,世界都是你的,加油騷年!
.