用python+selenium爬“测试开发”的招聘信息

一年多没工作,想重新进入测试行业,但是发现单纯的手工功能测试已经不满足市场需求了。所以报班跟着虫师学python selenium,这是留的作业哈。没想到自己一个0基础,花了四天(每天2h)能磕磕绊绊的完成了。很有成就感。O(∩_∩)O

from selenium import webdriver#导入selenium类里webdriver方法
from time import sleep,ctime#导入time类里sleep和ctime方法
from selenium.webdriver.common.action_chains import ActionChains#由于要操作悬停,故需要导入鼠标方法
driver=webdriver.Firefox()#启动Firefox
driver.get("https://www.lagou.com")#在浏览器地址栏中输入拉勾网址,进入拉勾网
sleep(1)#休眠1秒,以便网页内容完全显示
quanguo=driver.find_element_by_xpath("//p[@class='checkTips']/a[@class='tab focus']")
#由于一开始弹出窗口要选择地区,故定位到全国站
xuantingquanguo=ActionChains(driver).move_to_element(quanguo).perform()
#将鼠标悬停到“全国站“元素
ActionChains(driver).click(xuantingquanguo).perform()
#点击“全国站“
sleep(1)#休眠1秒,以便完全显示
shuru=input("请输入想要查询的职位或公司")#输入字符串,赋值给shuru变量
driver.find_element_by_id("search_input").send_keys(shuru)#定位到职位公司搜索输入框,将shuru变量的值传入
driver.find_element_by_id("search_button").click()#定位搜索按钮,点击
sleep(5)#休眠5秒,以便首页结果完全显示
totalpage=driver.find_element_by_xpath("//span[@class='span totalNum']").text
#获取总页码
totalpage2=driver.find_element_by_xpath("//span[@class='pager_next ']/preceding-sibling::span[1]").text
#哥哥标签内容,该span 标签class值有个空格,注意!
#获取总页码的第二种方法
print(f"您想要查询的职位或公司:{shuru}共查出{totalpage}页{totalpage2}页信息")#两种获取当前结果的总页数
f=open("test.txt",'a')#打开test.txt文件,续写文件,若文件不存在,则自动创建
f.write(f"您想要查询的职位或公司:{shuru}共查出{totalpage}页{totalpage2}页信息\n")#写入信息
for j in range(1,int(totalpage2)+1):#for循环,范围是1到总页码加1,实际循环的是1到总页码
    print(f"当前是第{j}页")#打印当前页的页码
    f.write(f"当前是第{j}页")#txt文件写入当前页的页码
    if j !=int(totalpage2):#若j不等于总页码时:
        for i in range(0,15):
        #for循环每页的结果数量,此次写的是人工数的数量,实际应用len()来获取,这样无需判断是否是最后一页了
            company=driver.find_element_by_xpath(f"//li[@data-index='{str(i)}']/div/div/div[@class='company_name']/a").text
            #定位公司元素,发现li里的data-index的值是随着条数在递增的,故采用i作为字符串来定位
            print(f"公司:{company}",end=' ')#打印公司名称,结尾不换行
            p=driver.find_element_by_xpath(f"//li[@data-index='{str(i)}']/div/div/div/a[@class='position_link' and @data-index='{str(i)}']/h3").text
            #定位职位名称
            print(f"职位名称:{p}",end=' ')#打印职位名称,结尾不换行
            district=driver.find_element_by_xpath(f"//li[@data-index='{str(i)}']/div/div/div/a[@class='position_link' and @data-index='{str(i)}']/span/em").text
            #定位地区,注意此地区是拼接的字符串,统一格式是省市.区县
            money=driver.find_element_by_xpath(f"//li[@data-index='{str(i)}']/div/div/div/div[@class='li_b_l']").text
            #定位薪资,此薪资包含薪资信息,年限信息,学历信息
            money_new=money.split(' ')#发现三项的分隔符可用空格隔开,变为一个list
            print(f"薪资:{money_new[0]},经验:{money_new[1]},学历:{money_new[3]}",end=' ')
            #打印相应信息,用[]来区分各信息
            d_new=district.split("·")#地区信息也需要分隔开变成一个list
            if len(d_new)!=2:#考虑到有的可能没有区县信息,若没有区县信息
                d_new.append('Null')@则添加null作为list元素
            print(f"工作城市:{d_new[0]},工作区县:{d_new[1]}")#打印相应信息
            f.write(f"公司:{company},职位名称:{p},薪资:{money_new[0]},经验:{money_new[1]},学历:{money_new[3]},工作城市:{d_new[0]},工作区县:{d_new[1]}\n)
            #将这些信息也写入到txt文件中
            sleep(1)#获取完一页后,休眠一秒
        next=driver.find_element_by_xpath("//span[@class='pager_is_current']/following-sibling::span[1]")
        #点击当前页的下一个页码,获取下一个页码,following-sibling::span[1]代表选取离的最近的弟弟标签
        driver.execute_script("arguments[0].scrollIntoView(false);",next)
        #由于下一个页码没在当前页面中显示,需要操作滚动框,与下一个页码的底部齐平,scrollIntoView(True)代表顶部齐平
        #也可用虫师书中的js来操作,js=“window。scrollTo(100,450)”,100,450代表水平的左间距和垂直的上边距
        #driver.execute_script(js)
        sleep(1)#休眠1秒
        xuanting=ActionChains(driver).move_to_element(next).perform()#将鼠标悬停到下一个页码上
        ActionChains(driver).click(xuanting).perform()#点击该页码
        sleep(3)#进入下一页,休眠3秒,以便显示完全
    elif j==int(totalpage2):#若j为最后一页,可能里面的岗位信息不满15条
        for i in range(0, 15):#for循环
            try:#添加一个try
                company = driver.find_element_by_xpath(f"//li[@data-index='{str(i)}']/div/div/div[@class='company_name']/a").text
                print(f"公司:{company}", end=' ')
                p = driver.find_element_by_xpath(f"//li[@data-index='{str(i)}']/div/div/div/a[@class='position_link' and @data-index='{str(i)}']/h3").text
                print(f"职位名称:{p}", end=' ')
                district = driver.find_element_by_xpath(f"//li[@data-index='{str(i)}']/div/div/div/a[@class='position_link' and @data-index='{str(i)}']/span/em").text
                money = driver.find_element_by_xpath(f"//li[@data-index='{str(i)}']/div/div/div/div/span[@class='money']").text
                money_new = money.split(' ')
                print(f"薪资:{money_new[0]},经验:{money_new[1]},学历:{money_new[3]}")
                d_new = district.split("·")
                if len(d_new) != 2:
                    d_new.append('Null')
                print(f"工作城市:{d_new[0]},工作区县:{d_new[1]}")
                f.write(f"公司:{company},职位名称:{p},薪资:{money_new[0]},经验:{money_new[1]},学历:{money_new[3]},工作城市:{d_new[0]},工作区县:{d_new[1]}")
            except:#抛出异常,若获取数量完成后,下一个岗位则为空无法获取到,会抛出异常
                pass#直接pass,不抛出异常
f.write("搜索完毕!")#执行完成,写入文件

转载于:https://my.oschina.net/u/3741377/blog/1603141

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值