用交互式的方式输入想查询的职位并循环输出职位简要信息,为了方便阅读,本文使用到的变量并非以目标变量的英文来命名,而是为了方便而取的变量名,各位大牛请谅解。(因贵网站爬取必定量数据后须要登录,因此只能爬取前几页内容,本文仅供新手参考)html
from selenium import webdriver import time
selenium须要用到的谷歌浏览器驱动driver可在官方自行下载官方驱动下载网址,找到与本身谷歌浏览器对应的前两位数字版本后,下载好后解压,复制于当前使用的编辑器python的目录下的Scripts文件夹中,并在环境变量的系统变量中添加设置此路径便可。
例如:python
lj = r'C:\Users\1111\AppData\Local\Programs\Python\Python36\Scripts'
为了方便理解,如上的命名不规范,请读者谅解。web
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路径截取下目标量,如打开网页后一步一步点击输入框并查询,然后点击肯定等,详情可理解以下:sql
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)然后是干扰项:
例如网站有广告红包须要点击等,对你进行了阻碍没法让爬虫运行,那么能够以下解决:chrome
try: driver.find_element_by_xpath("/html/body/div[9]/div/div[2]").click() #点掉红包 except: pass
由于爬取时查询的数据不一样,有些时候会出现干扰项而有些时候并不会,因此当你加入了干扰项排除后如不加入try except模块则会报错,如加入后逻辑就是干扰项出现时就自动进行取消,如没有干扰项则跳过,此外,贵网站的广告红包xpath常常会变化,例如:
一周前是:npm
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循环进行逐个爬取,以下:app
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