最新拉勾网数据自动爬取,打造自己的职业信息库!!!

一、准备

进入拉勾网,搜索python
在这里插入图片描述

上下滑动滚轮,可知每页有14条数据
在这里插入图片描述
建立数据库
在这里插入图片描述

数据库建表语句

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
在这里插入图片描述
图2
在这里插入图片描述
图3
在这里插入图片描述
图4
在这里插入图片描述
图5
在这里插入图片描述
图6
在这里插入图片描述
图7
在这里插入图片描述
图8
在这里插入图片描述
图9
在这里插入图片描述

四、运行结果

在这里插入图片描述

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

更多博主开源爬虫教程目录索引
在这里插入图片描述

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
WebMagic是Java语言编写的一款爬虫框架,它基于Jsoup解析器实现,可以轻松地爬取各种站上的数据。下面是使用WebMagic爬取拉勾招聘数据的方法: 1. 首先,需要导入WebMagic相关的依赖包,可以在pom.xml文件中添加以下代码: ``` <dependency> <groupId>us.codecraft</groupId> <artifactId>webmagic-core</artifactId> <version>0.7.3</version> </dependency> <dependency> <groupId>us.codecraft</groupId> <artifactId>webmagic-extension</artifactId> <version>0.7.3</version> </dependency> <dependency> <groupId>us.codecraft</groupId> <artifactId>webmagic-selenium</artifactId> <version>0.7.3</version> </dependency> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-firefox-driver</artifactId> <version>2.53.1</version> </dependency> ``` 2. 创建一个Java类,用于定义需要爬取数据结构。例如,我们可以定义一个Job类,用于存储招聘信息: ``` public class Job { private String name; //职位名称 private String salary; //薪资范围 private String company; //公司名称 private String location; //工作地点 private String experience; //工作经验要求 private String education; //学历要求 private String label; //职位标签 //省略setter和getter方法 } ``` 3. 创建一个实现PageProcessor接口的Java类,用于定义爬虫的逻辑。例如,我们可以定义一个LaGouProcessor类,用于爬取拉勾的招聘信息: ``` public class LaGouProcessor implements PageProcessor { private Site site = Site.me() .setRetryTimes(3) //重试次数 .setSleepTime(1000) //访问间隔 .setUserAgent(UserAgentUtil.getRandomUserAgent()); //随机User-Agent @Override public void process(Page page) { List<Job> jobList = new ArrayList<>(); List<String> jobUrls = page.getHtml().links().regex("https://www.lagou.com/jobs/\\d+.html").all(); for (String jobUrl : jobUrls) { page.addTargetRequest(jobUrl); //添加详情页链接到抓取队列 } if (page.getUrl().regex("https://www.lagou.com/jobs/\\d+.html").match()) { //详情页 Job job = new Job(); job.setName(page.getHtml().xpath("//div[@class='job-name']/span/text()").get()); job.setSalary(page.getHtml().xpath("//dd[@class='job_request']/h3/span[1]/text()").get()); job.setCompany(page.getHtml().xpath("//div[@class='company']/text()").get()); job.setLocation(page.getHtml().xpath("//dd[@class='job_request']/p/span[2]/text()").get()); job.setExperience(page.getHtml().xpath("//dd[@class='job_request']/p/span[3]/text()").get()); job.setEducation(page.getHtml().xpath("//dd[@class='job_request']/p/span[4]/text()").get()); job.setLabel(StringUtils.join(page.getHtml().xpath("//dd[@class='job_request']/ul/li/span/text()") .all(), ",")); //多个标签以逗号分隔 jobList.add(job); } page.putField("jobList", jobList); } @Override public Site getSite() { return site; } } ``` 4. 在main方法中,创建一个Spider对象,并设置需要爬取的初始链接、定义的PageProcessor对象和线程数等参数。例如,我们可以设置以下参数: ``` public static void main(String[] args) { Spider.create(new LaGouProcessor()) .addUrl("https://www.lagou.com/zhaopin/Java/?labelWords=label") .thread(5) .run(); } ``` 5. 运行程序,即可爬取拉勾的招聘信息。可以通过page.putField方法将爬取到的数据存储到Map中,然后可以将Map写入文件或者数据库中。 ``` public static void main(String[] args) { Spider.create(new LaGouProcessor()) .addUrl("https://www.lagou.com/zhaopin/Java/?labelWords=label") .thread(5) .run(); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值