Python Scrapy爬虫框架爬取51job职位信息并保存至数据库

————————————————————————————————
版权声明:本文为CSDN博主「杠精运动员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/CN_Nidus/article/details/109695639

项目要求

  • 使用Scrapy爬虫框架练习爬取51Job网站招聘职位信息并保存至数据库(已sqlite3为例)。

工具软件

python == 3.7
pycharm == 20.2.3
sqlite == 3.33.0
scrapy == 2.4.0

爬取字段

  • 职位名称、薪资、发布日期、工作地点、任职要求、公司名称、公司规模、福利待遇、详情链接。

思路分析

  • 网页连接:https://search.51job.com/list/010000,000000,0000,00,9,99,python%25E7%2588%25AC%25E8%2599%25AB,2,1.html?lang=c&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare=
  • 分析:只要更改链接中的两个关键参数即可实现自定义爬取内容和翻页。
  • 查看网页源代码

  • 分析:页面展示的每一条职位信息都隐藏在script标签内以json格式保存。

完整代码展示

  • 定义Items
import scrapyclass Job51Item(scrapy.Item):jobname = scrapy.Field()salary = scrapy.Field()pubdate = scrapy.Field()job_adress = scrapy.Field()requirement = scrapy.Field()company_name = scrapy.Field()company_size = scrapy.Field()welfare = scrapy.Field()url = scrapy.Field()
  • 定义Pipelines
import sqlite3class Job51Pipeline:def open_spider(self, spider):# 连接数据库self.conn = sqlite3.connect('D:\\OfficeLib\\JetBrains\\PyCharmFiles\\PycharmProjects\\MyScrapy\\db.sqlite3')self.cur = self.conn.cursor()spider.index = 1def close_spider(self, spider):# 关闭数据库self.cur.close()self.conn.close()def process_item(self, item, spider):# 构造sql语句insert_sql = 'insert into job51 (jobname, salary, pubdate, job_adress, requirement, company_name, company_size, welfare, url)' \'values ("{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}")'.format(item["jobname"],item["salary"],item["pubdate"],item["job_adress"],item["requirement"],item["company_name"],item["company_size"],item["welfare"],item["url"])self.cur.execute(insert_sql)self.conn.commit()print("第{}条保存成功".format(spider.index))spider.index += 1return item
  • 爬虫代码
# -*- coding: utf-8 -*-import re
import scrapy
import json
from MyScrapy.items import Job51Item
from urllib import parseclass Job51Spider(scrapy.Spider):name = 'Job51'allowed_domains = ['51job.com']# 指定管道custom_settings = {'ITEM_PIPELINES': {'MyScrapy.pipelines.Job51Pipeline': 299}}# 自定义爬取内容infokey = str(input("请输入要爬取的职位:"))print("开始爬取,请稍等……")infokey_encode = parse.quote(infokey)   # 进行url编码base_url = 'https://search.51job.com/list/010000,000000,0000,00,9,99,{},2,1.html?' \'lang=c&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare='start_urls = [base_url.format(infokey_encode)]def parse(self, response, **kwargs):item = Job51Item()# 获取响应数据并格式化body = response.body.decode('gbk')data_json = re.findall(r'window.__SEARCH_RESULT__ =(.+)}</script>', body)[0] + "}"data_py = json.loads(data_json)for data in data_py['engine_search_result']:print("正在爬取第{}条……".format(self.index))item["jobname"] = data["job_title"]if len(data["providesalary_text"]) <= 0:item["salary"] = ""else:item["salary"] = data["providesalary_text"]item["pubdate"] = data["updatedate"]if len(data["workarea_text"]) <= 0:item["job_adress"] = ""else:item["job_adress"] = data["workarea_text"]item["requirement"] = "、".join(data["attribute_text"])item["company_name"] = data["company_name"]item["company_size"] = data["companysize_text"]if len(data["jobwelf_list"]) <= 0:item["welfare"] = ""else:item["welfare"] = "、".join(data["jobwelf_list"])item["url"] = data["job_href"]yield item# 构造下一页url,当前设置只爬取前5页数据for i in range(2, 5):next_url = "https://search.51job.com/list/010000,000000,0000,00,9,99,{},2,{}.html?" \"lang=c&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99" \"&companysize=99&ord_field=0&dibiaoid=0&line=&welfare=".format(self.infokey_encode, i)yield scrapy.Request(url=next_url, callback=self.parse)
  • Settings配置
# 设置请求延时
DOWNLOAD_DELAY = 3
RANDOMIZE_DOWNLOAD_DELAY = True# 设置user-agent,可以设置多个
USER_AGENT = ["Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1",
]# 关闭robot协议
ROBOTSTXT_OBEY = False# 设置下载中间件
DOWNLOADER_MIDDLEWARES = {'MyScrapy.middlewares.RandomUserAgentMiddleware': 542,
}# 启用管道
ITEM_PIPELINES = {'MyScrapy.pipelines.Job51Pipeline': 299,
}
  • 下载中间件使用随机user-agent
from scrapy import signals
import randomclass RandomUserAgentMiddleware:def process_request(self, request, spider):useragent = random.choice(spider.settings.get("USER_AGENT"))request.headers["User-Agent"] = useragent

运行结果



结束语
爬虫有风险!抓数需谨慎!!!
————————————————
版权声明:本文为CSDN博主「杠精运动员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/CN_Nidus/article/details/109695639

本文章仅供学习交流使用,切勿他用!

Python Scrapy爬虫框架爬取51job职位信息并保存至数据库相关推荐

  1. Python Scrapy 爬虫框架爬取推特信息及数据持久化!整理了我三天!

    最近要做一个国内外新冠疫情的热点信息的收集系统,所以,需要爬取推特上的一些数据,然后做数据分类及情绪分析.作为一名合格的程序员,我们要有「拿来主义精神」,借助别人的轮子来实现自己的项目,而不是从头搭建 ...

  2. Python使用Scrapy爬虫框架爬取天涯社区小说“大宗师”全文

    大宗师是著名网络小说作家蛇从革的系列作品"宜昌鬼事"之一,在天涯论坛具有超级高的访问量.这个长篇小说于2015年3月17日开篇,并于2016年12月29日大结局,期间每天有7万多读 ...

  3. 使用scrapy爬虫框架爬取慕课网全部课程信息

    爬取的链接: http://www.imooc.com/course/list 爬取的内容: 课程链接, 课程的图片url, 课程的名称, 学习人数, 课程描述 1.安装scrapy模块 pip in ...

  4. 爬取51job职位信息--进行专业市场需求可视化分析(python、tableau、DBeaver)

    爬取51job信管专业相关岗位的情况进行可视化分析. 采用工具:python.tableau(可视化).DBeaver(数据库管理软件) 文章目录 一.数据爬取 1.1导入相关的库 1.2对每个岗位搜 ...

  5. Python 采用Scrapy爬虫框架爬取豆瓣电影top250

    scrapy 简介 在此,默认已经安装好Scrapy,如果没有安装可以到scrapy 官网下载安装. 注意: 在安装Scrapy之前首先需要安装一下python第三方库:(安装方法并不在本文讲解范围, ...

  6. 用Scrapy爬虫框架爬取食品论坛数据并存入数据库

    这篇文章主要给大家介绍了食品网站的数据采集和存储过程,详解了如何分析网页结构.爬虫策略.网站类型.层级关系.爬虫方法和数据存储过程,最终实现将帖子的每条评论爬取到数据库中,并且做到可以更新数据,防止重 ...

  7. 【scrapy】实战爬取前程无忧职位信息

    @Hadi 初来乍到 多多点赞 文章目录 @Hadi 前言 一.简述Scrapy 1.什么是scrpay框架 2.基本架构 二.需求分析 1.需求是什么 2.对目标页面进行分析 URL结构分析 三.开 ...

  8. 怎么防爬虫爬取信息_scrapy爬取51job职位信息(针对新的反爬虫机制)!

    1 定义抓取内容 在items.py中添加如下代码: class Job51Item(scrapy.Item):title = scrapy.Field()salary = scrapy.Field( ...

  9. scrapy爬虫框架爬取词语、医疗问答

    源码请看: https://github.com/liuluyeah/baidudic 转载于:https://blog.51cto.com/9283734/2092321

最新文章

  1. 【Win7下Android native code的编译和调试】
  2. 9-分析事物问题并编写 Utils 文件
  3. 40亿骚扰电话拨出,6亿用户隐私泄露,央视315曝光AI黑暗面
  4. 企业实战_08_MyCat 搭建Mysql 一主二从复制环境
  5. js 时间获取格式化 fmt
  6. bzoj2423[HAOI2010]最长公共子序列
  7. Unity3D开发学习
  8. ios开发之商城类软件 - 框架构思
  9. VS2019正式版注册码秘钥
  10. 软件工程毕业设计题目推荐50例
  11. “编程不规范 亲人泪两行”
  12. 【评价模型】层次分析法(AHP) 个人总结 续更
  13. 陀螺仪、加速计、磁力计等传感器汇总
  14. 自动化脚本开发,真香.....
  15. 按照是否执行程序分类
  16. 6轴串联关节机器人的奇异点
  17. 64位ubuntu使用gcc -m32报错
  18. android自适应屏幕方向,Android 屏幕自适应方向尺寸与分辨率-Fun言
  19. Photoshop制作WiFi图标
  20. 淘宝开网店靠谱吗?为什么没有销量?那是因为你犯了以下几点

热门文章

  1. java实现web服务器_Java 实现一个简单的web服务器
  2. 天心系统服务器不能登录,天心系统日常用到的操作
  3. 除了ajax技术还有什么技术,几种Ajax技术
  4. imageX.exe
  5. java图形化GUI编程-AwtSwing(一文解决)
  6. japan-movie-night-restraut
  7. Linq中datetime的处理以及asp.net下拉列表控件的selectitem,text等的设置显示处理
  8. mysql的join三种算法_MySQL系列(九)---MySQL几种JOIN算法
  9. 信息技术学科知识与教学能力
  10. 亚马逊Amazon站内信对接