不知從什麼時候起,Python和爬蟲就如初戀通常,情不知所起,一往而深,相信不少朋友學習Python,都是從爬蟲開始,其實究其緣由,不外兩方面:其一Python對爬蟲的支持度比較好,類庫衆多。其二Pyhton的語法簡單,入門容易。因此二者形影相隨,不離不棄,本文主要以一個簡單的小例子,簡述Python在爬蟲方面的簡單應用,僅供學習分享使用,若有不足之處,還請指正。html
本例主要爬取51job發佈的工做職位,用到的知識點以下:java
爬蟲的基本步驟,以下圖所示:python
若有要爬取相關內容,首先要對爬取的目標進行分析,瞭解其目錄結構,才能進行解析。本例主要爬取51job中的工做列表,以下所示:數據庫
定義一個函數get_data,用於發起請求並獲取數據,以下所示:json
headers中的User-Agent主要用於模擬瀏覽器,否則會被反爬蟲程序屏蔽,http狀態碼爲418,意思是被網站的反爬程序返回的。後端
encoding是要爬取的網站的編碼爲gbk,若是不加,會產生亂碼,默認爲utf-8瀏覽器
1 def get_data(req_url): 2 """獲取數據""" 3 headers = { 4 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko', 5 'Accept-Language': 'zh-Hans-CN, zh-Hans;q=0.5' 6 } 7 resp = requests.get(req_url, headers=headers) 8 resp.encoding = 'gbk' # 不加會產生中文亂碼 9 if resp.status_code == 200: 10 return resp.text 11 else: 12 return None
定義一個函數parse_data,用於解析獲取到的內容,以下所示:網絡
採用BeautifulSoup,將返回的文本,解析成html對象,並獲取對應的內容。本例主要獲取工做的列表多線程
1 def parse_data(resp_html): 2 """解析數據,並返回列表""" 3 soup = BeautifulSoup(resp_html, features='html.parser') 4 job_table = soup.find('div', attrs={'class': 'dw_table'}) 5 # print(job_table) 6 job_list = job_table.find_all('div', attrs={'class': 'el'}) 7 # print(job_list) 8 # 循環列表,去掉第一個title和最後一個 9 res_list = [] 10 for job in job_list[1: -1]: 11 job_name = job.find('p', attrs={'class': "t1"}).find('span').find('a').get_text() 12 job_name = job_name.replace('\r\n', '').strip() 13 job_company = job.find('span', attrs={'class': "t2"}).find('a').get_text() 14 job_addr = job.find('span', attrs={'class': "t3"}).get_text() 15 job_salary = job.find('span', attrs={'class': "t4"}).get_text() 16 job_time = job.find('span', attrs={'class': "t5"}).get_text() 17 # print('工做信息:', job_name, '---', job_company, '---', job_addr, '---', job_salary, '---', job_time) 18 res_item = { 19 '工做名稱': job_name, 20 '公司': job_company, 21 '工做地址': job_addr, 22 '薪資水平': job_salary, 23 '發佈時間': job_time 24 } 25 res_list.append(res_item) 26 return res_list
定義一個函數save_data,用於將獲取到的內容保存到json文件中,以下所示:架構
with函數 能夠自動進行釋放。因包含中文,因此json文件的編碼爲utf-8,不然會出現亂碼
1 def save_data(res_list): 2 """保存數據""" 3 with open('jobs.json', 'w', encoding='utf-8') as f: 4 res_list_json = json.dumps(res_list, ensure_ascii=False) 5 f.write(res_list_json)
依次調用定義的三個函數,以下所示:
1 if __name__ == '__main__': 2 """若是是主程序本身調用""" 3 req_url = 'https://search.51job.com/list/040000,000000,0000,00,9,99,java,2,1.html?lang=c&stype=1&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare=' 4 # 獲取數據 5 resp_html = get_data(req_url) 6 # print(html) 7 # 解析數據 8 res_list = parse_data(resp_html) 9 # 保存數據 10 save_data(res_list)
爬取的結果保存在jobs.json文件中,以下所示:
1 [ 2 { 3 "工做名稱": "Java架構師", 4 "公司": "深圳市鑽木信息技術有限公司", 5 "工做地址": "深圳-福田區", 6 "薪資水平": "1.8-3萬/月", 7 "發佈時間": "06-13" 8 }, 9 { 10 "工做名稱": "Java實習生 6k起", 11 "公司": "深圳市智玩創新科技有限公司", 12 "工做地址": "深圳-福田區", 13 "薪資水平": "6-8千/月", 14 "發佈時間": "06-13" 15 }, 16 { 17 "工做名稱": "Java實習生6k起", 18 "公司": "深圳市康姆達科技有限公司", 19 "工做地址": "深圳-南山區", 20 "薪資水平": "6-8千/月", 21 "發佈時間": "06-13" 22 }, 23 { 24 "工做名稱": "Java開發工程師", 25 "公司": "深圳市網新新思軟件有限公司", 26 "工做地址": "深圳-南山區", 27 "薪資水平": "1.5-1.7萬/月", 28 "發佈時間": "06-13" 29 }, 30 { 31 "工做名稱": "Java開發工程師", 32 "公司": "深圳市睿服科技有限公司", 33 "工做地址": "深圳-福田區", 34 "薪資水平": "1.3-1.7萬/月", 35 "發佈時間": "06-13" 36 }, 37 { 38 "工做名稱": "Java開發經理", 39 "公司": "深圳市聚惠企業登記代理有限公司", 40 "工做地址": "深圳-龍華新區", 41 "薪資水平": "1-3萬/月", 42 "發佈時間": "06-13" 43 }, 44 { 45 "工做名稱": "高級JAVA", 46 "公司": "深圳易加油信息科技有限公司", 47 "工做地址": "深圳-南山區", 48 "薪資水平": "1.5-2.1萬/月", 49 "發佈時間": "06-13" 50 }, 51 { 52 "工做名稱": "Java高級開發工程師", 53 "公司": "深圳市綠聯科技有限公司", 54 "工做地址": "深圳-龍華新區", 55 "薪資水平": "2-3萬/月", 56 "發佈時間": "06-13" 57 }, 58 { 59 "工做名稱": "Java開發工程師", 60 "公司": "深圳市博悅科創科技有限公司", 61 "工做地址": "深圳-南山區", 62 "薪資水平": "1-1.5萬/月", 63 "發佈時間": "06-13" 64 }, 65 { 66 "工做名稱": "Java高級開發工程師", 67 "公司": "易普森智慧健康科技(深圳)有限公...", 68 "工做地址": "深圳", 69 "薪資水平": "1.5-2.5萬/月", 70 "發佈時間": "06-13" 71 }, 72 { 73 "工做名稱": "Java開發工程師", 74 "公司": "深圳易世通達科技有限公司", 75 "工做地址": "深圳-南山區", 76 "薪資水平": "1.2-1.8萬/月", 77 "發佈時間": "06-13" 78 }, 79 { 80 "工做名稱": "Java開發工程師", 81 "公司": "蘇州今融加科技有限公司", 82 "工做地址": "深圳-福田區", 83 "薪資水平": "1.5-2萬/月", 84 "發佈時間": "06-13" 85 }, 86 { 87 "工做名稱": "Java後端開發工程師", 88 "公司": "深圳市長隆科技有限公司", 89 "工做地址": "深圳-龍崗區", 90 "薪資水平": "1.5-2萬/月", 91 "發佈時間": "06-13" 92 }, 93 { 94 "工做名稱": "Java開發工程師", 95 "公司": "深圳市元諾智能系統有限公司", 96 "工做地址": "深圳-龍華新區", 97 "薪資水平": "1-1.5萬/月", 98 "發佈時間": "06-13" 99 }, 100 { 101 "工做名稱": "java 有物流類經驗", 102 "公司": "深圳市歐恩德技術有限公司", 103 "工做地址": "深圳-羅湖區", 104 "薪資水平": "0.8-1.1萬/月", 105 "發佈時間": "06-13" 106 }, 107 { 108 "工做名稱": "Java開發工程師-2020校園招聘", 109 "公司": "金蝶軟件(中國)有限公司", 110 "工做地址": "深圳-南山區", 111 "薪資水平": "0.8-1.6萬/月", 112 "發佈時間": "06-13" 113 }, 114 { 115 "工做名稱": "Java高級開發工程師", 116 "公司": "豐疆智能科技股份有限公司", 117 "工做地址": "深圳-南山區", 118 "薪資水平": "2.5-3萬/月", 119 "發佈時間": "06-13" 120 }, 121 { 122 "工做名稱": "JAVA軟件開發工程師", 123 "公司": "深圳市吉星時代科技有限公司", 124 "工做地址": "深圳-龍崗區", 125 "薪資水平": "2-3萬/月", 126 "發佈時間": "06-13" 127 }, 128 { 129 "工做名稱": "JAVA 高級軟件工程師", 130 "公司": "相通網絡技術有限公司", 131 "工做地址": "深圳-福田區", 132 "薪資水平": "1.5-3萬/月", 133 "發佈時間": "06-13" 134 }, 135 { 136 "工做名稱": "JAVA開發工程師(接受應屆生)", 137 "公司": "深圳市智巖科技有限公司", 138 "工做地址": "深圳-南山區", 139 "薪資水平": "0.8-1萬/月", 140 "發佈時間": "06-13" 141 }, 142 { 143 "工做名稱": "Java後臺開發工程師", 144 "公司": "深圳市炬馳科技發展有限公司", 145 "工做地址": "深圳", 146 "薪資水平": "1-1.5萬/月", 147 "發佈時間": "06-13" 148 }, 149 { 150 "工做名稱": "Java開發工程師", 151 "公司": "深圳市韶音科技有限公司", 152 "工做地址": "深圳-寶安區", 153 "薪資水平": "0.8-1萬/月", 154 "發佈時間": "06-13" 155 }, 156 { 157 "工做名稱": "JAVA 開發工程師", 158 "公司": "深圳市優博訊科技股份有限公司", 159 "工做地址": "深圳-南山區", 160 "薪資水平": "1-1.5萬/月", 161 "發佈時間": "06-13" 162 }, 163 { 164 "工做名稱": "Java開發工程師", 165 "公司": "深圳市有豆科技有限公司", 166 "工做地址": "深圳-寶安區", 167 "薪資水平": "1.8-3萬/月", 168 "發佈時間": "06-13" 169 }, 170 { 171 "工做名稱": "Saas平臺架構師(Java方向)", 172 "公司": "深圳市智布互聯紡織科技有限公司", 173 "工做地址": "深圳-南山區", 174 "薪資水平": "1.7-2.5萬/月", 175 "發佈時間": "06-13" 176 }, 177 { 178 "工做名稱": "Java開發實習生", 179 "公司": "雲軟科技", 180 "工做地址": "深圳-寶安區", 181 "薪資水平": "6-9千/月", 182 "發佈時間": "06-13" 183 }, 184 { 185 "工做名稱": "Java高級開發工程師", 186 "公司": "深圳市阿爾法智匯科技有限公司", 187 "工做地址": "深圳-寶安區", 188 "薪資水平": "2-4萬/月", 189 "發佈時間": "06-13" 190 }, 191 { 192 "工做名稱": "Java 全棧開發工程師", 193 "公司": "深圳市傑納斯科技有限公司", 194 "工做地址": "深圳-寶安區", 195 "薪資水平": "1-3.5萬/月", 196 "發佈時間": "06-13" 197 }, 198 { 199 "工做名稱": "中高級java工程師", 200 "公司": "北京聯創智融信息技術有限公司", 201 "工做地址": "深圳-福田區", 202 "薪資水平": "1.3-1.8萬/月", 203 "發佈時間": "06-13" 204 }, 205 { 206 "工做名稱": "Java開發工程師", 207 "公司": "得實信息科技(深圳)有限公司", 208 "工做地址": "深圳-南山區", 209 "薪資水平": "0.6-1萬/月", 210 "發佈時間": "06-13" 211 }, 212 { 213 "工做名稱": "Java開發工程師", 214 "公司": "深圳市聯創科技集團有限公司", 215 "工做地址": "深圳-龍崗區", 216 "薪資水平": "1-1.5萬/月", 217 "發佈時間": "06-13" 218 }, 219 { 220 "工做名稱": "中級JAVA(J13824)", 221 "公司": "銀雁科技服務集團股份有限公司", 222 "工做地址": "深圳-福田區", 223 "薪資水平": "1-1.5萬/月", 224 "發佈時間": "06-13" 225 }, 226 { 227 "工做名稱": "java工程師", 228 "公司": "深圳市安思疆科技有限公司", 229 "工做地址": "深圳-南山區", 230 "薪資水平": "0.8-1.6萬/月", 231 "發佈時間": "06-13" 232 }, 233 { 234 "工做名稱": "JAVA 高級開發工程師", 235 "公司": "匯才保險代理(深圳)有限公司", 236 "工做地址": "深圳-羅湖區", 237 "薪資水平": "1.5-2萬/月", 238 "發佈時間": "06-13" 239 }, 240 { 241 "工做名稱": "Java高級開發工程師(直連)", 242 "公司": "深圳市天泰國際航空旅行社有限公司...", 243 "工做地址": "深圳", 244 "薪資水平": "2-4萬/月", 245 "發佈時間": "06-13" 246 }, 247 { 248 "工做名稱": "JAVA工程師", 249 "公司": "深圳市開度貿易有限公司", 250 "工做地址": "深圳-南山區", 251 "薪資水平": "0.8-1.2萬/月", 252 "發佈時間": "06-13" 253 }, 254 { 255 "工做名稱": "後臺開發Leader(JAVA方向)", 256 "公司": "深圳金世紀保險經紀有限公司", 257 "工做地址": "深圳-福田區", 258 "薪資水平": "3-4萬/月", 259 "發佈時間": "06-13" 260 }, 261 { 262 "工做名稱": "Java開發工程師", 263 "公司": "深圳市中深力人力資源管理有限公司...", 264 "工做地址": "深圳-南山區", 265 "薪資水平": "1-1.5萬/月", 266 "發佈時間": "06-13" 267 }, 268 { 269 "工做名稱": "Java高級開發工程師", 270 "公司": "研祥高科技控股集團有限公司", 271 "工做地址": "深圳-光明新區", 272 "薪資水平": "0.9-1.8萬/月", 273 "發佈時間": "06-13" 274 }, 275 { 276 "工做名稱": "Java(證券不加班)", 277 "公司": "上海華騰軟件系統有限公司", 278 "工做地址": "深圳-福田區", 279 "薪資水平": "1.8-2.2萬/月", 280 "發佈時間": "06-13" 281 }, 282 { 283 "工做名稱": "Java高級開發工程師", 284 "公司": "深圳大美商業地產管理有限公司", 285 "工做地址": "深圳-福田區", 286 "薪資水平": "1.5-2萬/月", 287 "發佈時間": "06-13" 288 }, 289 { 290 "工做名稱": "資深/高級Java工程師", 291 "公司": "將來穿戴(深圳)有限公司", 292 "工做地址": "深圳-南山區", 293 "薪資水平": "3-4萬/月", 294 "發佈時間": "06-13" 295 }, 296 { 297 "工做名稱": "Java高級開發工程師", 298 "公司": "深圳市太陽星通訊科技有限公司", 299 "工做地址": "深圳-南山區", 300 "薪資水平": "0.8-1.5萬/月", 301 "發佈時間": "06-13" 302 }, 303 { 304 "工做名稱": "Java高級開發工程師", 305 "公司": "深圳市藍鷹立德軟件諮詢有限公司", 306 "工做地址": "深圳-南山區", 307 "薪資水平": "1.5-1.8萬/月", 308 "發佈時間": "06-13" 309 }, 310 { 311 "工做名稱": "JAVA(高級、架構)", 312 "公司": "深圳市幾米物聯有限公司", 313 "工做地址": "深圳-寶安區", 314 "薪資水平": "2.2-3.2萬/月", 315 "發佈時間": "06-13" 316 }, 317 { 318 "工做名稱": "JAVA開發工程師", 319 "公司": "江蘇康尚生物醫療科技有限公司", 320 "工做地址": "深圳-寶安區", 321 "薪資水平": "1-1.5萬/月", 322 "發佈時間": "06-13" 323 }, 324 { 325 "工做名稱": "java架構師", 326 "公司": "深圳市泓齊網絡科技有限公司", 327 "工做地址": "深圳", 328 "薪資水平": "1.5-1.8萬/月", 329 "發佈時間": "06-13" 330 }, 331 { 332 "工做名稱": "Java開發工程師", 333 "公司": "深圳市智璟科技有限公司", 334 "工做地址": "深圳-福田區", 335 "薪資水平": "0.9-1.5萬/月", 336 "發佈時間": "06-13" 337 }, 338 { 339 "工做名稱": "Java開發工程師", 340 "公司": "上海舟恩信息技術有限公司", 341 "工做地址": "深圳-南山區", 342 "薪資水平": "1.4-1.9萬/月", 343 "發佈時間": "06-13" 344 } 345 ]
本例能夠進一步優化的空間,以下所示:
芙蓉樓送辛漸[唐]王昌齡 寒雨連江夜入吳,平明送客楚山孤。 洛陽親友如相問,一片冰心在玉壺。