目录
3)用normalize-space(节点)去掉\r\n\t
一、目标
实现 通过传参(职位和地区)控制抓取51job职位信息。
抓取内容包括:职位名称、薪资、招聘公司、福利待遇、城市区域、经验要求、学历要求、招工人数、招聘信息发布时间、公司地址、岗位职责、任职要求、公司性质、公司规模和招聘公司所在行业。
二、51job网页分析:
1.网页构成观察
搜索入口1:
搜索入口2:
抓取页面:
2.网页分析
搜索入口:
观察比较两个搜索入口,都可以输入职位名称和选取地区,而 https://search.51job.com/ 显然比首页更靠近抓取的信息,所以起始页面选择https://search.51job.com/
抓取内容:
获取每一个岗位链接,进入详情页抓取目标字段内容。
观察过详情页的内容后,将抓取字段确定为:
- title:职位名称
- salary:薪资
- company: 公司名称
- req(request): 招聘简介(包括城市区域、经验要求、招工人数和发布时间)
- welfare: 福利
- job_info: 职位信息(包括岗位职责和岗位要求(即任职要求))
- contact_info: 公司地址
- nature:公司性质
- size:公司规模
- industry: 公司行业
三、代码实现
1. 踩过的坑-----实现城市选择
尝试1:
原本想用selenium+click的方法实现.
通过观察源代码发现点击左边的大写城市首字母,右边的城市会对应更新,试着用selenium将左边首字母全部点击一边,将右边含有城市text的tr标签全部刷新出来。试图以text匹配传入的城市参数,如果匹配上就click该标签来实现城市的选择,(不得不说这是个很烂的想法,)失败了
尝试2:
试图通过setattribute()的方法更改表示城市的value值,也失败了
这次尝试的结果是value值可以更改,但是对于搜索来说不起作用
尝试3:
不气馁,继续找!!!
最终发现实际上起到决定作用的是这串阿拉伯数字的value值。虽然我本次只抓取北上广深四个城市的职位信息,找到这四个城市对应的数字代码自己建个dict就可以爬取了。但是还是想找找一劳永逸的方法~
最终找到一个这样的网址 https://m.51job.com/ ,看起来好像手机端的页面(忘记怎么找到的了,写文章的时候又回页面上去找,就是找不到……只能直接贴结果了。。。)
这个页面可以获取到所有城市对应的数字代码。
这个问题解决了,接下来的就水到渠成了!
2.代码实现
爬取所有城市对应数字代码,保存到本地csv中。只需要爬取一次就可以了,需要的时候可以用读取本地csv的方式使用。
def saveID():
if os.path.exists('areaID.csv'): # 如果存在areaID.csv就停止执行此函数
return
else: # 如果不存在就爬取ID 并保存csv
browser = webdriver.Chrome()
url = 'https://m.51job.com/'
browser.get(url)
browser.refresh()