Python爬虫实战:爬取拉勾网任意职位信息并保存到Mysql

文章目录

    • 一、准备
    • 二、完整代码及代码分析
    • 三、图片辅助分析
    • 四、运行结果

一、准备

进入拉勾网,搜索python
Python爬虫实战:爬取拉勾网任意职位信息并保存到Mysql_第1张图片

上下滑动滚轮,可知每页有14条数据
Python爬虫实战:爬取拉勾网任意职位信息并保存到Mysql_第2张图片
建立数据库
Python爬虫实战:爬取拉勾网任意职位信息并保存到Mysql_第3张图片

数据库建表语句

CREATE TABLE `lagou` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(100) DEFAULT NULL,
  `company` varchar(100) DEFAULT NULL,
  `price` varchar(50) DEFAULT NULL,
  `experience` varchar(100) DEFAULT NULL,
  `education` varchar(100) DEFAULT NULL,
  `text` text,
  `address` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=57 DEFAULT CHARSET=utf8;

二、完整代码及代码分析

from selenium import webdriver
import time
import pymysql
from bs4 import BeautifulSoup

#控制爬取页数
num = 1

#初始化Selenium
def init():
	#控制台输入想要查询的工作
    name = input("请输入工作:")

    driver = webdriver.Chrome()
    #全屏
    driver.maximize_window()
    #请求拉勾网首页
    driver.get("https://www.lagou.com/")
    #参考图1,根据id关闭进入到首页的弹窗
    driver.find_element_by_id("cboxClose").click()
    time.sleep(1)
    
    #参考图2,根据id控制输入框输入后点击搜索
    driver.find_element_by_id("search_input").send_keys(str(name))
    time.sleep(0.5)
    driver.find_element_by_id("search_button").click()
    time.sleep(1)
    
    #参考图3,关闭搜索后出现的广告
    driver.find_element_by_class_name("body-btn").click()
    
    #获取搜索后得到的网页代码并返回
    source = driver.page_source
    return source,driver


#初始化mysql
def init_mysql():
    dbparams = {
        'host': '127.0.0.1',
        'port': 3306,
        'user': '数据库账号',
        'password': '数据库密码',
        'database': 'lagou',
        'charset': 'utf8'
    }
    #初始化数据库连接
    conn = pymysql.connect(**dbparams)
    cur = conn.cursor()
    return cur,conn


#数据爬取
def index(cur,source,driver):
	#引用全局变量num
    global num
    
	#数据库插入语句
    sql = "insert into lagou(id,title, company, price, experience, education, text, address) values(null,%s,%s,%s,%s,%s,%s,%s)"

	#使用BeautifulSoup解析
    bs = BeautifulSoup(source, "lxml")
    
    #参考图4,拿到所有li标签然后遍历
    li_list = bs.find_all(class_="con_list_item default_list")
    for li in li_list:
        bs = BeautifulSoup(str(li), "lxml")
        
        #参考图5,根据li标签中的属性拿值
        #职位名称
        title = bs.find("li")["data-positionname"]
        #公司名称
        company = bs.find("li")["data-company"]
        #详情页url
        url = bs.find(class_="position_link")["href"]

        #请求详情页,进行数据爬取
        driver.get(url)
        page_source = driver.page_source
        page_bs = BeautifulSoup(page_source, "lxml")
        
        #参考图6,获取所有文本值,strip()首尾去除空格
        data = page_bs.find(class_="job_request").text.strip()
        #根据 / 分割拿值
        #薪资范围,有的薪资后有些用 · 拼接多余的,我们分割取值
        price = data.split("/")[0].strip().split("·")[0]
        #经验要求
        experience = data.split("/")[2].strip()
        #学历
        education = data.split("/")[3].strip()
        
        #职位描述,参考图7
        text = page_bs.find(class_="job-detail").text.strip()
        
        #参考图8,替换多余的"查看地图",根据"-"分割然后遍历拼接起来,以达到去除中间空格的目的
        address = page_bs.find(class_="work_addr").text.strip().replace(" ", "").replace("查看地图", "").split("-")
        addr = ""
        for addre in address:
            addr += addre + "-"
        
        #工作地址
        addr = addr.rstrip("-")
        
        #执行SQL
        cur.execute(sql, (title, company, price, experience, education, text, addr))
        #提交事务
        conn.commit()
	
	#由于爬取完一页后浏览器会停留在最后一条数据的详情页,则我们需要返回到搜寻工作后的页面进行翻页
	#每页有14条数据,控制浏览器返回14for i in range(14):
        driver.back()
	
	#控制num大小进行多页爬取
    if num <= 3:
        #print(num)
        num += 1
        #实践测试,多睡眠一些时间,防止被拦截
        time.sleep(5)
        #点击下一页,参考图9
        driver.find_element_by_class_name("pager_next").click()
        time.sleep(0.5)
        next_source = driver.page_source
        #再次进行数据爬取
        index(cur,next_source, driver)


#关闭数据库连接
def close(cur,conn):
    cur.close()
    conn.close()

#开始
if __name__ == "__main__":
    source,driver = init()
    
    #python可以返回并接受多个值,用逗号分隔
    cur, conn = init_mysql()
    
    #数据爬取
    index(cur,source,driver)
    #关闭
    close(cur,conn)

三、图片辅助分析

图1
Python爬虫实战:爬取拉勾网任意职位信息并保存到Mysql_第4张图片
图2
Python爬虫实战:爬取拉勾网任意职位信息并保存到Mysql_第5张图片
图3
Python爬虫实战:爬取拉勾网任意职位信息并保存到Mysql_第6张图片
图4
Python爬虫实战:爬取拉勾网任意职位信息并保存到Mysql_第7张图片
图5
Python爬虫实战:爬取拉勾网任意职位信息并保存到Mysql_第8张图片
图6
Python爬虫实战:爬取拉勾网任意职位信息并保存到Mysql_第9张图片
图7
Python爬虫实战:爬取拉勾网任意职位信息并保存到Mysql_第10张图片
图8
在这里插入图片描述
图9
Python爬虫实战:爬取拉勾网任意职位信息并保存到Mysql_第11张图片

四、运行结果

Python爬虫实战:爬取拉勾网任意职位信息并保存到Mysql_第12张图片

觉得博主写的不错的读者大大们,可以点赞关注和收藏哦,谢谢各位!

博主更多博客文章

你可能感兴趣的:(Python爬虫)