爬虫实战

爬51job:url里的内容

项目的开发工具选择Requests模块和BeautifulSoup模块实现爬虫开发与数据清洗,
数据存储选择Sqlalchemy框架,
数据库选择MySQL。

获取城市编号

1、观察搜索页的URL地址,控制变量,观察规律。
开发者工具里,单击“Network”选项卡并刷新搜索页,重新捕捉搜索页的请求信息。
查看每个请求信息的响应内容preview,从中查找每个城市的数字编号,最终在“JS”选项卡下找到全国的城市编号
将该请求的响应内容转换成字典格式,再将字典的键值进行互换。
由于爬虫是根据使用者输入城市名来获取相应的数字编号,再通过城市编号构建相应的URL地址,
所以将字典的键值进行互换可方便数字编号的获取。
将城市的数字编号获取功能定义为函数get_city_code

import requests
#获取城市编号  url里面那个是开发者工具,network,JS下面找到的,右键copy link address
def get_city_code():
    url = 'https://js.51jobcdn.com/in/js/2016/layer/area_array_c.js?20210318'
    r = requests.get(url)

    #字符串转换字典
    city_dict = eval(r.text.split('=')[1].split(';')[0])

    #字典键值互换
    city_dict = (v : k for k, v in city_dict.items())
    return  city_dict

报错——
在这里插入图片描述

获取职位总页数

总页数的获取方式有两种:在分页栏直接获取总页数或者通过总职位数除以每页的职位数。两种方式都可取,但笔者认为后者比前者稍胜一筹
用选择-element看总职位数

函数get_pageNumber的实现逻辑大致如下:(1)首先向网站发送HTTP请求并获取相应的响应内容,发送请求的URL地址为搜索页的URL地址,而搜索页的URL地址是通过参数city_code和keyword构建而成。(2)然后从响应内容中提取总职位数,提取方式由BeautifulSoup4模块和re模块实现,前者用于对总职位数进行精准定位,后者用来去除总职位数的中文内容。(3)最后将总职位数和每页的职位数进行除法计算得出总页数,计算过程由math.ceil方法实现,ceil方法是将计算结果的小数点去除并对整数的个位进一。

#————获取职位数
import requests
from bs4 import beautifulsoup
import  re,math

#定义请求头,此处没用书上,而是用的现成的urllib的
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}
#获取总页数
def get_pageNumber(city_code, keyword):
    url = 'https://search.51job.com/list/'+str(city_code)+',040100,0000,00,9,99,'+str(keyword)+',2,1.html'
    r = requests.get(url,headers=headers)

    #美味汤数据清洗
    soup = beautifulsoup(r.content.decode('gbk'),'html5lib')
    #查找总职位数 div和rt是element里面的
    find_page = soup.find('div', class_='rt').getText()
    #通过正则表达式提取数值
    temp = re.findall(r"\d+\.?\d*",find_page)
    #计算总页数
    if temp:
        pageNumber = math.ceil(int{temp[0]}50)
        return pageNumber
    else:
        return 0

爬取每个职位信息

1、多多翻页,观察url地址
**遍历总页数:**通过函数get_pageNumber获取总页数并对总页数进行遍历处理。每次遍历需要重新构建搜索页的URL地址,使当前遍历的次数对应搜索页的页数。构建后的URL地址发送HTTP请求并从响应内容提取当前页面的所有职位信息。
遍历每页的职位信息:对当前搜索页的所有职位的URL地址进行遍历访问,通过发送HTTP请求进入每个职位的详情页,在职位详情页里爬取目标数据。

在“Doc”选项卡的“Response”里查找某个职位信息可以发现,职位详情页的URL地址是在标签a,但标签a没有特殊的属性值,因此直接对标签a定位存在一定的难度。
接着再看标签a的上级标签p,其属性class的属性值为t1,通过分析属性值t1得知,整个网页内容共有50个这样的标签p,
也就是说职位信息可以通过标签p定位,再由标签p定位到标签a。

整个函数结构设有两个for循环,并且第二个循环设置了try…except机制,函数说明如下:
(1)第一个循环是遍历总页数,每次遍历都会构建相应的URL地址,并从URL地址所对应的网页内容提取所有职位信息。网页内容使用GBK编码格式,读者可在“Doc”选项卡的“Response”查看标签〈head〉即可得知网页的编码格式。
(2)第二次循环是遍历当前搜索页的职位信息,从中提取职位详情页的URL地址并赋值给变量url。
(3)变量url以函数参数的形式传递给函数get_info,函数get_info是实现职位详情页的信息爬取,爬取结果以字典的形式表示并赋值给变量info_dict。
(4)变量info_dict作为函数insert_db的参数,函数insert_db是实现数据入库处理。
(5)try…except机制是预防函数get_info在爬取数据过程中出现异常,因为有些企业的职位详情页比较特殊,比如http://yumchina.zhiye.com/。

#————遍历每一页的职位信息,040100在书上是000000
def get_page(keyword,pageNumber):
    for p in range(int{pageNumber}):
        url = 'https://search.51job.com/list/'+str(city_code)+',040100,0000,00,9,99,'+str(keyword)+',2,'+str(p+1)+'.html'
        r = requests.get(url,headers=headers)
        soup = beautifulsoup(r.content.decode('gbk'),'html5lib')
        find_p = soup.find_all('p',class_=re.compile('t1'))
#进入职位详情页
        for i in find_p:
            try:
                info_dict = None
                print(i.find('a')['href'])
                url = i.find('a')['href']
                info_dict = get_info(url)
#入库处理
                if info_dict:
                    insert_db(info_dict)
            except Exception as e:
                print(e)
                time.sleep(5)

#爬职位详情
def get_info(url):
    temp_dict = ()
    if 'https://jobs.51job.com' in url:
        r = requests.get(url,headers=headers)
        time.sleep(1.5)
        soup = beautifulsoup(r.content.decode('gbk'),'html51ib')
        #职位id
        temp_dict['job_id'] = url.split.('.html')[0].split('/')[-1]
        #
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值