Python进行拉勾网数据爬取框架与思路

爬取内容

用交互式的方式输入想查询的职位并循环输出职位简要信息,为了方便阅读,本文使用到的变量并不是以目标变量的英文来命名,而是为了方便而取的变量名,各位大牛请谅解。(因贵网站爬取一定量数据后需要登陆,所以只能爬取前几页内容,本文仅供新手参考)

需要用到的第三方库

from selenium import webdriver
import time

设置Google驱动的路径

selenium需要用到的谷歌浏览器驱动driver可在官方自行下载官方驱动下载网址,找到与自己谷歌浏览器对应的前两位数字版本后,下载好后解压,复制于当前使用的编辑器python的目录下的Scripts文件夹中,并在环境变量的系统变量中添加设置此路径即可。
例如:

lj = r'C:\Users\1111\AppData\Local\Programs\Python\Python36\Scripts' 

为了方便理解,如上的命名不规范,请读者谅解。

用selenium打开浏览器驱动

def turnChrome():
    print('正在打开浏览器')
    lj = r'C:\Users\1111\AppData\Local\Programs\Python\Python36\Scripts'#路径变量lj 
    driver = webdriver.Chrome(executable_path=(lj+"\chromedriver")) #启动浏览器
    time.sleep(1)
    return driver

目标爬取网站

def driverturn(driver):
    driver.get('https://www.lagou.com')

排除干扰项(*)

(1)读者可先打开目标爬取网站,使用右键检查的copy中的Xpath路径截取下目标量,如打开网页后一步一步点击输入框并查询,而后点击确定等,详情可理解如下:

driver.find_element_by_xpath('//*[@id="changeCityBox"]/p[1]/a').click()       #点击'全国'按钮
    driver.find_element_by_xpath('//*[@id="search_input"]').send_keys(jobname)    #输入内容
    time.sleep(1)
    driver.find_element_by_xpath('//*[@id="search_button"]').click()    #查询

(2)而后是干扰项:
例如网站有广告红包需要点击等,对你进行了阻碍无法让爬虫运行,那么可以如下解决:

    try:
        driver.find_element_by_xpath("/html/body/div[9]/div/div[2]").click()    #点掉红包
    except:
        pass

因为爬取时查询的数据不同,有些时候会出现干扰项而有些时候并不会,所以当你加入了干扰项排除后如不加入try except模块则会报错,如加入后逻辑就是干扰项出现时就自动进行取消,如没有干扰项则跳过,此外,贵网站的广告红包xpath经常会变化,例如:
一周前是:

driver.find_element_by_xpath("/html/body/div[8]/div/div[2]").click()    

一周后则是:

driver.find_element_by_xpath("/html/body/div[9]/div/div[2]").click()

body中的div标签不同导致爬虫无法进行,读者第一次如遇到无法进行爬虫可先将红包的xpath重新进行爬取,再继续尝试。
还有一个是弹框询问你是否感兴趣的干扰项也可如上进行排除,例如:

    try:
        driver.find_element_by_xpath('//*[@id="main_container"]/div[1]/div[4]/div/div/div[2]/button').click()
    except:
        pass

整理后进行放入方法

def ganrao(driver,jobname):     #进行干扰项排除
    driver.find_element_by_xpath('//*[@id="changeCityBox"]/p[1]/a').click()       #点击全国
    driver.find_element_by_xpath('//*[@id="search_input"]').send_keys(jobname)    #输入
    time.sleep(1)
    driver.find_element_by_xpath('//*[@id="search_button"]').click()    #查询
    try:
        driver.find_element_by_xpath("/html/body/div[9]/div/div[2]").click()    #点掉红包
    except:
        pass
    try:
        driver.find_element_by_xpath('//*[@id="main_container"]/div[1]/div[4]/div/div/div[2]/button').click()
    except:
        pass

进行爬取

自行打开查询后,可看到一整页的职位信息,然后选其中一个进行右键xpath索取,然后小编发现一页有16个数据,可用for循环进行逐个爬取,如下:

def Paqu(driver,yeshu):
    CPname = []  #公司名
    Jobname = [] #职位名
    XZJY = []    #薪资经验
    Address = [] #地址
    for num in range(yeshu):
        time.sleep(1)
        for i in range(1, 16):  # //*[@id="s_position_list"]/ul/li[1]/div[1]/div[2]/div[1]/a
            a = driver.find_element_by_xpath('//*[@id="s_position_list"]/ul/li[{}]/div[1]/div[2]/div[1]/a'.format(i))
            b = driver.find_element_by_xpath('//*[@id="s_position_list"]/ul/li[{}]/div[1]/div[1]/div[1]/a/h3'.format(i))
            c = driver.find_element_by_xpath('//*[@id="s_position_list"]/ul/li[{}]/div[1]/div[1]/div[2]/div'.format(i))
            d = driver.find_element_by_xpath('//*[@id="s_position_list"]/ul/li[{}]/div[1]/div[1]/div[1]/a/span/em'.format(i))
            CPname.append(a.text)
            Jobname.append(b.text)
            XZJY.append(c.text)
            Address.append(d.text)
        if yeshu-num == 1:
            print('爬取结束')
        else:
            driver.find_element_by_class_name("pager_next").click()

    driver.quit()
    return CPname,Jobname,XZJY,Address

如上中式英语的变量方便理解,如有不适请见谅。

存入文本

拿到四个数据的列表后,可进行数据清洗的存储工作了:

def Save(CPname,Jobname,XZJY,Address):
    with open('职位原始记录.txt','w+',encoding='utf-8') as f:
        #l1 = ['ID','公司名','职位名','薪资','经验','学历','地址']
        for i in range(len(CPname)):
            k = str(XZJY[i]).replace(" / "," ").split(' ')
            l2 = [str(i+1),CPname[i],Jobname[i],k[0],k[1],k[2],Address[i]]
            #dabao = str(dict(zip(l1,l2))).replace("'",'"')
            f.write(str(l2).replace('[','').replace(']','')+'\n')
            print(l2)

可以清洗成自己想要的样子,这个读者自行编写。

全部源码

#coding=utf-8
from selenium import webdriver
import time
import sqlite3

def turnChrome():
    print('正在打开浏览器')
    lj = r'C:\Users\38376\AppData\Local\Programs\Python\Python36\Scripts'
    driver = webdriver.Chrome(executable_path=(lj+"\chromedriver")) #启动浏览器
    time.sleep(1)
    return driver

def driverturn(driver):
    driver.get('https://www.lagou.com')

def ganrao(driver,jobname):     #进行干扰项排除
    driver.find_element_by_xpath('//*[@id="changeCityBox"]/p[1]/a').click()       #点击全国
    driver.find_element_by_xpath('//*[@id="search_input"]').send_keys(jobname)    #输入
    time.sleep(1)
    driver.find_element_by_xpath('//*[@id="search_button"]').click()    #查询
    try:
        driver.find_element_by_xpath("/html/body/div[9]/div/div[2]").click()    #点掉红包
    except:
        pass
    try:
        driver.find_element_by_xpath('//*[@id="main_container"]/div[1]/div[4]/div/div/div[2]/button').click()
    except:
        pass

def Paqu(driver,yeshu):
    CPname = []
    Jobname = []
    XZJY = []
    Address = []
    for num in range(yeshu):
        time.sleep(1)
        for i in range(1, 16):  # //*[@id="s_position_list"]/ul/li[1]/div[1]/div[2]/div[1]/a
            a = driver.find_element_by_xpath('//*[@id="s_position_list"]/ul/li[{}]/div[1]/div[2]/div[1]/a'.format(i))
            b = driver.find_element_by_xpath('//*[@id="s_position_list"]/ul/li[{}]/div[1]/div[1]/div[1]/a/h3'.format(i))
            c = driver.find_element_by_xpath('//*[@id="s_position_list"]/ul/li[{}]/div[1]/div[1]/div[2]/div'.format(i))
            d = driver.find_element_by_xpath('//*[@id="s_position_list"]/ul/li[{}]/div[1]/div[1]/div[1]/a/span/em'.format(i))
            CPname.append(a.text)
            Jobname.append(b.text)
            XZJY.append(c.text)
            Address.append(d.text)
        if yeshu-num == 1:
            print('爬取结束')
        else:
            driver.find_element_by_class_name("pager_next").click()

    driver.quit()
    return CPname,Jobname,XZJY,Address

def Save(CPname,Jobname,XZJY,Address):
    with open('职位原始记录.txt','w+',encoding='utf-8') as f:
        #l1 = ['ID','公司名','职位名','薪资','经验','学历','地址']
        for i in range(len(CPname)):
            k = str(XZJY[i]).replace(" / "," ").split(' ')
            l2 = [str(i+1),CPname[i],Jobname[i],k[0],k[1],k[2],Address[i]]
            #dabao = str(dict(zip(l1,l2))).replace("'",'"')
            f.write(str(l2).replace('[','').replace(']','')+'\n')
            print(l2)
            
if __name__=='__main__':
    jobname = input('请输入你想查询的职位名:')
    yeshu = int(input('你想查询多少页,最高30页:'))
    driver = turnChrome()
    driverturn(driver)
    ganrao(driver,jobname)
    CPname,Jobname,XZJY,Address = Paqu(driver,yeshu)
    Save(CPname,Jobname,XZJY,Address)

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理

想要获取更多Python学习资料可以加QQ:2955637827私聊或加Q群630390733大家一起来学习讨论吧!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值