很多人都会问,为什么要学习python?python是用来干嘛的?...
关于这个问题,每个人都有不同的看法吧。
python对于我来说,是有趣,好玩,是一种喜欢和热爱吧。从刚接触这门语言开始,就被它深深地吸引了,而一路下来,这种喜欢和热爱只会只增不减。刚学python那会,它还没有像今年这么火热,身边的人也没有讨论什么深度学习、神经网络。那时候还在学习c++的语法,学着学着有些茫然,然后逛了逛鱼c论坛,看到了有python的课程。在小甲鱼老师的大力推荐下,我怀着感兴趣的心点开了课程,从而被吸引,一发不可收拾。
python有很多个领域和方向,爬虫是我觉得比较好玩的。偶然间看到了<前程无忧>这个招聘网站,于是便想了解下python的招聘信息,整个网站那么大,我们逛不完,当然就交给爬虫来逛啦。于是,便开始了——
要爬取网站,就首先要确定我们要获得哪些信息。
对于python的招聘信息,无非就是以下这几点:
工作岗位,薪酬,工作城市,公司名称,公司地址,工作内容,招聘链接
确定了以上信息后,便可以来分析下<前程无忧>这个网站。
首先找到搜索框,输入搜索关键词:python
然后便能看到很多和python相关的工作岗位,看一下总的页数,一共有66页。
这个时候就可以分析一下此时我们的url了,此时搜索栏上显示的url是:https://search.51job.com/list/030200,000000,0000,00,9,99,python,2,1.html?lang=c&stype=1&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare=
有点长是吧,但是我试着把?和后面的东西都去掉,发现也可以到达现在显示的页面的,而去掉之后url就简短了很多:
https://search.51job.com/list/030200,000000,0000,00,9,99,python,2,1.html
然后再观察,发现url里面有一个词'python',很明显就是我们的搜索关键词,假如把这个词换成了'java',就能跳转到java相关的招聘信息,这里就不展示了。然后,经过我翻了几页的试验,发现在 '.html' 前面的数字 1,就是此时所在第几页的页数。
弄清了这两点后,就能很容易的爬取<前程无忧>上的招聘信息了。
可以先定义变量 key_word = 'python',作为要搜索的关键词,然后初始页数 page=1
这时候url就是'https://search.51job.com/list/030200,000000,0000,00,9,99,'+key_word+',2,'+str(page)+'.html'
确定了url的组成规律后,再做进一步分析
每一页都有很多的招聘岗位,通过python的beautifulsoup模块的select选择器,根据每条信息的css路径,就可以获取到招聘岗位的链接,通过链接进入信息详情页,然后看一下我们要的信息在哪里
底下还有一条
通过右键审查元素,看看每条消息的css路径,便可以通过beautifulsoup的select()来获取了。最后,把获取后的每条招聘信息以列表的形式写入csv文件。
注:有些页面可能信息的css路径会有些不一样,因此定位的时候会出错。不过这都是少数的一些,少了这些依旧能获取到很多信息,所以我用了try...except语句,当定位出错的时候就跳过,获取下一条。而有些页面里底下那个详细地址也定位不到,同样用try...except语句,当定位不到的时候,设置其值为空。
以下是爬取的结果:
ok,在校园的网速下,爬取了66页的招聘信息,其中跳过了少数出错的(网页显示一共3272条,而我共爬了3239条,跳过了33条),大概一共用了半个多小时,还算可以吧。
以下是所有的代码:
# *_*coding:utf-8 *_*
import requests
from bs4 import BeautifulSoup as bs
import re
import csv
import codecs
#请求头信息
headers = {
"User-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.167 Safari/537.36",
"referer":"https://search.51job.com/"
}
#创建存储数据的csv文件
csv_file = codecs.open("job_informations.csv","w","utf-8")
writer = csv.writer(csv_file)
writer.writerow(['职业','待遇(千/月)','公司名称','地区','工作内容','详细地址','链接'])
'''
通过初始url得到包含所要职位的页面
找到底下的总页数从而得到所有页的url
遍历每一页的工作信息,进入详细页
在详细页中得到想要的信息:招聘标题,地点,公司名称,待遇范围,工作内容简介,招聘链接
用bs4来提取
插入到excel中
'''
#打开url得到html页面
def url_open(url):
req = requests.get(url, headers=headers)
req.encoding = 'utf-8'
html = req.content
return html
#通过bs4解析页面
def get_bs4(html):
soup = bs(html, 'lxml')
return soup
#从文字中提取数字
def get_nums(value):
match_re = re.match('.*?(\d+).*', value)
if match_re:
nums = int(match_re.group(1))
else:
nums = 0
return nums
#得到总页数和所有链接
def get_all_page(url):
html = url_open(url)
soup = get_bs4(html)
page = soup.select('.td')[0].get_text()
page = get_nums(page)
print(page)
return page
#得到每一个招聘信息的url
def get_jobs_link(url):
html = url_open(url)
soup = get_bs4(html)
job_links = soup.select('.el > .t1 > span > a')
links = []
for link in job_links:
links.append(link['href'])
return links
#进入招聘详情页,提取信息
def get_infor(job_url):
html = url_open(job_url)
soup = get_bs4(html)
try:
job_title = soup.select('.in > .cn > h1')[0].get_text()
district = soup.select('.in > .cn > .lname')[0].get_text()
income_range = soup.select('.in > .cn > strong')[0].get_text()
company = soup.select('.in > .cn > .cname > a')[0]['title']
job_introduce = soup.select('.job_msg')[0].get_text()
except:
return False
#个别页面的公司地址信息会定位不到,选择跳过
try:
address = soup.select('.tCompany_main > .tBorderTop_box > .bmsg > .fp')[0].get_text()
except:
address = ''
#统一薪酬的单位,把万变为千,如果有.0的位数,则去掉
if '万' in income_range:
index = income_range.index('万')
income = [ str(int(float(x)*10)) for x in income_range[0:index].split('-')]
income_range = '~'.join(income)
elif '千' in income_range:
index = income_range.index('千')
income_range = '~'.join(income_range[0:index].split('-'))
else:
income_range = '~'.join(income_range.split('-'))
#把信息写入文件
writer.writerow([job_title, income_range, company, district, \
job_introduce, address, job_url])
print('已获取%s的信息'%(job_title))
return True
#主函数
def main(key_word):
# 搜索的第几页
page_num = 1
# 通过关键词得到url
url = 'https://search.51job.com/list/030200,000000,0000,00,9,99,' \
+ key_word + ',2,' + str(page_num) + '.html'
try:
all_pages = get_all_page(url)
for num in range(1, all_pages):
print('现在第%d页'%num)
#拼接每一页的url
url = 'https://search.51job.com/list/030200,000000,0000,00,9,99,' \
+ key_word + ',2,' + str(num) + '.html'
#得到每一页的所有招聘链接
links = get_jobs_link(url)
for each_url in links:
get_infor(each_url)
#如果爬取过程中出错,要执行close()才能把以获取的信息存入csv中
finally:
csv_file.close()
if __name__ == '__main__':
key_word = input('输入要搜寻的招聘信息关键词:')
main(key_word)
还需完善,有待提高。