Python爬虫实战:2020最新BOOS直聘爬取教程
前言完整代码及注释分析图片辅助分析运行结果
更多博主开源爬虫教程目录索引(宝藏教程,你值得拥有!)
前言
来到BOOS直聘 搜索python 打开控制台,查看请求发现,页面数据不是动态加载 所以直接复制当前页面链接进行爬取,经过多次的爬取之后 。。。。。。。 失策失策,以前爬取别的网站从没有这么严格的反爬虫机制,没到到翻车了。。 ![在这里插入图片描述](https://imgconvert.csdnimg.cn/aHR0cHM6Ly90aW1nc2EuYmFpZHUuY29tL3RpbWc_aW1hZ2UmcXVhbGl0eT04MCZzaXplPWI5OTk5XzEwMDAwJnNlYz0xNTk1OTI0ODY0OTM5JmRpPWMzNGIzMTlkZjZjMTU3MDkwNjUzYjI5MjgwODhmNDEzJmltZ3R5cGU9MCZzcmM9aHR0cDovL2ltZy50dWd1YWlzaG91LmNvbS9pcHNfdGVtcGxfcHJldmlldy93MjE2X3ExMDAvNDUvMGIvMjQvbGdfMTMwOTI1N18xNTQ1MjE2NjMyXzVjMWEyMjc4MTZjOTguanBnP2F1dGhfa2V5PTIxOTAwMzg0MDAtMC0wLThhY2ViYjgwMjI1ZThmYTQyMzljYTg4NWRmMTExZDBm?x-oss-process=image/format,png#pic_center)
偷偷告诉大家一个小技巧:虽然被禁止访问了,但登录后就又可以访问了,嘿嘿!可惜我当时不知道,事后才发现,可惜。
现在这样只能使用IP代理了 使用IP代理参考以下文章 Python爬虫避坑IP代理教程避坑(reuqests和selenium的ip代理)
建立boos数据库 boos建表语句
CREATE TABLE `boos` (
`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,
`text` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci,
`introduce` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci,
`address` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=99 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
完整代码及注释分析
import requests
from bs4 import BeautifulSoup
import time
import pymysql
#控制爬取页数
num = 2
#插入语句
sql = "insert into boos(id,title, company, price, education, text, introduce ,address) values(null,%s,%s,%s,%s,%s,%s,%s)"
#请求头
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36",
#爬取boos直聘cookie必不可少,参考图1
"cookie": ""
}
#IP代理
proxy = {
'https': '61.178.118.86:8080'
}
#爬取数据
def Crawling(cur,conn,response):
#引入全局变量
global num
global sql
# 使用 lxml XML解析器
data_list = BeautifulSoup(response.text, "lxml")
#拿到所有的li标签然后遍历,参考图2
#由于li没有class什么的,我们找到搜索li的父标签定位,再找下面的所有li
li_list = data_list.find(class_="job-list").find_all("li")
#遍历
for data in li_list:
bs = BeautifulSoup(str(data), "lxml")
#职位,参考图3
title = bs.find("a")["title"].strip()
url = "https://www.zhipin.com/" + bs.find("a")['href']
# 公司,图4
company = bs.find(class_="company-text").find(class_="name").text
# 公司福利 图5
education = bs.find(class_="info-desc").text
# 薪资 图6
price = bs.find(class_="red").text
# print(title+"--"+company+"--"+price+"--"+education)
# # 请求详情页,进行数据爬取
time.sleep(1)
page_source = requests.get(url=url, headers=headers)
page_source.encoding = "utf-8"
page_bs = BeautifulSoup(str(page_source.text), "lxml")
# 岗位职责,图7
text = page_bs.find(class_="text").text.strip()
#print(text)
#print("+"*100)
# 公司介绍,参考图8
#有的公司没有介绍,爬取的时候会异常,我们呢处理异常,没有的时候直接给无介绍
try:
#因为这里的class值也是text,由于find的特性只会返回匹配到的第一个值,所以我们选择定位他的父标签,再找它
introduce = page_bs.find(class_="job-sec company-info").find(class_="text").text.strip()
except:
introduce = "无介绍"
# 工作地址,图9
#有的公司地址后带有502,我们把它替换成空串
address = page_bs.find(class_="location-address").text.replace("502","")
#执行sql,提交事务
cur.execute(sql, (title, company, price, education, text, introduce, address))
conn.commit()
#多页爬取
if num |