前言
拉勾网的反爬虫做的很好,导致我们使用requests库进行爬取的时候,经常会被发爬虫,包括或返回空数据。同时,这个网站采用Ajax技术进行异步加载,我们在请求列表网页时,并不会获取到职位列表的相关信息,因此,使用selenium+geckodriver的方式,模拟Firefox浏览器完美爬取拉勾网和BOSS直聘的岗位列表及岗位详情。
一、页面分析
进入拉勾网搜索职位网址:https://www.lagou.com/jobs/list_?labelWords=&fromSearch=true&suginput=
,然后进入审查元素模式
在右下方response中,我们并不能找到职位相关信息。
然后,我们查看一个名为positionAjax.json?px=new&needAddtionalResult=false
的文件,可以找到相关信息。
这说明此网站是通过Ajax技术进行异步加载。
二、下载浏览器驱动
因为我用的是Firefox浏览器,因此需要下载Firefox浏览器驱动 geckodriver 。若是使用其他浏览器,需要下载其他浏览器相应的驱动。下载后,将该驱动程序最好放在一个不需要权限的全英文路径的文件夹中,以防后面出错。
三、详细代码
通过定义类及类方法的方式完成爬虫。以下为具体代码:
# 导入相关库
from selenium import webdriver
from lxml import etree
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import csv
# 创建类
class lagouspider(object):
# 指定驱动程序位置
driver_path = r"D:\geckodriver\geckodriver.exe"
def __init__(self):
# 创建驱动器
self.driver = webdriver.Firefox(executable_path = lagouspider.driver_path)
# 指定初始URL
self.url = "https://www.lagou.com/jobs/list_/p-city_0?&cl=false&fromSearch=true&labelWords=&suginput="
# 创建一个空列表,用于保存爬取下来的信息
self.positions = []
# i和j是为了在爬虫时打印信息,无实际意义
self.i = 0
self.j = 1
# 定义run方法
def run(self):
print("开始解析第1页")
self.driver.get(self.url)
while True:
# 获取职位列表网页
source = self.driver.page_source
# 传入到parse_list_page函数解析职位列表页
self.parse_list_page(source)
# 找到“下一页”按钮
next_botn = self.driver.find_element_by_xpath("//div[@class='pager_container']/span[last()]")
# 当下一页不能点击时,停止爬取
if "pager_next pager_next_disabled" in next_botn.get_attribute("class"):
break
else:
# 当下一页还能点击时,点击下一页,继续爬取下一页
next_botn.click()
self.j += 1
print("开始解析第{}页".format(self.j))
time.sleep(1)
# 定义解析职位列表页函数
def parse_list_page(self,source):
html = etree.HTML(source)
# 获取职位详情页的URL
links = html.xpath("//a[@class='position_link']/@href")
for link in links:
self<