selenium拉勾网爬取数据分析岗位的所有职位信息
程序员文章站
2022-05-09 17:45:00
...
由于拉勾网对于特定的职位信息最多只显示30页,所以笔者通过更改不同搜索条件来可能多的获取更多的职位信息。
本文中的方法为半自动化的selenium,当然存在有许多可以改进的地方,仅供参考学习。
1、进入到关键字为数据分析师的主页面
from lxml import etree
from selenium.webdriver import Chromefrom selenium.webdriver.common.keys import Keys
import timeimport pandas as pd
# 实例化一个对象
web=Chrome()
web.get("https://www.lagou.com")
# 发请求
web.find_element_by_xpath('//[@id="cboxClose"]').click() # 点击叉叉
time.sleep(3)
web.find_element_by_xpath('//*[@id="search_input"]').send_keys('数据分析师', Keys.ENTER) # 发送数据
time.sleep(2)
web.find_element_by_xpath('/html/body/div[8]/div/div[2]').click() # 点击给爷不要
time.sleep(2)
2、筛选条件,循环获取每一个条件下的所有页的html
- 这里我主要通过公司人数与融资情况进行筛选,其中公司人数为两千以下时不需要对融资情况筛选,因为在两千以下的几个档次中,职位数量页不满30页。在公司人数两千以上的条件下,数据分析师的职位数量已经满30页了。所以在此条件下我又加了个融资情况条件,在某些融资情况条件可能会出现一些不相关的职位信息,所以这需要人为判断从第几页开始出现这种不相关的职位信息所在的页码。通过这种方式就可以获得所有数据分析师的职位了。
- 在这里还需要说明并强调的一点是,笔者的方法是半自动的,不过也是十分有效的。半自动还体现在对每种条件下html的获取方面,需要人为的设置循环点击下一页的次数去获取当前条件下每一页的html。如当前筛选条件下有20页的职位信息,则需要把循环次数设置为19(因为第一页的html不需要点击下一页就能获取),具体代码如下
# 筛选条件
web.find_element_by_xpath('//*[@id="filterCollapse"]/li[4]/a[7]').click()
#按公司人数筛选,需要手动改变a中的值
time.sleep(1)
web.find_element_by_xpath('//*[@id="filterCollapse"]/li[3]/a[9]').click()
#按照融资情况筛选,也是需要手动改变a中的值
time.sleep(2)
first_html = web.page_source
# 获取n页HTML
# 创建一个列表去收集每一页的html
html_list =[]
html_list.append(first_html)
for i in range(10):
#点击下一页,这里得根据不同的筛选情况提前看到底有多少页
web.find_element_by_xpath('//*[@id="s_position_list"]/div[2]/div/span[last()]').click()
time.sleep(2)
html_list.append(web.page_source)
print('当前条件下所有HTML已经收集完毕!!')
3、解析html并将所需信息通过dataframe保存为csv格式文件
#开始解析
n = 1
for page in html_list:
print('正在解析第'+str(n)+'页..')
n+=1
html=etree.HTML(page)
li_list=html.xpath('//*[@id="s_position_list"]/ul/li')
#对于每个包含职位的Li标签提取所需要的信息并保存到CSV中 for i in li_list: position_name=i.xpath('./@data-positionname')[0] company_name=i.xpath('./@data-company')[0] salary = i.xpath('./@data-salary')[0] company_scale=i.xpath('./div[1]/div[2]/div[2]/text()')[0].strip().split('/')[-1] company_type = i.xpath('./div[1]/div[2]/div[2]/text()')[0].strip().split('/')[0] company_finace = i.xpath('./div[1]/div[2]/div[2]/text()')[0].strip().split('/')[1] company_edu = i.xpath('./div[1]/div[1]/div[2]/div/text()')[-1].strip().split('/')[-1] work_year = i.xpath('./div[1]/div[1]/div[2]/div/text()')[-1].strip().split('/')[0] work_city = i.xpath('./div[1]/div[1]/div[1]/a/span/em/text()')[0].split('·')[0] city_detail = i.xpath('./div[1]/div[1]/div[1]/a/span/em/text()')[0].split('·')[-1] #通过dataframe转化成csv data=[(position_name,salary,work_city,city_detail,work_year,company_name, company_edu,company_type,company_finace, company_scale)] lagou=pd.DataFrame(data) lagou.to_csv("lagou.csv", header=False, index=False, mode="a+")
爬虫过程中可能会弹出登录的页面,这个我只在一次性需要爬取27页的情况下遇到一次,重新在试一遍就OK了,或者可以改成登录后在爬取,也可以优化加一个判断。
对于循环获取html需要手动设置循环次数的那一块,可以加一个判断,如一旦找不到下一页的按钮,便可以跳出循环
对于手动筛选条件,可以加一个循环去遍历每一个条件
上一篇: Python爬取智联招聘信息
下一篇: python爬虫— 拉勾网职位信息爬取