网站代码的分析和信息的爬取和上一篇博客大致相同,但是两个网站的代码形式不一样,无忧的代码段是这样的,相对当当的要好提取一些,但是职位的详细信息在下一级链接中,所以需要两步提取,第一步先爬取岗位首页的信息和进入详情页的链接,然后转到详情页进一步爬取其他信息:
item['t1'] = result.xpath('//div[@class="el"]/p/span/a/text()') # 岗位名称
item['t2'] = result.xpath('//div[@class="el"]/span[@class="t2"]/a/text()') # 公司名称
item['t3'] = result.xpath('//div[@class="el"]/span[@class="t3"]/text()') # 工作地点
item['t5'] = result.xpath('//div[@class="el"]/span[@class="t5"]/text()') # 发布时间
item['t6'] = result.xpath('//div[@class="el"]/p/span/a/@href') # 详情链接
for ider in range(len(item['t6'])): #len(item['t6'])
res_detail = requests.get(item['t6'][ider], headers=headers)
res_detail.encoding = chardet.detect(res_detail.content)['encoding']
result_detail = etree.HTML(res_detail.text)
arr_detail[0].append(result_detail.xpath('string(//div[@class="cn"]/p[@class="msg ltype"])')) #工作经验、学历、人数
arr_detail[1].append(result_detail.xpath('string(//div[@class="mt10"]/p[1]/a[1]/text())'))
item['t7'] = arr_detail[0]
item['t8'] = arr_detail[1]
这样,就把首页展示的信息和详细的信息封装到一个字典里了。
对首页信息的清理只需要把岗位名称前后的空格删除掉就好了:
for iper in range(len(item['t1'])):
item['t1'][iper] = item['t1'][iper].strip() # 去掉岗位名前后的空格
对详细信息的处理主要是编码的替换和字符串的分割,以便下一步写入数据库:
for iper in range(len(item['t7'])): # 划分出工作经验等信息
item['t7'][iper] = item['t7'][iper].replace(u'\xa0', u' ')
item['t8'][iper] = item['t8'][iper].replace(u'\xa0', u' ')
item['t7'][iper] = item['t7'][iper].split()
item['t8'][iper] = item['t8'][iper].strip("\\t")
item['t8'][iper] = item['t8'][iper].strip("\\n")
item['t8'][iper] = item['t8'][iper].strip("\\r")
item['t8'][iper] = item['t8'][iper].strip()
清理前的数据:
销售数据分析
深圳市腾讯教育科技有限公司
武汉-江夏区
6-8千/月
07-13
https://jobs.51job.com/wuhan-jxq/115243709.html?s=01&t=0
武汉-江夏区 | 3-4年经验 | 本科 | 招1人 | 07-13发布
业务分析专员/助理
清理后的数据:
销售数据分析
深圳市腾讯教育科技有限公司
武汉-江夏区
6-8千/月
07-13
https://jobs.51job.com/wuhan-jxq/115243709.html?s=01&t=0
['武汉-江夏区', '|', '3-4年经验', '|', '本科', '|', '招1人', '|', '07-13发布']
业务分析专员/助理
同样是存储到数据库mysql,方法不累述,但是在存储过程中出现了两个问题:
1、首页部分有的岗位薪资是空缺的,在存入字典的时候,后面的薪资就会提前一位到这个位置,导致最终字典里岗位名称数量是60个,而薪资数量只有57个,程序报错。
所以,我在开始解析薪资部分代码的时候没有直接爬取薪资的text,而是将整个class爬取出来存放到数组中,这样即使薪资信息为空,对应位置也会是一个结构体无非null,最后在判断一下后存入字典。
item_salary['t4'] = result.xpath('//div[@class="el"]/span[@class="t4"]') # 薪资
for i in range(len(item_salary['t4'])):
if item_salary['t4'][i].text:
arr_salary.append(item_salary['t4'][i].text)
else:
arr_salary.append("未公布")
item['t4'] = arr_salary
2、开始的时候没有发现的一个隐藏bug:
在详情页面,有无学历要求也是个变量,也会导致程序报错,所以加了一步判断:
if item['t7'][iper]:
if len(item['t7'][iper]) > 7:
experience = item['t7'][iper][2]
education = item['t7'][iper][4]
number = item['t7'][iper][6]
else:
experience = item['t7'][iper][2]
education = "无限制"
number = item['t7'][iper][4]
else:
experience = "数据异常"
education = "数据异常"
number = "数据异常"
至此,爬取工作完成。