首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >用Xpath,bs4,正则三种方式爬51job

用Xpath,bs4,正则三种方式爬51job

作者头像
龙哥
发布于 2018-10-22 06:16:41
发布于 2018-10-22 06:16:41
89200
代码可运行
举报
文章被收录于专栏:Python绿色通道Python绿色通道
运行总次数:0
代码可运行

最近和星球球友一起做了一个爬取51job上的Python招聘职位的项目实战,数据如下:

涉及到的知识点是:xpath,bs4,正则,request,execl,类,函数,以及其它基础知识的综合

下面是我的实现 代码的节选部分. 完整代码围观https://github.com/pythonchannel/fetch_51job

注释都已经很清楚了,没有啥要写的了

注意代码是Py2.7环境

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# coding:utf-8
import time
import abc
import requests
from ExeclUtils import ExeclUtils

'''
这是爬虫的抽象类,
xpath,bs4,re 三种爬虫方式都继承这个类
因为所有的请求列表与详情是通用的,所以我这里把请求数据都放在基类中
然后调用爬取方式,爬取方式在子类中实现

'''


class Spider(object):
    # 定义一个抽象类
    __metaclass__ = abc.ABCMeta

    def __init__(self):
        self.rows_title = [u'招聘标题', u'公司名称', u'公司地址', u'待遇', u'发布日期', u'招聘链接', u'招聘要求描述']
        sheet_name = u'51job_Python招聘'
        return_execl = ExeclUtils.create_execl(sheet_name, self.rows_title)
        self.execl_f = return_execl[0]
        self.sheet_table = return_execl[1]
        self.job_info = []  # 存放每一条数据中的各元素,
        self.count = 0  # 数据插入从1开始的

    def crawler_data(self):
        '''
        开始爬取数据
        :return:
        '''
        for i in range(1, 5):
            url = 'http://search.51job.com/list/000000,000000,0000,00,9,99,python,2,{}.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='.format(
                i)
            self.request_job_list(url)
            # 采集不要太快了,否则容易造成ip被封或者网络请求失败
            time.sleep(2)

    def request_job_list(self, page_url):
        '''
        获取工作列表
        :param page_url:
        :return:
        '''
        try:
            headers = {
                'Referer': 'http://www.51job.com/',
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.4549.400 QQBrowser/9.7.12900.400'
            }
            response = requests.get(page_url, headers=headers)
            response.encoding = 'gbk'
            # 如果请求失败,则不能继续进行
            if response.status_code != 200:
                return
            self.parse_job_list(response.text)
        except Exception as e:
            print '\n\n出现错误,错误信息是:{}\n\n'.format(e.message)

    @abc.abstractmethod
    def parse_job_list(self, text):
        '''
        解析工作列表的抽象方法,具体实现在子类中
        :param text:
        :return:
        '''
        pass

    def request_job_detail(self, job_href):
        '''
        获取工作详情
        :param job_href: 招聘工作的链接
        :return:
        '''
        try:
            headers = {
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.4549.400 QQBrowser/9.7.12900.400'
            }
            response = requests.get(job_href, headers=headers)
            response.encoding = 'gbk'
            # 如果请求失败,则不能继续进行
            if response.status_code != 200:
                return ''

            self.parse_job_detail(response.text)

        except Exception as e:
            print '\n\n出现错误,错误信息是:{}\n\n'.format(e.message)

    @abc.abstractmethod
    def parse_job_detail(self, text):
        '''
        定义工作详情的抽象方法
        :param text:
        :return:
        '''
        pass

Execl操作工具类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import xlwt

import sys

reload(sys)
sys.setdefaultencoding('utf-8')

'''
这里是操作execl的工具类,以后也可以直接复用
方法调用SpiderUtils.create_excecl(...) 
'''


class ExeclUtils(object):

    @staticmethod
    def create_execl(sheet_name, row_titles):
        '''
        创建execl文件与sheet表,并创建他们的第一行标题
        :param sheet_name: execl中sheet_name文件的名称
        :param row_titles: execl文件的标题行
        :return: execl_file,execl_sheet
        '''

        f = xlwt.Workbook()
        sheet_info = f.add_sheet(sheet_name, cell_overwrite_ok=True)
        for i in range(0, len(row_titles)):
            sheet_info.write(0, i, row_titles[i])

        return f, sheet_info

    @staticmethod
    def write_execl(execl_file, execl_sheet, count, data, execl_name):
        '''
        把数据写入到execl中.这是一个静态方法
        注意:这里所有的数据都不要写死,方便复用.
        :param execl_file:  传入一个execl文件
        :param execl_sheet:  传入一个execl_sheet表
        :param count:  execl文件的行数
        :param data:  要传入的一条数据
        :param execl_name: execl文件名
        :return: None
        '''
        for j in range(len(data)):
            execl_sheet.write(count, j, data[j])

        execl_file.save(execl_name)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-03-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python绿色通道 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
接口测试平台代码实现30:接口库-接口列表
这里我们先把所有可能用到的字段都列举出来了。怎么样,发送一个请求是不是比我们看到的要复杂多了?
我去热饭
2022/05/19
7970
接口测试平台代码实现30:接口库-接口列表
接口测试平台代码实现124: 全局变量-3
本节内容继续开发我们的项目内全局变量,在此之前,先让我们一起回顾下,之前我们的进度:
我去热饭
2022/05/19
2720
接口测试平台代码实现124: 全局变量-3
接口测试平台代码实现131: 全局变量-10
我们在之前章节已经把变量组 的增删改查 都弄好了。接下来就是应用到实际的请求中了。
我去热饭
2022/05/19
3260
接口测试平台代码实现131: 全局变量-10
接口测试平台代码实现129: 全局变量-8
如图,我准备先设置俩组变量。这里要明确一个概念,每个按钮代表的是一个变量组,而不是一个变量,一个用户可以拥有多套变量组,每组内可包含多个变量。用户在之后的使用时,可以对具体的项目,设置生效的变量组。生效后,该项目的接口中引入的变量,才会去该变量组中找到对应的值。这点设计和postman类似。
我去热饭
2022/05/19
8700
接口测试平台代码实现129: 全局变量-8
接口测试平台代码实现126: 全局变量-5
很简单,我们告诉后台要增加一个空白的变量,那就什么都不用传。但是这里我们要引入一个比较绕的注意点:那就是,变量所需用户的id,怎么传。
我去热饭
2022/05/19
2510
接口测试平台代码实现126: 全局变量-5
接口测试平台代码实现54:首页重构-2
好,虽然绝大多数同学还未追上最新进度进行投票,但是已投情况来看,大部分还是支持首页做成接口快速调试功能。
我去热饭
2022/05/19
5640
接口测试平台代码实现54:首页重构-2
接口测试平台代码实现62: 多接口用例-2
好了,最近水了好多期,终于要写点代码了。 本节内容,我们搞定这个多接口的大用例 列表相关吧,难度基本为0,都是我们之前用到过的。
我去热饭
2022/05/19
2720
接口测试平台代码实现62: 多接口用例-2
接口测试平台代码实现65: 多接口用例-5
models.py如下,新增DB_step,我们从这开始,把小用例 或者说接口,称为步骤。一个大用例 含有多个步骤step 组成,步骤有执行顺序,本体是一个接口,额外还有提取返回值/断言返回值的 设计。
我去热饭
2022/05/19
2420
接口测试平台代码实现65: 多接口用例-5
接口测试平台代码实现96:全局域名-3
全局域名这里我们目前已经搞定了 域名管理 部分。也就是当用户请求的时候我们偷偷存了份 host,并且去重。
我去热饭
2022/05/19
1K0
接口测试平台代码实现96:全局域名-3
接口测试平台代码实现26:项目详情页设计
本节我们要设计项目详情页。按照我们之前的设计,项目详情页至少要包括3个部分:
我去热饭
2022/05/19
3490
接口测试平台代码实现26:项目详情页设计
接口测试平台代码实现134: 全局变量-13
在上节课中,我们成功的搞定了 在调试层请求体插入 变量。其实这已经证明一切都是可行的了。我们剩下的就是照葫芦画瓢,把什么登陆态,多用例,异常等 都插入全局变量即可完成本章节。
我去热饭
2022/05/19
2750
接口测试平台代码实现134: 全局变量-13
接口测试平台代码实现27: 项目详情页的导航功能
如果发生代码问题特别混乱导致无法自主修复的情况,请及时下载项目的打包百度网盘链接,在第25节的末尾。对比代码或者干脆直接覆盖
我去热饭
2022/05/19
1.3K0
接口测试平台代码实现27: 项目详情页的导航功能
接口测试平台代码实现19.首页优化
按照最近俩天 小伙伴的反馈激烈程度,本节课准备把首页添加一个非常有用户黏性的一个功能。公司内的各个超链接传送门!
我去热饭
2022/05/19
6710
接口测试平台代码实现19.首页优化
接口测试平台代码实现87: 全局请求头-2
书接上回,我们已经在数据库中手动创建了俩个公共请求头。所以本节的主要任务是要让这俩个请求头显示在前端上。
我去热饭
2022/05/19
4610
接口测试平台代码实现87: 全局请求头-2
接口测试平台代码实现127: 全局变量-6
猜测这个图是根据字符串长度判断的,不过我们在viwes.py中修改一下,只保留整数位即可:
我去热饭
2022/05/19
2620
接口测试平台代码实现127: 全局变量-6
接口测试平台代码实现21:项目列表
bug是,我们在做首页的超链接的时候,修改了child函数,使其增加了一个返回数据的控制器-child_json()函数
我去热饭
2022/05/19
3180
接口测试平台代码实现21:项目列表
接口测试平台代码实现58-首页重构6
我们记得,我们都是用a标签超链接 来显示一个一个的请求记录。那么他们点击的href属性,我们指定的是触发一个叫home_log_show()的js函数,传入这个记录的id,当然这个函数还没有写。
我去热饭
2022/05/19
6250
接口测试平台代码实现58-首页重构6
接口测试平台代码实现97:全局域名-4
上节课我们成功的搞定了host域名管理相关的部分。本节我们要开始弄公共请求头了。
我去热饭
2022/05/19
6840
接口测试平台代码实现97:全局域名-4
接口测试平台代码实现133: 全局变量-12
上节课最后我们说要开始弄复杂的body了。其实body也并不是很复杂,我们只需要记住:
我去热饭
2022/05/19
2980
接口测试平台代码实现133: 全局变量-12
接口测试平台代码实现16:吐槽功能后台实现+orm初识
对于我们测试平台而言,最适合不过了。当然我们也可以在settings.py中设置连接其他真正的mysql数据库。
我去热饭
2022/05/19
4230
接口测试平台代码实现16:吐槽功能后台实现+orm初识
推荐阅读
相关推荐
接口测试平台代码实现30:接口库-接口列表
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档