Python爬虫框架Scrapy实战之定向批量获取职位招聘信息

Python 爬虫与 Scrapy 实战:批量抓取招聘网站职位信息 本教程介绍了使用Scrapy框架抓取招聘网站职位信息的方法,以猎云网为例展示了完整流程。首先安装Scrapy并创建项目,然后编写爬虫代码提取职位信息(标题、公司、地点、薪资等),配置参数优化爬取效率,最后将数据存储为JSON文件或数据库。文章还提供了提高爬虫稳定性的建议,如使用代理池、请求延时等,适合需要批量获取招聘信息的开发者参考。 阅读详情

 

    所谓网络爬虫,就是一个在网上到处或定向抓取数据的程序,当然,这种说法不够专业,更专业的描述就是,抓取特定网站网页的HTML数据。不过由于一个网站的网页很多,而我们又不可能事先知道所有网页的URL地址,所以,如何保证我们抓取到了网站的所有HTML页面就是一个有待考究的问题了。一般的方法是,定义一个入口页面,然后一般一个页面会有其他页面的URL,于是从当前页面获取到这些URL加入到爬虫的抓取队列中,然后进入到新页面后再递归的进行上述的操作,其实说来就跟深度遍历或广度遍历一样。

 

    Scrapy是一个基于Twisted,纯Python实现的爬虫框架,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非常之方便~

 

    Scrapy 使用 Twisted这个异步网络库来处理网络通讯,架构清晰,并且包含了各种中间件接口,可以灵活的完成各种需求。整体架构如下图所示:


    绿线是数据流向,首先从初始URL 开始,Scheduler 会将其交给 Downloader 进行下载,下载之后会交给 Spider 进行分析,Spider分析出来的结果有两种:一种是需要进一步抓取的链接,例如之前分析的“下一页”的链接,这些东西会被传回 Scheduler ;另一种是需要保存的数据,它们则被送到Item Pipeline 那里,那是对数据进行后期处理(详细分析、过滤、存储等)的地方。另外,在数据流动的通道里还可以安装各种中间件,进行必要的处理。


我假定你已经安装了Scrapy。假如你没有安装,你可以参考这篇文章。

 

在本文中,我们将学会如何使用Scrapy建立一个爬虫程序,并爬取指定网站上的内容

1. 创建一个新的Scrapy Project

2. 定义你需要从网页中提取的元素Item

3.实现一个Spider类,通过接口完成爬取URL和提取Item的功能

4. 实现一个Item PipeLine类,完成Item的存储功能

 

我将会用腾讯招聘官网作为例子。

Github源码:https://github.com/maxliaops/scrapy-itzhaopin


目标:抓取腾讯招聘官网职位招聘信息并保存为JSON格式。


新建工程

首先,为我们的爬虫新建一个工程,首先进入一个目录(任意一个我们用来保存代码的目录),执行:

scrapy startprojectitzhaopin

 

最后的itzhaopin就是项目名称。这个命令会在当前目录下创建一个新目录itzhaopin,结构如下:

.

├── itzhaopin

│   ├── itzhaopin

│   │   ├── __init__.py

│   │   ├── items.py

│   │   ├── pipelines.py

│   │   ├── settings.py

│   │   └── spiders

│   │      └── __init__.py

│   └── scrapy.cfg

 

scrapy.cfg: 项目配置文件

items.py: 需要提取的数据结构定义文件

pipelines.py:管道定义,用来对items里面提取的数据做进一步处理,如保存等

settings.py: 爬虫配置文件

spiders: 放置spider的目录


定义Item

在items.py里面定义我们要抓取的数据:

 

from scrapy.item import Item, Field
class TencentItem(Item):
    name = Field()                # 职位名称
    catalog = Field()             # 职位类别
    workLocation = Field()        # 工作地点
    recruitNumber = Field()       # 招聘人数
    detailLink = Field()          # 职位详情页链接
    publishTime = Field()         # 发布时间

实现Spider

Spider是一个继承自scrapy.contrib.spiders.CrawlSpider的Python类,有三个必需的定义的成员

name: 名字,这个spider的标识

start_urls:一个url列表,spider从这些网页开始抓取

parse():一个方法,当start_urls里面的网页抓取下来之后需要调用这个方法解析网页内容,同时需要返回下一个需要抓取的网页,或者返回items列表

所以在spiders目录下新建一个spider,tencent_spider.py:

import re
import json


from scrapy.selector import Selector
try:
    from scrapy.spider import Spider
except:
    from scrapy.spider import BaseSpider as Spider
from scrapy.utils.response import get_base_url
from scrapy.utils.url import urljoin_rfc
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor as sle


from itzhaopin.items import *
from itzhaopin.misc.log import *


class TencentSpider(CrawlSpider):
    name = "tencent"
    allowed_domains = ["tencent.com"]
    start_urls = [
        "http://hr.tencent.com/position.php"
    ]
    rules = [ # 定义爬取URL的规则
        Rule(sle(allow=("/position.php\?&start=\d{,4}#a")), follow=True, callback='parse_item')
    ]

    def parse_item(self, response): # 提取数据到Items里面,主要用到XPath和CSS选择器提取网页数据
        items = []
        sel = Selector(response)
        base_url = get_base_url(response)
        sites_even = sel.css('table.tablelist tr.even')
        for site in sites_even:
            item = TencentItem()
            item['name'] = site.css('.l.square a').xpath('text()').extract()
            relative_url = site.css('.l.square a').xpath('@href').extract()[0]
            item['detailLink'] = urljoin_rfc(base_url, relative_url)
            item['catalog'] = site.css('tr > td:nth-child(2)::text').extract()
            item['workLocation'] = site.css('tr > td:nth-child(4)::text').extract()
            item['recruitNumber'] = site.css('tr > td:nth-child(3)::text').extract()
            item['publishTime'] = site.css('tr > td:nth-child(5)::text').extract()
            items.append(item)
            #print repr(item).decode("unicode-escape") + '\n'

        sites_odd = sel.css('table.tablelist tr.odd')
        for site in sites_odd:
            item = TencentItem()
            item['name'] = site.css('.l.square a').xpath('text()').extract()
            relative_url = site.css('.l.square a').xpath('@href').extract()[0]
            item['detailLink'] = urljoin_rfc(base_url, relative_url)
            item['catalog'] = site.css('tr > td:nth-child(2)::text').extract()
            item['workLocation'] = site.css('tr > td:nth-child(4)::text').extract()
            item['recruitNumber'] = site.css('tr > td:nth-child(3)::text').extract()
            item['publishTime'] = site.css('tr > td:nth-child(5)::text').extract()
            items.append(item)
            #print repr(item).decode("unicode-escape") + '\n'

        info('parsed ' + str(response))
        return items


    def _process_request(self, request):
        info('process ' + str(request))
        return request

实现PipeLine

 

PipeLine用来对Spider返回的Item列表进行保存操作,可以写入到文件、或者数据库等。

PipeLine只有一个需要实现的方法:process_item,例如我们将Item保存到JSON格式文件中:

 

pipelines.py

from scrapy import signals
import json
import codecs

class JsonWithEncodingTencentPipeline(object):

    def __init__(self):
        self.file = codecs.open('tencent.json', 'w', encoding='utf-8')

    def process_item(self, item, spider):
        line = json.dumps(dict(item), ensure_ascii=False) + "\n"
        self.file.write(line)
        return item

    def spider_closed(self, spider):
        self.file.close(
)

到现在,我们就完成了一个基本的爬虫的实现,可以输入下面的命令来启动这个Spider:

scrapy crawl tencent

 

爬虫运行结束后,在当前目录下将会生成一个名为tencent.json的文件,其中以JSON格式保存了职位招聘信息。

部分内容如下:

{"recruitNumber": ["1"], "name": ["SD5-资深手游策划(深圳)"], "detailLink": "http://hr.tencent.com/position_detail.php?id=15626&keywords=&tid=0&lid=0", "publishTime": ["2014-04-25"], "catalog": ["产品/项目类"], "workLocation": ["深圳"]}
{"recruitNumber": ["1"], "name": ["TEG13-后台开发工程师(深圳)"], "detailLink": "http://hr.tencent.com/position_detail.php?id=15666&keywords=&tid=0&lid=0", "publishTime": ["2014-04-25"], "catalog": ["技术类"], "workLocation": ["深圳"]}
{"recruitNumber": ["2"], "name": ["TEG12-数据中心高级经理(深圳)"], "detailLink": "http://hr.tencent.com/position_detail.php?id=15698&keywords=&tid=0&lid=0", "publishTime": ["2014-04-25"], "catalog": ["技术类"], "workLocation": ["深圳"]}
{"recruitNumber": ["1"], "name": ["GY1-微信支付品牌策划经理(深圳)"], "detailLink": "http://hr.tencent.com/position_detail.php?id=15710&keywords=&tid=0&lid=0", "publishTime": ["2014-04-25"], "catalog": ["市场类"], "workLocation": ["深圳"]}
{"recruitNumber": ["2"], "name": ["SNG06-后台开发工程师(深圳)"], "detailLink": "http://hr.tencent.com/position_detail.php?id=15499&keywords=&tid=0&lid=0", "publishTime": ["2014-04-25"], "catalog": ["技术类"], "workLocation": ["深圳"]}
{"recruitNumber": ["2"], "name": ["OMG01-腾讯时尚视频策划编辑(北京)"], "detailLink": "http://hr.tencent.com/position_detail.php?id=15694&keywords=&tid=0&lid=0", "publishTime": ["2014-04-25"], "catalog": ["内容编辑类"], "workLocation": ["北京"]}
{"recruitNumber": ["1"], "name": ["HY08-QT客户端Windows开发工程师(深圳)"], "detailLink": "http://hr.tencent.com/position_detail.php?id=11378&keywords=&tid=0&lid=0", "publishTime": ["2014-04-25"], "catalog": ["技术类"], "workLocation": ["深圳"]}
{"recruitNumber": ["5"], "name": ["HY1-移动游戏测试经理(上海)"], "detailLink": "http://hr.tencent.com/position_detail.php?id=15607&keywords=&tid=0&lid=0", "publishTime": ["2014-04-25"], "catalog": ["技术类"], "workLocation": ["上海"]}
{"recruitNumber": ["1"], "name": ["HY6-网吧平台高级产品经理(深圳)"], "detailLink": "http://hr.tencent.com/position_detail.php?id=10974&keywords=&tid=0&lid=0", "publishTime": ["2014-04-25"], "catalog": ["产品/项目类"], "workLocation": ["深圳"]}
{"recruitNumber": ["4"], "name": ["TEG14-云存储研发工程师(深圳)"], "detailLink": "http://hr.tencent.com/position_detail.php?id=15168&keywords=&tid=0&lid=0", "publishTime": ["2014-04-24"], "catalog": ["技术类"], "workLocation": ["深圳"]}
{"recruitNumber": ["1"], "name": ["CB-薪酬经理(深圳)"], "detailLink": "http://hr.tencent.com/position_detail.php?id=2309&keywords=&tid=0&lid=0", "publishTime": ["2013-11-28"], "catalog": ["职能类"], "workLocation": ["深圳"]}





Scrapy爬虫实践之搜索并获取前程无忧职位信息(基础篇) 以一个完整的实例来介绍如何实现一个Scrapy爬虫,通过爬虫搜索,并获取前程无忧上的职位信息。 阅读详情

相关推荐

python scrapy爬取智联招聘的公司和职位信息(一)

缘由: 最近在找工作发现智联和51上太多培训机构的虚假招聘信息,于是乎打算写个爬虫看看,培训机构到底发布了多少虚假岗位 一、 创建scrapy项目 安装scrapy 在终端/cmd输入 pip install scrapy 创建项目 **IDE推荐使用pycharm 在cmd/终端输入 (zhaopin为项目的名称) scrapy startproject zhaopin (zha...

welcome 1618

爬虫工具(tkinter+scrapy+pyinstaller)

需求介绍输入:关键字文件,每一行数据为一爬取单元。若一行存在多个and关系的关键字 ,则用|隔开处理:爬取访问6个网站的推送,获取推送内容的标题,发布时间,来源,正文第一段(不是图片或者图例)输出:输出到csv文件ui:窗口小程序,能实时地跟踪爬虫进度运行要求:不依赖于python环境,独立运行的exe文件分析实现的主要程序最后打包crawl.py即可。

kfashfasf的博客 1807

Python爬虫实战:从招聘网站抓取职位招聘信息

引言随着互联网的普及和技术的飞速发展,招聘网站已经成为求职者寻找工作和企业招聘人才的重要平台。无论是从人才需求、薪资待遇、职位要求等多个维度,招聘信息的抓取和分析都具有重要的商业价值。通过爬取招聘网站的职位信息,企业可以了解市场薪资情况和职位需求变化;求职者可以方便地获得关于招聘市场的实时数据,帮助其做出更理性的职业选择。本文将带你深入学习如何使用Python爬虫技术,抓取招聘网站(如拉勾网、猎云网、智联招聘等)上的职位信息,包括职位名称、薪资待遇、公司名称、职位要求、工作地点等关键信息。

2201_76125261的博客 1803

python Tkinter加爬虫,制作前程无忧职位搜索器

通过tkinter做一个关键字搜索职位,抓取的职位都是前程无忧的,第一次做这种将tk对接爬虫的程序,一堆BUG,还好都搞定了,自己也第一次画了程序流程图,画的可能不完美,别见怪哈: 小二,上代码: 基本代码我都备注了,应该很容易看懂的,适合新写学习,看完点一下赞哈,谢谢 import tkinter import requests from bs4 import BeautifulSoup im...

YeLang 776

Python爬虫实战:智联招聘岗位信息采集系统设计

网络爬虫(Web Crawler)是一种自动从互联网上抓取数据的程序,广泛应用于搜索引擎、数据分析、舆情监控、商业情报等领域。Python凭借其简洁易读的语法、丰富的第三方库(如Requests、BeautifulSoup、Scrapy、Selenium等)以及活跃的社区支持,成为网络爬虫开发的首选语言。本章将围绕“爬取智联招聘网站上的职位信息”这一实战目标,系统介绍网络爬虫的核心流程:从发送HTTP请求、解析HTML内容、应对反爬机制到数据存储,帮助读者构建完整的爬虫知识体系。

weixin_35757191的博客 2763

告别懵圈!用CANoe手把手解析ISO15765多帧传输(附实战报文分析)

本文详细解析了ISO15765多帧传输协议在汽车电子诊断中的应用,通过CANoe实战演示了从首帧发送到流控协商再到连续帧传输的完整流程。文章包含嵌入式系统诊断协议的深度分析,特别适合UDS和CAN总线开发人员学习多帧传输机制及常见问题解决方案。

weixin_30813225的博客 281

【爬虫系列】Python爬虫实战--招聘网站的职位信息爬取

以 "智联招聘" PC 端网页为例,选择 request + BeautifulSoup + CSS 选择器的技术方案,实现爬虫目标。

小确幸的博客 2万+

LPDDR5时序精调:深入解析Read Gate Training的两种模式

本文深入解析了LPDDR5内存中关键的Read Gate Training技术,详细对比了RDQS Toggle Mode(翻转模式)与Enhanced RDQS Mode(增强模式)的工作原理、时序参数及适用场景。文章阐述了在高速数据传输下精准校准时序的必要性,并提供了两种模式的实战选型指南与系统级调试思路,帮助工程师优化内存性能与稳定性。

weixin_29219189的博客 367

Python爬虫框架Scrapy实战教程---定向批量获取职位招聘信息

所谓网络爬虫,就是一个在网上到处或定向抓取数据的程序,当然,这种说法不够专业,更专业的描述就是,抓取特定网站网页的HTML数据。不过由于一个网站的网页很多,而我们又不可能事先知道所有网页的URL地址,所以,如何保证我们抓取到了网站的所有HTML页面就是一个有待考究的问题了。一般的方法是,定义一个入口页面,然后一般一个页面会有其他页面的URL,于是从当前页面获取到这些URL加入到爬虫的抓取队列中,然

Java 804

【图数据库与知识图谱入门】2.2 图数据库 vs. 关系型数据库 vs. NoSQL数据库

本文对比了关系型数据库、NoSQL数据库和图数据库的核心差异与应用场景。关系型数据库以二维表结构为核心,适合结构化数据的事务处理(如MySQL),但多表关联查询性能随层级增加而下降。NoSQL数据库(如MongoDB)具有灵活schema,适合海量非结构化数据存储,但关联查询能力较弱。图数据库专注于节点-边关系建模,擅长处理复杂关联分析(如社交网络)。通过学生-课程案例展示了MySQL的多表JOIN操作和MongoDB的两种关联实现方式(内嵌文档和文档引用),揭示了不同数据库在数据关联处理上的本质区别。

kngines 1541

LiveBOS UploadFile.do 任意文件上传漏洞复现(XVE-2023-21708)

LiveBOS UploadFile.do 接口存在任意文件上传漏洞,未经身份验证的攻击者可通过该漏洞在服务器端任意执行代码,写入后门,获取服务器权限,进而控制整个web服务器。

0xSec 2420

python爬虫腾讯招聘职位之Scrapy实战

系列文章目录 python爬虫腾讯招聘职位之Scrapy实战 提前准备插件安装: pip install scrapy 这里是运行成功的截图 python install Twisted 这里是运行成功的截图 阅读目录系列文章目录前言一、编写Tenxun.py爬虫文件二、在item.py列表里进行设置数据表三、在pipelines.py列表里进行设置数据表四、在settings.py文件里配置爬虫五、运行爬虫总结 前言 随着我们对爬虫的了解,以前我们用requests可以请求进行解析网页可以

weixin_44356081的博客 4575

基于matlab的阈值分割的车牌定位识别系统

车牌自动识别模块是现代社会智能交通系统(ITS)的重要组成部分,是图像处理和模式识别技术研究的热点,具有非常广泛的应用。车牌识别主要包括以下三个主要步骤:车牌区域定位、车牌字符分割、车牌字符识别。本案例通过对采集的车牌图像进行灰度变换、边缘检测、腐蚀及平滑等过程进行车牌图像预处理,并由此得到一种基于车牌颜色纹理特征的车牌定位方法,最终实现了车牌区域定位。车牌字符分割是为了方便后续对车牌字符进行匹配,从而对车牌进行识别。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 967

Python爬虫框架scrapy批量获取腾讯招聘网上面的信息

所谓网络爬虫,就是一个在网上到处或定向抓取数据的程序,当然,这种说法不够专业,更专业的描述就是,抓取特定网站网页的HTML数据。不过由于一个网站的网页很多,而我们又不可能事先知道所有网页的URL地址,所以,如何保证我们抓取到了网站的所有HTML页面就是一个有待考究的问题了。一般的方法是,定义一个入口页面,然后一般一个页面会有其他页面的URL,于是从当前页面获取到这些URL加入到爬虫的抓取队列中,然

smilemilk的博客 2946

机器人环境仿真软件:Gazebo_(6).传感器仿真

通过 Gazebo 和 ROS,我们可以方便地配置和使用多种传感器,进行机器人环境的仿真和调试。传感器仿真不仅帮助我们验证和测试机器人的感知能力,还可以在真实部署前发现和解决潜在的问题。本节详细介绍了如何在 Gazebo 中配置激光雷达、摄像头、IMU、声纳和 GPS 传感器,并展示了如何在 ROS 中接收和处理这些传感器数据。此外,还介绍了多传感器融合的基本方法和调试工具,希望这些内容能对你的机器人仿真工作有所帮助。

kkchenjj的博客 1388

Ubuntu 部署 Ollama 避坑指南:下载失败 / 服务崩溃?一招解决所有问题!

本文详细介绍了在Ubuntu系统上安装Ollama大模型工具的完整流程和常见问题解决方案。主要内容包括:环境检查(系统版本、架构、依赖)、一键安装步骤、端口配置和服务启动等核心操作。重点针对下载失败、服务启动异常、权限不足等高频问题,提供了国内镜像配置、手动创建服务文件、用户组添加等实用解决方案。最后通过测试Qwen2.5轻量模型验证安装效果,并给出低配设备选型建议。全文提供可复制的命令行操作,帮助用户快速搭建离线可用的大模型环境。

2501_93651177的博客 1008

【2020-10-27】 scrapy爬虫之猎聘招聘信息爬取

声明:本文只作学习研究,禁止用于非法用途,否则后果自负,如有侵权,请告知删除,谢谢! scrapy爬虫之猎聘招聘信息爬取1.项目场景目标网址:https://www.liepin.com/zhaopin/?key=python&d_sfrom=search_industry2.准备工作2.1 创建scrapy工程:scrapy startproject liepin_spider2.2 创建scrapy爬虫:scrapy genspider liepin 'https://www.liepin.

骑毛驴的猴的博客 6974

【华为OD机试真题E卷】474、推荐多样性 | 机试真题+思路参考+代码解析(E卷复用)(C++、Java、Py)

题目描述 >推荐多样性需要从多个列表中选择元素,一次性要返回 N 屏数据(窗口数量),每屏展示 K 个元素(窗口大小),选择策略:   各个列表元素需要做穿插处理,即先从第一个列表中为每屏选择一个元素,再从第二个列表中为每屏选择一个元素,依次类推   每个列表的元素尽量均分为 N 份,如果不够 N 个,也要全部分配完,参考样例图:

KJ.JK 4434

Python爬虫——Scrapy框架爬取腾讯招聘

大家好,我是霖hero 相信很多人都希望进腾讯这种大厂工作吧,人工高福利好,那么腾讯公司现在在招哪些职位,职位要求是什么呢,今天我们通过Scrapy框架来爬取腾讯招聘网,一探究竟!!! 爬前分析 爬取前我们来简单分析一下腾讯的技术岗招聘网页,进入网站并打开开发者工具,如下图所示: 通过上图可以知道,职位的数据存放在<div class="recruit-wrap recruit-margin"标签中,那么我们打开网页源代码看看,数据是否存放在网页源代码里面,如下图所示: 发现数据没有

霖hero 2074

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

用scrapy框架爬取拉勾网招聘信息

本文实例为爬取拉勾网上的如职位名, 薪资, 公司名称相关python的职位信息。 分析思路 分析查询结果页 在拉勾网搜索框中搜索'python'关键字, 在浏览器地址栏可以看到搜索结果页的url为: 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=', 尝试将?后的参数删除, 发现访问结果相同. 打开Chrome网页调试工具(F12), 分析每条搜索结果(即每个职位)在html中

m0_49079037的博客 2691

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

上一篇: 《实战突击:Java Web项目整合开发》简介及源码
下一篇: Python将JSON格式数据转换为SQL语句以便导入MySQL数据库
Rain松
博客等级 码龄15年 361粉丝 111原创
评论 36
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值