前段时间想跳槽,想看看招聘网站上那些岗位信息,要是自己一个一个去看太麻烦了,那么就自己写一个爬虫,获取大量的招聘信息,一次看个够。
首先在写代码的时候遇到的第一个难点就是这个网站运用了反爬虫机制,本来我是用接口去拉数据的,这个简单的多,但是有反爬机制,这就导致用接口拉数据的方法失效了,然后又去用页面爬取方式,但是呢页面也有反爬机制,还好页面反爬机制有处理方式,经过重重困难终于得到数据了。
其实爬取不难,最难的是数据清洗,需要一步步处理,这也是最难点,本来数据处理打算使用entree,但是发现不怎么好用,最后还是用的正则提取,毕竟正则提取简单明了,可以灵活筛选出自己想要的数据,所以奉劝大家正则这玩意还是要学会啊。废话不多说,直接上代码:
#需要安装Chrome游览器,还需要下载对应版本的chromedriver驱动
import re,csv
from selenium import webdriver
from time import sleep
import undetected_chromedriver as uc
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
class GetData():
#初始化函数,主要做爬取前的准备工作
def __init__(self):
self.chome_options = webdriver.ChromeOptions()
self.chome_options.add_argument('--headless') #无页面爬取,不会打开游览器窗口
self.driver = uc.Chrome(options=self.chome_options)
self.filePath='C:/Users/suoer/Desktop/2.csv'
self.file = open(self.filePath, 'a+',newline='', encoding='gbk')
self.write = csv.writer(self.file)
#先一步写入文件title,后面循环就不加title了
self.write.writerow(
['公司', '岗位', '薪资', '福利', '工作经验', '学历', '城市', '招聘人数', '公司规模', '公司方向'])
#页面爬取数据函数
def inIndex(self):
driver = self.driver
driver.get('https://search.51job.com/')
sleep(1)
self.sliderCheck()
sleep(1)
driver.find_element(By.XPATH, '//*[@id="keywordInput"]').send_keys("会计") #搜索的职位
sleep(1)
driver.find_element(By.XPATH, '//*[@id="search_btn"]').click()
sleep(1)
driver.find_element(By.XPATH, '//*[@id="keywordInput"]').send_keys("-")
sleep(1)
driver.find_element(By.XPATH, '//*[@id="search_btn"]').click()
#处理当前页面数据,最终返回一个数组
def pageData(self)->list:
list = []
#下面两个正则是为了提取页面的数据
data = re.findall('.*?', self.driver.page_source)
data1 = re.findall('.*?