51job招聘网爬取保姆式教程,带你打造自己的职业信息库!

爬取前准备

网页查看

在这里插入图片描述

在这里插入图片描述


建立mysql数据库及表

建立数据库
在这里插入图片描述

建立表

1
2
3
4
5
6
7
8
9
10
11
12
python复制代码CREATE TABLE `51job` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(100) DEFAULT NULL,
`company` varchar(100) DEFAULT NULL,
`price` varchar(100) DEFAULT NULL,
`education` varchar(100) DEFAULT NULL,
`experience` varchar(100) DEFAULT NULL,
`welfare` varchar(100) DEFAULT NULL,
`address` varchar(100) DEFAULT NULL,
`text` text,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=124 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

完整代码及代码分析

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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
python复制代码from selenium import webdriver
import time
import pymysql
from selenium.webdriver.chrome.options import Options
from selenium.webdriver import ChromeOptions
from bs4 import BeautifulSoup
from urllib import parse


num = 2
sql = "insert into 51job(id,title,company,price,education,experience, welfare,address,text) values(null,%s,%s,%s,%s,%s,%s,%s,%s)"
name = ""

#初始化浏览器
def init():
global name
# 实现无可视化界面得操作
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')

# 设置chrome_options=chrome_options即可实现无界面
driver = webdriver.Chrome(chrome_options=chrome_options)
time.sleep(0.5)
# 把浏览器实现全屏
# driver.maximize_window()
time.sleep(0.5)
#发送请求
driver.get("https://search.51job.com/list/000000,000000,0000,00,9,99,"+str(name)+",2,1.html")
source = driver.page_source
# 返回driver和页面源码
return driver,source


#解析
def download(driver,page_text,conn,cur):
#引入全局变量
global num
global name
global sql

# 使用lxml XML解析器
bs = BeautifulSoup(page_text, "lxml")
#参考图1
div_list = bs.find(class_="j_joblist").find_all(class_="e")
for li in div_list:
bs = BeautifulSoup(str(li), "lxml")
#参考图2
#职位名称
title = bs.find(class_="jname at").text
#工资
price = bs.find(class_="sal").text

#抛异常的是因为有的公司是没有该值的
try:
#公司福利
welfare = bs.find(class_="tags")["title"]
except:
welfare = "无福利"
#公司名称
company = bs.find(class_="cname at")['title']
#详情页URL
url = bs.find(class_="el")['href']
#经验
experience = bs.find(class_="d at").text.split("|")[1]
try:
#学历
education = bs.find(class_="d at").text.split("|")[2]
except:
education = "无介绍"

#51job有的详情页URL对应的网页跟大多数详情页是不一样的没有对应的数据,可参考图3
#请求详情页
if "https://jobs.51job.com/" in url:
time.sleep(0.5)
#请求详情页URL
driver.get(url)
page_source = driver.page_source
bs_page = BeautifulSoup(page_source, "lxml")
#参考图4
text = bs_page.find(class_="bmsg job_msg inbox").text.replace("微信分享","").strip()
try:
#参考图5
address = bs_page.find(class_="bmsg inbox").find(class_="fp").text.replace("上班地址:","")
except:
address = "无说明"
#print(title)

#执行插入语句
cur.execute(sql, (title, company, price, education, experience, welfare,address,text))
#提交事务
conn.commit()

#进行多页爬取
#num控制页数
if num <= 3:
next_url = "https://search.51job.com/list/000000,000000,0000,00,9,99,"+str(name)+",2,"+str(num)+".html"
time.sleep(0.5)
driver.get(next_url)
num += 1
download(driver,driver.page_source,conn,cur)

return conn,cur

def init_mysql():
dbparams = {
'host': '127.0.0.1',
'port': 3306,
'user': 'root',
'password': 'wad07244058664',
'database': '51job',
'charset': 'utf8'
}
conn = pymysql.connect(**dbparams)
cur = conn.cursor()
return conn,cur

def close_mysql(conn,cur):
cur.close()
conn.close()

if __name__ == "__main__":
name = input("请输入爬取职位名称:")
#进行二次转码,具体可参考博主文章
text1 = parse.quote(name)
name = parse.quote(text1)
#浏览器初始化
driver,source = init()
#mysql初始化
conn,cur = init_mysql()
#数据爬取
conn,cur = download(driver,source,conn,cur)
#关闭MySQL链接
close_mysql(conn,cur)

图片辅助分析

图1
在这里插入图片描述
图2
在这里插入图片描述
图3
在这里插入图片描述

图4
在这里插入图片描述
图5
在这里插入图片描述


运行结果

在这里插入图片描述


博主会持续更新,有兴趣的小伙伴可以点赞、关注和收藏下哦,你们的支持就是我创作最大的动力!

更多Python爬虫有关文章

在这里插入图片描述

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%