一年多没工作,想重新进入测试行业,但是发现单纯的手工功能测试已经不满足市场需求了。所以报班跟着虫师学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("搜索完毕!")#执行完成,写入文件