BOSS直聘招聘信息获取之爬虫工具分析
文中使用的组件库仅限于Python语言,由于最近收到一些同学的留言说,按照网上的教程一步一步的学习,却频繁的出现报错,很多情况是因为版本不一致的问题导致的,我会在文中描述示例的库版本号,新手同学还需多加留意。
爬虫程序分析
我们可以使用很多方式来完成一个爬虫程序的编写,可以使用比较完善的爬虫框架(博主是并没有使用过这方面的框架,只会些小打小闹的,所以不过多描述),也可以使用request、aiohttp、BeautifulSoup库实现基础的爬虫功能,我们后面的学习也是基于这几个库迭代完成的。
Python主流的爬虫框架
你以为Python爬虫框架只有Scrapy么,Python中还有些主流的爬虫框架我们在此简答介绍下
1.Scrapy
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。。用这个框架可以轻松爬下来如亚马逊商品信息之类的数据。
项目地址:https://scrapy.org/
2.PySpider
pyspider 是一个用python实现的功能强大的网络爬虫系统,能在浏览器界面上进行脚本的编写,功能的调度和爬取结果的实时查看,后端使用常用的数据库进行爬取结果的存储,还能定时设置任务与任务优先级等。
项目地址:https://github.com/binux/pyspider
3.Crawley
Crawley可以高速爬取对应网站的内容,支持关系和非关系数据库,数据可以导出为JSON、XML等。
项目地址:http://project.crawley-cloud.com/
4.Portia
Portia是一个开源可视化爬虫工具,可让您在不需要任何编程知识的情况下爬取网站!简单地注释您感兴趣的页面,Portia将创建一个蜘蛛来从类似的页面提取数据。
项目地址:https://github.com/scrapinghub/portia
5.Newspaper
Newspaper可以用来提取新闻、文章和内容分析。使用多线程,支持10多种语言等。
项目地址:https://github.com/codelucas/newspaper
6.Beautiful Soup
Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间。
项目地址:https://www.crummy.com/software/BeautifulSoup/bs4/doc/
7.Grab
Grab是一个用于构建Web看板的Python框架。借助Grab,您可以构建各种复杂的网页抓取工具,从简单的5行脚本到处理数百万个网页的复杂异步网站抓取工具。Grab提供一个API用于执行网络请求和处理接收到的内容,例如与HTML文档的DOM树进行交互。
项目地址:http://docs.grablib.org/en/latest/#grab-spider-user-manual
8.Cola
Cola是一个分布式的爬虫框架,对于用户来说,只需编写几个特定的函数,而无需关注分布式运行的细节。任务会自动分配到多台机器上,整个过程对用户是透明的。
项目地址:https://github.com/chineking/cola
基于Cola实现的爬虫位于contrib/目录下。目前实现了四个爬虫:
- wiki:维基百科。
- weibo:新浪微博爬虫。从初始用户出发,然后是其关注和粉丝,依次类推,抓取指定个数的新浪微博用户的微博、个人信息、关注和粉丝。其中,用户微博只获取了内容、赞的个数、转发和评论的个数等等,而没有具体去获取此微博被转发和评论的内容。
- generic(unstable):通用爬虫,只需配置,而无需修改代码。目前Cola实现了一个抽取器(cola/core/extractor),能够从网页正文中自动抽取主要内容,即去除类似边栏和底脚等内容。但是,此抽取器目前准确度还不够,效率也不够高,所以需要谨慎使用。
- weibosearch(unstable):新浪微博搜索的爬虫。这个爬虫使用cola.core.opener.SpynnerOpener,基于spynner实现了一个Opener能够执行JavaScript和Ajax代码。目前这个爬虫存在的问题是:新浪微博可能会将其识别成机器人,因此有可能会让输入验证码。
到此,想要学框架的同学可以准备关闭网页了。
先了解下后面爬取需要的模块
Requests 模块
帮助文档:https://requests.readthedocs.io/en/master/
虽然Python的标准库中 urllib2 模块已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests 自称 “HTTP for Humans”,说明使用更简洁方便。
Requests 继承了urllib2的所有特性。Requests支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动确定响应内容的编码,支持国际化的 URL 和 POST 数据自动编码。
核心功能:
- Keep-Alive & 连接池
- 国际化域名和 URL
- 带持久 Cookie 的会话
- 浏览器式的 SSL 认证
- 自动内容解码
- 基本/摘要式的身份认证
- 优雅的 key/value Cookie
- 自动解压
- Unicode 响应体
- HTTP(S) 代理支持
- 文件分块上传
- 流下载
- 连接超时
- 分块请求
- 支持 .netrc
Requests 支持 Python 2.6—2.7以及3.3—3.7,而且能在 PyPy 下完美运行。
简单的页面获取
我们来尝试获取BOSS的首页。
# Python3.7
# requests==2.23.0
import requests
def run():
req = requests.get('https://www.zhipin.com')
if req.status_code == 200:
print(req.content.decode("utf-8"))
if __name__ == "__main__":
run()
BOSS首页获取到的部分信息
aiohttp 模块
aiohttp是一个为Python提供异步HTTP 客户端/服务端编程,基于asyncio(Python用于支持异步编程的标准库)的异步库。由于是基于asyncio的,所以支持 Python 3.5+,如果你使用的是Python 3.4, 请将await替换成yield from,将async 替换成带有 @corotine装饰器的def。
帮助文档:https://docs.aiohttp.org/en/stable/
核心功能:
- 同时支持客户端使用和服务端使用。
- 同时支持服务端WebSockets组件和客户端WebSockets组件,开箱即用。
- web服务器具有中间件,信号组件和可插拔路由的功能。
简单的页面获取
我们还是来获取BOSS的首页。
# Python3.7
# aiohttp==3.6.3
import aiohttp
async def run():
async with aiohttp.ClientSession() as session:
async with session.get('https://www.zhipin.com') as resp:
assert resp.status == 200
print(await resp.text())
if __name__ == "__main__":
asyncio.run(run())
BOSS首页获取到的部分信息
bs4模块
Beautiful Soup 4.4.0 文档
Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库。 它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式。Beautiful Soup会帮你节省数小时甚至数天的工作时间。
- Beautiful Soup 4 支持 Python2.x 和Python3.x
- Beautiful Soup3 支持 Python2.x
- Beautiful Soup 4兼容Beautiful Soup3的功能
帮助文档:https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/
简单的页面数据提取
我们还是来提取BOSS的title。
# Python3.7
# requests==2.23.0
import requests
def run():
req = requests.get('https://www.zhipin.com')
if req.status_code == 200:
content = req.content.decode("utf-8")
content = bs(content, "html.parser")
print(content.find("title").text)
if __name__ == "__main__":
run()
BOSS招聘信息爬取
到此我们需要的基本工具就介绍完了,后面会继续分享 如何将这些工具运用到实战中。
end
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 软件包管理、计划任务-Linux每日一练(8)
- AkShare-能源数据-碳排放-湖北
- AkShare-能源数据-碳排放-广州
- AkShare-股票数据-次新股
- 问与答87: 如何根据列表内容在文件夹中查找图片并复制到另一个文件夹中?
- Java反射是什么?看这篇绝对会了!
- Vuejs 3.0 正式版发布!One Piece. 代号:海贼王
- ES6中模块导入遇到的问题及其解决办法
- 还在手写任务调度代码?试试这款可视化分布式调度框架!
- 3分钟搞定微信小程序类美团用户商家距离计算
- pytest封神之路第五步 参数化进阶
- 深入解读Vue修饰符sync
- 【深度知识】以太坊数据序列化RLP编码/解码原理
- Android 带伸缩动画的布局
- iOS 图像处理技术追踪-Core Image