应届生爬虫-仅供学习使用
今天我们进行学习的目标网站是应届生
我们话不多说,直接进入爬虫学习。
经过我们的仔细分析,应届生这个网站是一个静态网站,数据在源码里面都能看到。这个网站没什么难点,不过比较狗的是,应届生的详情页有两种,一不小心就会踩到坑里面去。
详情页一:
详情页二:
既然我们提前知道了这个坑,要解决就简单了,我们只要把两个页面的数据提取语法都写出来,用if进行判读,就可以确保万无一失了。
例如提取职位名称:
#职位名称
job_name = html.xpath("//div[@class='main']/div[@class='section'][2]/h2/a[1]/text()").get()
if job_name:
job_name = job_name
else:
job_name = html.xpath("//div[@class='info clearfix']/ol/li[5]/u/text()").get()
这样,我们可以提取到正确的数据,不怕提取到的数据为空了。
具体的字段提取我们在这里就不一一介绍,后面会给出源码。
我们来看看这个网站的翻页:
这个是第一页:
https://s.yingjiesheng.com/search.php?word=%E5%A4%A7%E6%95%B0%E6%8D%AE&sort=score&start=0
这个是第二页:
https://s.yingjiesheng.com/search.php?word=%E5%A4%A7%E6%95%B0%E6%8D%AE&sort=score&start=10
这个是第三页:
https://s.yingjiesheng.com/search.php?word=%E5%A4%A7%E6%95%B0%E6%8D%AE&sort=score&start=20
对比这三个页面的链接,机智的同学一眼就看出来了,不同的是‘start=10/20/30‘的区别,没错,这个就是控制着翻页的关键点。我们只要利用for循环进行遍历,就可以轻松实现对数据的翻页了:
for i in range(0,19990,10): #构建翻页
print('正在获取第{}条数据,请稍等...'.format(i+1))
time.sleep(1) #沉睡,防止速度过快被识别
url = 'https://s.yingjiesheng.com/search.php?word=%E5%A4%A7%E6%95%B0%E6%8D%AE&sort=score&start={}'.format(i) #每一页的链接
最后,把我们所抓取的数据保存到csv文件就可以了。
下面,我们给出应届生爬虫的全部代码:
#author:渔戈
#导入程序所需的库
import requests
import parsel
import time
import csv
#构建头部信息
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.106 Safari/537.36'
}
#存储数据为csv文件
fp = open('应届生.csv','a',encoding='utf-8-sig',newline='')
writer = csv.writer(fp)
header=['公司名称','职位名称','发布时间','工作地点','工作类型','职位信息','工作id','来源']
writer.writerow(header)
'''开始'''
def start_url(url):
response = requests.get(url,headers=headers) #请求网页链接
# print(response.text)
html = parsel.Selector(response.text)#解析网页
detail_url = html.xpath("//ul/li//div/h3/a/@href").getall()#获得详情页链接
# print(detail_url)
return detail_url #返回一个列表(列表里面是详情页链接)
'''解析'''
def parse_url(detail_url):
for url in detail_url:
response = requests.get(url,headers=headers)
# response.encoding = response.apparent_encoding #自动识别网页编码
# result = response.content.decode(encoding='GBK', errors="ignore")
response.encoding='gbk' #使用gbk编码,防止乱码
# print(response.text)
html = parsel.Selector(response.text)#解析页面
''' 数据提取 '''
''' 应届生招聘网站的详情页有多种,所以写了多种提取方法,使用if进行判断,以便能成功提取到数据'''
#公司名称
company_name = html.xpath("//div[@class='mleft']/h1/text()").get()
if company_name:
company_name = company_name
else:
company_name = html.xpath("//div[@class='loca']/a[3]/text()").get()
if company_name == None:
company_name = html.xpath("//div[@class='main mleft']/h1/text()").get()
#职位名称
job_name = html.xpath("//div[@class='main']/div[@class='section'][2]/h2/a[1]/text()").get()
if job_name:
job_name = job_name
else:
job_name = html.xpath("//div[@class='info clearfix']/ol/li[5]/u/text()").get()
#发布时间
pub_time = html.xpath("//div[@class='info clearfix']/ol/li[1]/u/text()").get()
if pub_time:
pub_time = pub_time
else:
pub_time = html.xpath("//div[@class='job_list']/ul/li[2]/span/text()").get()
#工作地点
job_city = html.xpath("//div[@class='info clearfix']/ol/li[2]//u/text()").get()
if job_city:
job_city = job_city
else:
job_city = html.xpath("//div[@class='job_list']/ul/li[1]/span/a/text()").get()
#工作类型
job_type = html.xpath("//div[@class='info clearfix']/ol/li[3]//u/text()").get()
if job_type:
job_type = job_type
else:
job_type = html.xpath("//div[@class='job_list']/ul/li[4]/text()").get()
#职位信息
job_information = ''.join(html.xpath("//div[@class='j_i']/text()").getall()).strip()
if job_information:
job_information = job_information.replace('\n','')
else:
job_information = ''.join(html.xpath("//div[@class='jobContent']//text()").getall()).replace('\n','').replace('\t','').replace('\s','').strip()
# print(job_information)
#工作id
job_ids = response.url
job_id = job_ids.split('/')[-1]
job_id = job_id.split('.')[0]
if len(job_id) < 15: #判断id长度,长度小于15的,说明该页面不存在,或已被删除
continue #若页面不存在,则终止该循环,进入下一次循环
else:
job_id=job_id
# 来源
source = html.xpath('//div[@class="info clearfix"]/ol/li[4]/a/text()').get()
if source == None:
source = html.xpath('//ul[@class="company_detail clearfix"]/li[1]/span/text()').get()
#打印信息
print(company_name,job_name,pub_time,job_city,job_type,job_information,job_id,source)
#将数据写入csv文件
data = [company_name, job_name, pub_time, job_city, job_type, job_information, job_id, source]
writer.writerow(data)
if __name__ == '__main__':
for i in range(0,19990,10): #构建翻页
print('正在获取第{}条数据,请稍等...'.format(i+1))
time.sleep(1) #沉睡,防止速度过快被识别
url = 'https://s.yingjiesheng.com/search.php?word=%E5%A4%A7%E6%95%B0%E6%8D%AE&sort=score&start={}'.format(i) #每一页的链接
detail_url = start_url(url)
parse_url(detail_url)
爬取的数据如下:
感谢各位大佬的观看!鞠躬.jpg