(python爬虫)拉勾网招聘信息爬取

拉勾网招聘岗位爬虫项目

本次爬取数据为python岗位信息,并非用于商业渠道的,只是新手上路练练手,代码如有问题,请多多指教,谢谢。

项目介绍:
爬取网站:拉勾网
URL:https://www.lagou.com/
爬取关键词:python
技术路线:selenium+bs4+time+re+xlwt
爬取时间:2020.08.11
作者:YRH

1.导入库

from selenium import webdriver
from bs4 import BeautifulSoup
import time
import re
import xlwt

2.创建浏览器对象并访问网站

driver = webdriver.Chrome()  # 创建一个chrome实例
driver.get("https://www.lagou.com/")  # 传入网站

3.完整代码

# -*- coding: utf-8 -*-
# Author : YRH
# Data : 2020.08.11
# Project : 拉勾网爬取python招聘岗位
# Tool : PyCharm

from selenium import webdriver
from bs4 import BeautifulSoup
import time
import re
import xlwt

driver = webdriver.Chrome()  # 创建一个chrome实例
driver.get("https://www.lagou.com/")  # 传入网站


# 网页爬取函数
# 主要负责解决页面弹窗处理功能
# 招聘信息的输入和也面的切换
# 将HTML提出并且调用解析函数进行信息提取
def getHtml():
    info = []  # 存放信息列表
    time.sleep(0.5)
    # 由于会弹出一个定位选择框,所以要进行选择一些,否则下面无法进行
    try:
        if driver.find_element_by_id("cboxLoadedContent"):
            driver.find_element_by_id("cboxClose").click()
    except:
        pass
    time.sleep(0.5)
    # 找出输入框位置并且输入招聘关键词
    inpText = driver.find_element_by_id("search_input")
    inpText.send_keys("python")
    driver.find_element_by_id("search_button").click()
    time.sleep(1)

    # 处理弹出广告
    try:
        if driver.find_element_by_class_name("body-box"):
            driver.find_element_by_class_name("body-btn").click()
    except:
        pass

    count = 1
    # 第一页
    try:
        html = driver.page_source
        html = str(html).replace(u"\u2002", "").replace(u"\xa9", "")
        parse(html, info)
        print("成功爬取第" + str(count) + "页")
        count += 1
    except:
        print("Failed to get page " + str(count))
        count += 1

    # 获取第二页到尾页
    panduan = 1
    while panduan == 1:
        if count <= 30:
            driver.find_element_by_class_name("pager_next ").click()
            time.sleep(2)
            html = driver.page_source
            html = str(html).replace(u"\u2002", "").replace(u"\xa9", "")
            parse(html, info)
            print("成功爬取第" + str(count) + "页")
            count += 1
        else:
            panduan = 0
            print("爬虫程序执行完成")

    saveData(info)  # 调用数据保存函数进行数据保存
    driver.close()  # 关闭浏览器页面


# 信息提取函数
# 主要将信息进行解析提取
def parse(html, infoList):
    soup = BeautifulSoup(html, "lxml")

    try:
        # 由于每一页只有14个招聘信息,所以要使用循环来给每一个li的属性"data-index赋值
        # 因为每个招聘信息的li标签都没有相同的属性值,所以只能这样子了
        a = 1
        while a <= 14:
            ul = soup.find("ul", class_='item_con_list').find_all_next("li", {
     "data-index": str(a)})
            for li in ul:
                # 岗位名称
                try:
                    name = li.find("a", class_="position_link").find_next("h3").text
                except:
                    name = " "

                # 地址
                try:
                    address = li.find("span", class_='add').text
                    address = str(address).replace("[", "").replace("]", "")
                except:
                    address = " "

                try:
                    text = li.find("div", class_='li_b_l').text

                    # 提取学历要求,因为在一起提取是提取不了,所以学历只能另外提取
                    education = re.findall(r"(大专|本科|硕士|博士|不要求|不限)", text)
                    if len(education) >= 1:
                        education = education[0]
                    else:
                        education = " "

                    # 提取薪资,经验要求
                    text = re.findall(r"(.*?)\n(.*?)/", text, re.X)
                    if len(text[0]) == 2:
                        money = text[0][0]
                        experience = text[0][1]
                    else:
                        money = " "
                        experience = " "

                except:
                    education = " "
                    money = " "
                    experience = " "

                # 公司名称
                try:
                    company = li.find("div", class_='company_name').find_next("a").text
                except:
                    company = " "

                # 将岗位名称、公司地址、学历要求、薪资、经验要求、公司名称存放到列表中
                infoList.append([name, address, education, money, experience, company])
                a += 1
    except:
        print("招聘信息个数有变化")


# 数据保存
# 数据保存至外部文件excel
def saveData(infoList):
    print("save........")
    workbook = xlwt.Workbook(encoding="utf-8")  # 创建workbook对象
    movieBook = workbook.add_sheet("sheet1")  # 创建工作表
    head = ["岗位名称", "公司地址", "学历要求", "薪资", "经验要求", "公司名称"]
    for i in range(0, len(head)):
        movieBook.write(0, i, head[i])  # 参数1是行,参数2是列,参数3是值

    # 数据逐行输入
    y = 1
    for a in infoList:
        for x in range(0, len(a)):
            movieBook.write(y, x, a[x])
        y += 1
    print("总共保存了" + str(y) + "家招聘信息")
    print("数据保存成功")
    print("数据保存程序执行完毕")

    workbook.save("拉勾网招聘信息.xls")  # 保存数据表


if __name__ == '__main__':
    getHtml()

5.爬取结果部分截图
(python爬虫)拉勾网招聘信息爬取_第1张图片
新手路上,请多多指教

你可能感兴趣的:(python爬虫,python,数据挖掘,selenium)