关于对51job招聘网站信息的爬取以及可视化分析(1一数据爬取)

关于对51job招聘网站信息的爬取以及可视化分析(1一数据爬取)

  • 前言
  • 一、爬虫常用库需要哪些?
  • 二、使用步骤
    • 数据爬取
  • 总结


前言

为了了解目前中国目前各职位的数量、薪资、招聘公司、岗位职责及要求,实现对某一地区人才需求分布的可视化分析,实现高校以及培训机构对人才培养的正向培养,而非做无用之功。


一、爬虫常用库需要哪些?

**

请求库:实现 HTTP 请求操作

urllib:一系列用于操作URL的功能。
requests:基于 urllib 编写的,阻塞式 HTTP 请求库,发出一个请求,一直等待服务器响应后,程序才能进行下一步处理。
selenium:自动化测试工具。一个调用浏览器的 driver,通过这个库你可以直接调用浏览器完成某些操作,比如输入验证码。
aiohttp:基于 asyncio 实现的 HTTP 框架。异步操作借助于 async/await 关键字,使用异步库进行数据抓取,可以大大提高效率。
解析库:从网页中提取信息
beautifulsoup:html 和 XML 的解析,从网页中提取信息,同时拥有强大的API和多样解析方式。
pyquery:jQuery 的 Python 实现,能够以 jQuery 的语法来操作解析 HTML 文档,易用性和解析速度都很好。
lxml:支持HTML和XML的解析,支持XPath解析方式,而且解析效率非常高。
tesserocr:一个 OCR 库,在遇到验证码(图形验证码为主)的时候,可直接用 OCR 进行识别。
存储库:Python 与数据库交互
pymysql:一个纯 Python 实现的 MySQL 客户端操作库。
pymongo:一个用于直接连接 mongodb 数据库进行查询操作的库。
redisdump:一个用于 redis 数据导入/导出的工具。基于 ruby 实现的,因此使用它,需要先安装 Ruby。
爬虫框架
Scrapy:很强大的爬虫框架,可以满足简单的页面爬取(比如可以明确获知url pattern的情况)。用这个框架可以轻松爬下来如亚马逊商品信息之类的数据。但是对于稍微复杂一点的页面,如 weibo 的页面信息,这个框架就满足不了需求了。
Crawley:高速爬取对应网站的内容,支持关系和非关系数据库,数据可以导出为 JSON、XML 等。
Portia:可视化爬取网页内容。
newspaper:提取新闻、文章以及内容分析。
python-goose:java 写的文章提取工具。
cola:一个分布式爬虫框架。项目整体设计有点糟,模块间耦合度较高。
Web 框架库
flask:轻量级的 web 服务程序,简单,易用,灵活,主要来做一些 API 服务。做代理时可能会用到。
django:一个 web 服务器框架,提供了一个完整的后台管理,引擎、接口等,使用它可做一个完整网站。

二、使用步骤

数据爬取

  1. 模拟浏览器
  2. 获取网页源代码提取数据
  3. 编写正则表达式提取详情页
  4. Xpath提取内容
  5. 写入数据

代码如下:

import re
import time
import requests
from lxml import etree

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
}
start_time = time.time()  # 开始时间
f = open('job1.csv', 'w', encoding='utf-8')
# 写入标题
list = ['职位名称', '薪资水平', '公司名称', '公司性质', '所属行业', '职能类别', '地区', '经验要求', '学历要求', '招聘人数','发布日期','职位信息','备注']
for a in list:
    f.write(a)
    f.write(',')
f.write('\n')


for i in range(1, 1000):
    print("正在爬取第" + str(i) + "页数据")
    url0 = "https://search.51job.com/list/120000,000000,0000,00,2,99,+,2,"
    url_end = ".html?lang=c&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare="
    url = url0 + str(i) + url_end
    res = requests.get(url=url, headers=headers)
    res.encoding = 'gbk'
    p = res.text
    ex = r'job_href\":(.*?),'  # 获取text文档后找到网址元素进行正则提取
    p1 = re.findall(ex, p)  # re.findall(匹配规则,所有内容)
    # print(res.text)
    for a in range(len(p1)):
        url = p1[a][1:-1].replace("\\", "")  # 将\\替换消失

        page = requests.get(url=url, headers=headers)
        page.encoding = 'gbk'

        tree = etree.HTML(page.text)  # 解析
        # etree.HTML()可以用来解析字符串格式的HTML文档对象,将传进去的字符串转变成_Element对象。作为_Element对象,可以方便的使用getparent()、remove()、xpath()等方法。
        #  如果想通过xpath获取html源码中的内容,就要先将html源码转换成_Element对象,然后再使用xpath()方法进行解析。
        # 获取岗位标题
        title = tree.xpath('/html/body/div[3]/div[2]/div[2]/div/div[1]/h1/text()')[0:1]
        if len(title) != 0:
            f.write(title[0])
        else:
            f.write('NULL')
        f.write(',')
        # 获取薪资水平
        salary = tree.xpath('/html/body/div[3]/div[2]/div[2]/div/div[1]/strong/text()')[0:1]
        # print(salary)
        if len(salary) != 0:
            f.write(salary[0])
        else:
            f.write('NULL')
        f.write(',')

        # 获取公司名称
        company = tree.xpath('/html/body/div[3]/div[2]/div[2]/div/div[1]/p[1]/a[1]/text()')[0:1]
        if len(company) != 0:
            f.write(company[0])
        else:
            f.write('NULL')
        f.write(',')
        # 获取公司性质
        nature = tree.xpath('/html/body/div[3]/div[2]/div[4]/div[1]/div[2]/p[1]/text()')[0:1]
        if len(nature) != 0:
            f.write(nature[0])
        else:
            f.write('NULL')
        f.write(',')
        # 获取所属行业
        industry = tree.xpath('/html/body/div[3]/div[2]/div[4]/div[1]/div[2]/p[3]/a/text()')[0:1]
        if len(industry) != 0:
            f.write(industry[0])
        else:
            f.write('NULL')
        f.write(',')
        # 获取职能类别
        category = tree.xpath('/html/body/div[3]/div[2]/div[3]/div[1]/div/div[1]/p[1]/a/text()')[0:1]
        # print(category)
        if len(category) != 0:
            f.write(category[0])
        else:
            f.write('NULL')
        f.write(',')
        # 获取工作地区
        pos = tree.xpath('/html/body/div[3]/div[2]/div[2]/div/div[1]/p[2]/@title')
        # print(pos)
        for a in pos:
            if a is not None:
                # 获取位置
                position = a.split(r'|')[0].replace(u'\xa0', u'')  # 字符串前加u,防止中文乱码
                f.write(position)
                f.write(',')
                # 获取所需经验
                year = a.split(r'|')[1].replace(u'\xa0', u'')
                f.write(year)
                f.write(',')
                # 获取学历要求
                degree = a.split(r'|')[2].replace(u'\xa0', u'')
                f.write(degree)
                f.write(',')
                # 获取招聘人数
                people = a.split(r'|')[-2].replace(u'\xa0', u'')
                f.write(people)
                f.write(',')
                # 获取发布日期
                day = a.split(r'|')[-1].replace(u'\xa0', u'')
                f.write(day)
                f.write(',')


        # 获取岗位描述与任职要求
        lst1 = tree.xpath('//div[@class="bmsg job_msg inbox"]//text()')
        a = []
        for i in lst1:
            de1 = i.replace(u'\xa0', u"")
            if len(de1) != 0:
                a.append(de1)

        work = "".join(a).replace(" ", "").replace(u"\r\n", ",").replace(",", ",")  # 去掉空白、换行和英文逗号
        f.write(work)
        f.write(',')
        if len(pos) != 0:
            f.write(pos[0])
        else:
            f.write('NULL')
        f.write('\n')
    time.sleep(0.5)
f.close()
end_time = time.time()
print("爬取完毕!爬取时长%s秒" % (end_time - start_time))

总结

还可以用Spider、urllib、BeautifulSoup等库实现爬取,在这就不一一展示了。

你可能感兴趣的:(python,爬虫,xpath)