背景
当前位置:首页 > 药品选购 > Python爬虫前程无忧

Python爬虫前程无忧

  • 发布时间:2023-05-10 14:56:27

很多人都会问,为什么要学习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&degreefrom=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)



还需完善,有待提高。


友情链接