对于小白来说, 爬虫可能是一件非常复杂, 技术门槛很高的事情.
但掌握正确的方法, 在短时间内做到能够爬取主流网站的数据, 其实非常容易实现!
同时, 你需要从一开始就有一个具体的目标! 只有在目标的驱动下, 你的学习才会更加精准和高效. 那些所有你认为必须的前置知识, 都是可以在完成目标的过程中学到的.
这里给你一条零基础快速入门的学习步骤, 之后我会举例说明怎么用, 并推荐一些个人认为不错的书给你.(文章稍长, 可按个人需求跳着看:))
一, 爬虫学习方法论:
1. 学习 Python 包并实现基本的爬虫过程
2. 了解非结构化数据的存储
3. 学习 scrapy, 搭建工程化爬虫
4. 学习数据库知识, 应对大规模数据存储与提取
5. 掌握各种技巧, 应对特殊网站的反爬措施
6. 分布式爬虫, 实现大规模并发采集, 提升效率
1, 学习 Python 基础知识并尝试
大多数爬虫是按 "发送请求 -- 获得页面 -- 解析页面 -- 抽取并储存内容" 这样的流程来进行, 这其实是模拟了我们使用浏览器获取网页信息的过程.
在 Python 众多的爬虫包中 (urllib,requests,bs4,scrapy,pyspider 等) 建议从 requests+Xpath 开始, requests 负责连接网站, 返回网页, Xpath 用于解析网页, 便于抽取数据.
如果你用过 BeautifulSoup, 会发现 Xpath 要省事不少, 一层一层检查元素代码的工作, 全都省略了. 当然如果你需要爬取异步加载的网站, 可以学习浏览器抓包分析真实请求或者学习 Selenium 来实现自动化, 这样, 知乎等动态的网站也可以迎刃而解.
2, 了解非结构化数据的存储
爬回来的数据可以直接用文档形式存在本地, 也可以存入数据库中.
始数据量不大的时候, 你可以直接通过 Python 的语法或 pandas 的方法将数据存为 CSV 这样的文件.
当然你可能发现爬回来的数据并不是干净的, 可能会有缺失, 错误等等, 你还需要对数据进行清洗, 可以学习 pandas 包的基本用法来做数据的预处理, 得到更干净的数据.
3,scrapy 搭建工程化爬虫
一般的数据和代码, 前面的技术基本可以解决, 但在遇到复杂一些的情况时, 就需要其他的进阶技术了. 这时候, scrapy 框架就非常有用了. 它不仅能便捷地构建 Request, 还有强大的 Selector 能够方便地解析 Response, 然而最让人惊喜的还是它超高的性能, 可以将爬虫工程化, 模块化.
这可以帮助你从爬虫工程的维度去思考问题, 去搭建简单的爬虫框架, 在做大规模数据爬虫的时候能够结构化, 工程化地思考大规模的爬取问题.
当然 Scrapy 本身的 selector , 中间件, spider 等对初学者会比较难理解, 还是建议结合具体的例子, 参考别人的代码, 去理解其中实现的过程.
4, 数据库应对大规模数据存储
爬回来的数据, 如果数量巨大, 比如爬取多个元素, 翻页, 处理多种情况等涉及的语句控制, 又比如提取内容时涉及到的字符串, 列表, 字典的处理等, 文档储存就有点行不通了. 所以掌握一种数据库是必须的. MongoDB 是目前比较主流的.
MongoDB 可以存储一些非结构化的数据, 比如各种评论的文本, 图片的链接等等. 你也可以利用 PyMongo, 直接在 Python 中操作 MongoDB, 用起来很方便.
但这里要用到的数据库知识其实非常简单, 主要是数据如何入库, 如何进行提取, 在需要的时候再学习就行.
5, 掌握应对特殊网站的反爬技巧
当然, 爬虫过程也会是不是经历一些绝望啊, 比如被网站封 IP, 比如各种奇怪的验证码, userAgent 访问限制, 各种动态加载等等.
遇到这些反爬虫的手段, 当然还需要一些高级的技巧来应对, 常规的比如访问频率控制, 使用代理 IP 池, 抓包, 验证码的 OCR 处理等等. 比如, 如果在爬网站的时候被封了 IP, 简单的可以通过 time.sleep() 控制爬取频率的方法解决; 而限制比较严格或者需要保证爬取速度, 就要用代理 IP 来解决了.
往往网站在高效开发和反爬虫之间会偏向前者, 这也为爬虫提供了空间, 掌握这些应对反爬虫的技巧之后, 绝大部分的网站已经难不到你了.
6, 分布式爬虫, 实现大规模并发采集
到这里, 爬取基本数据对你而言已经不是事儿了, 你想提升的可能就是爬取海量数据的效率. 那么, 就要 get 一个技能: 分布式爬虫. 它是利用多线程的原理让多个爬虫同时工作, 需要你掌握 Scrapy + MongoDB + Redis 这三种工具.
Scrapy 前面我们说过了, 用于做基本的页面爬取, MongoDB 用于存储爬取的数据, Redis 则用来存储要爬取的网页队列, 也就是任务队列.
当你能够写分布式的爬虫的时候, 那么你可以去尝试打造一些基本的爬虫架构了, 实现一些更加自动化的数据获取.
基本上, 掌握这些, 你已经有一定基础了; 之后的就是找一个实际的项目去实践, 不断熟练这个过程, 并且差缺补漏.
爬虫这种技术, 既不需要你系统地精通一门语言, 也不需要多么高深的数据库技术, 主要是数据的入库和提取, 顺带掌握了基本的插入, 删除等操作. 另外一个高效的姿势就是从实际的项目中去学习这些零散的知识点, 你能保证每次学到的都是最需要的那部分.
二, 举个栗子: 爬虫 + 分析
爬数据是一个数据采集的过程, 通常伴随着数据分析.
下面是我爬了智联招聘上 BI 岗位的数据信息, 用 Python 爬了数据, 然后用 BI 做可视化分析. 演示了一个从爬取数据 -- 数据分析的完整过程.(对数据分析不感冒的可以只看爬虫部分)
1,Python 爬取智联招聘岗位信息(附源码)
选择智联招聘, 通过 Python 来进行 "BI 工程师" 的关键数据信息的爬取, 这里大家也可以试着爬取自己岗位的关键词, 如 "数据分析师","java 开发工程师" 等. 经过 F12 分析调试, 数据是以 JSON 的形式存储的, 可以通过智联招聘提供的接口调用返回.
这边通过 Python 对智联招聘网站的数据进行解析, 爬取了 30 页数据, 并且将岗位名称, 公司名称, 薪水, 所在城市, 所属行业, 学历要求, 工作年限这些关键信息用 CSV 文件保存下来.
附上完整 Python 源码:
- import requests
- import JSON
- import CSV
- from urllib.parse import urlencode
- import time
- def savehtml(file_name,file_content): #保存 conten 对象为 HTML 文件
- withopen(file_name.replace('/','_')+'.html','wb') as f:
- f.write(file_content)
- def GetData(url,writer):# 解析并将数据保存为 CSV 文件
- response= requests.get(url)
- data=response.content
- saveHtml('zlzp',data) #保存 HTML 文件
- jsondata=JSON.loads(data)
- dataList=jsondata['data']['results']
- #print(jsondata)
- for dic in dataList:
- jobName=dic['jobName'] #岗位名称
- company=dic['company']['name'] #公司名称
- salary=dic['salary'] #薪水
- city=dic['city']['display'] #城市
- jobtype = dic['jobType']['display'] #所属行业
- eduLevel=dic['eduLevel']['name'] #学历要求
- workingExp=dic['workingExp']['name'] #工作经验
- print(jobName,company,salary,city,jobtype,eduLevel,workingExp)
- writer.writerow([jobName,company,salary,city,jobtype,eduLevel,workingExp])
- param={ 'start':0,
- 'pageSize':60,
- 'cityId':489,
- 'workExperience':-1,
- 'education':-1,
- 'companyType': -1,
- 'employmentType': -1,
- 'jobWelfareTag': -1,
- 'kw': 'BI
工程师', #搜索关键词, 可以根据你需要爬取的岗位信息进行更换'kt': 3,'lastUrlQuery':{"p":1,"pageSize":"60","jl":"681","kw":"python","kt":"3"}
- }# 参数配置
- pages=range(1,31)# 爬取 1-30 页数据
- out_f = open('test.csv', 'w', newline='')
- writer = CSV.writer(out_f)
- writer.writerow(['jobName','company','salary','city','jobtype','eduLevel','workingExp'])
- for p in pages: #自动翻页
- param['start']=(p-1)*60
- param['lastUrlQuery']['p']=p
- url ='https://fe-api.zhaopin.com/c/i/sou?' + urlencode(param)
- GetData(url,writer)
- time.sleep(3)# 间隔休眠 3 秒, 防止 IP 被封
- print(p)
- out_f.close()
经过一番编译调试, 代码成功运行.
全部数据爬取完毕, 一共 1800 条, 保存在本地 CSV 文件中.
接下来是数据分析. 数据是爬到了, 然后我想了解各城市的 BI 岗位需求情况以及薪资水平; 薪水随工作经验的涨幅情况, 以及有哪些具体的高薪岗......
这里我用 FineBI 来做这样一份分析, 相比 Python 操作简单, 且 BI 能应付绝大多数场景的数据分析, 尤其擅长多维数据切片, 不需要建模; 甚至数据清洗环节也能放在前端, 通过过滤筛选, 新建计算公式等来解决. 最后呈现可视化, 并可设计数据报告.
分析流程: 连接 / 导入数据 -- 数据处理 / 清洗(过滤, 筛选, 新增公式列)-- 探索式分析 -- 数据可视化 -- 出报告.
2, 数据清洗加工
1. 薪水上下限分割:
将 CSV 文件数据导入 FineBI 中 (新建数据链接, 建立一个分析业务包, 然后导入这张 Excel 表). 因为薪水是以 xxK-xxk(还有一些类似校招 / 薪资面议的数据) 的形式进行存储的, 我这边使用 FineBI 新增公式列 (类似 Excel 函数) 将这些字符进行分割:
薪水下限(数值):left(indexofarray ( split (salary,"-") ,1),find( "K",INDEXOFARRAY(split(salary,"-") ,1))-1)
薪水上限(含 K 字符):right (indexofarray( split(salary,"-") ,2),len(salary)-find("K",indexofarray(split(salary,"-"),2 ) ) )
薪水上限(数值):left( 薪水上限(文本),find("K", 薪水上限(文本))-1 )
这样就得到每个岗位的数值格式的薪水区间了:
2. 脏数据清洗:
浏览了一下数据, 没有大问题, 但是发现里面有一些类似 BIM 工程师的岗位信息, 这些应该都是土木行业的工程师, 这边我直接过滤掉即可(不包含 "BIM" 且不包含 "bim").
3. 岗位平均数据计算
再新增列, 平均薪水 =(薪水下限 + 薪水上限)/2, 即可得到每个岗位的平均薪水.
4. 真实城市截取
由于城市字段存储有的数据为 "城市 - 区域" 格式, 例如 "上海 - 徐汇区", 为了方便分析每个城市的数据, 最后新增列 "城市", 截取 "-" 前面的真实城市数据.
城市: if(find("-",city)>0 , left(city,find("-",city)-1 ),city)
至此, 18000 多条数据差不多清洗完毕, 接下来是将数据可视化呈现.
3, 数据可视化
这里用 FineBI 分析要理解一个思路. 常规我们用 Excel 做分析或者说做图表, 是先选用钻则图表然后设定系列, 数值. 这里没有系列和数值的概念, 只有横轴和竖轴. 拖入什么字段, 该字段就以该轴进行扩展, 至于图表 finebi 会自动判别推荐.
这边以各城市平均薪水 / 岗位数量分析为例:
横轴以 "城市" 字段扩展, 展现两类数据. 先是薪水值, 拖拽到纵轴, 默认对数值类的字段是汇总求和的. 点击字段可直接对改字段修改计算, 过滤等操作.
此图来自官网, 图中数据不是本次分析的数据, 仅供参考
然后分析每个城市 BI 岗位的情况. 将数据记录数这个指标拖入到纵轴展示. 同样的方式, 可以修改字段名. 这里为了区分两者, 将其修改为折线图, 并且倒叙展示.
同理, 其他图表也是这样的操作, 想清楚展现什么样的数据, 怎样展现, 数据要作何处理. 就得心应手了. 其他图表就不一一赘述了.
一份完整的智联招聘网站 - BI 工程师岗位数据分析的可视化报告就制作完成:
审美有限, 先能做成这样....
三, 书籍推荐
奉上初学者最好的 Python 学习书单!
编程入门:
1,《"笨办法学"Python3》
本书是基于 Python 3.6 版本编写的. 是一本 Python 入门书籍, 适合对计算机了解不多, 没有学过编程, 但对编程感兴趣的读者学习使用. 这本书以习题的方式引导读者一步一步学习编程, 从简单的打印一直讲到完整项目的实现, 让初学者从基础的编程技术入手, 最终体验到软件开发的基本过程.
2,《Python 编程从入门到精通》
本书循序渐进, 由浅入深地详细讲解了 Python 3 语言开发的核心技术, 并通过具体实例的实现过程演练了各个知识点的具体使用流程. 通过两个综合实例的实现过程, 介绍了 Python 3 语言在综合项目中的使用流程. 全书内容循序渐进, 以 "技术解惑" 和 "范例演练" 贯穿全书, 引领读者全面掌握 Python 3 语言.
书中共有 900 多个实例和范例, 300 多个正文实例, 600 多个拓展范例, 77 个课后练习, 63 个技术解惑, 两大综合案例, 每个知识点除了一个实例外, 还有两个拓展范例, 达到举一反三的效果.
可以说一本书包括三本书的内容: 基础, 实例, 综合案例
3,《Python 编程快速上手 -- 让繁琐工作自动化》
美亚畅销 Python 3 编程图书, 帮助你通过编程快速实现工作自动化.
在本书中, 你将学习利用 Python 编程, 在几分钟内完成手工需要几小时的工作, 而事先却无需具备编程经验. 一旦掌握了编程的基础知识, 你就可以毫不费力地创建 Python 程序, 完成高效的自动化工作, 包括:
●在一个文件或多个文件中搜索文本;
●创建, 更新, 移动和重命名文件和文件夹;
●搜索网页和下载的在线内容;
●在任意大小的 Excel 电子表格中更新和格式化数据;
●拆分, 合并 PDF 文件, 以及如何加水印和加密;
●发送提醒邮件和文本通知;
●填写在线表格.
4,《易学 Python》
本书采用简洁, 有趣, 易学的方式对 Python 3 编程语言进行了讲解, 其风格与通篇介绍编程特性, 罗列语言功能的大多数编程图书不同, 而是引导读者带着好奇, 带着问题去学习, 掌握 Python 编程语言, 继而编写真实而有用的程序.
《易学 Python》总共分为 3 部分, 共 12 章, 第 1 部分介绍了为何使用 Python 来编程. 从第 2 部分起, 通过编写 Hunt the Wumpus 游戏带领读者认识并解决编程中的一些实际问题. 例如, 如何管理复杂的程序, 确保其清晰易懂; 如何在程序中使用 Python 标准库, 以节省编程时间, 同时让程序更容易理解; 如何对编写好的程序进行测试; 如何进行面向对象的程序设计. 第 3 部分则使用框架对书中的程序进行完善, 让读者对 Python 的强大功能有一个更深入的认识. 本书最后还提供了一些 Python 资源, 供读者深入学习 Python 时参考.
5,《像计算机科学家一样思考 Python(第 2 版)》
如果想要学习如何编程, 从 Python 语言入手是一个很好的开端. 本书从基本的编程概念开始, 一步步引导读者了解 Python 语言, 再逐渐掌握函数, 递归, 数据结构和面向对象设计等高阶概念. 本书第 2 版及其辅助代码均已升级, 支持 Python 3.
每章后的练习可以帮助读者加深对刚学的编程概念的理解. 本书是高中和大学阶段的学生, 自学者, 以及需要了解编程基础的专业人士的理想读物. 初学者可以在浏览器中学习如何开始 Python 编程.
从基础开始, 包括语言的语法和语义.
掌握每一个编程概念的清晰定义.
循序渐进地学习值, 变量, 语句, 函数和数据结构.
了解如何操作文件和数据库.
理解对象, 方法和面向对象编程.
使用各种调试技巧来修复语法错误, 运行时错误和语义错误.
通过一系列案例研究来探索函数, 数据结构和算法.
本书的示例代码均在 GitHub 仓库中维护, 读者很容易下载和修改.
自学经典编程入门
1,《Python 核心编程(第 3 版)》
畅销经典的 Python 书, 兼顾 Python2 和 Python3,Python 开发人员的案头常备
Python 是一种灵活, 可靠且具有表现力的编程语言, 它将编译语言的强大与脚本语言的简洁性, 快速开发特性整合起来. 在本书中, Python 开发人员兼企业培训师 Wesley Chun 会帮助您将 Python 技能提升到更高的水平.
本书涵盖了成为一名技术全面的 Python 开发人员所需的一切内容. 本书讲解了应用开发相关的多个领域, 而且书中的内容可以立即应用到项目开发中. 此外, 本书还包含了一些使用 Python 2 和 Python 3 编写的代码案例, 以及一些代码移植技巧. 有些代码片段甚至无须修改就可以运行在 Python 2.x 或 Python 3.x 上.
2,《Python 程序设计(第 3 版)》
Python 之父作序推荐, Python 3 编程入门经典. 本书以 Python 语言为工具教授计算机程序设计. 本书强调解决问题, 设计和编程是计算机科学的核心技能. 本书特色鲜明, 示例生动有趣, 内容易读易学, 适合 Python 入门程序员阅读, 也适合高校计算机专业的教师和学生参考.
3,《笨办法 " 学 Python(第 3 版)》
作者 Zed Shaw 完善了这个堪称世上最好的 Python 学习系统. 只要跟着学习, 你就会和迄今为止数十万 Zed 教过的初学者一样获得成功.
在这本书中, 你将通过完成 52 个精心设计的习题来学会 Python. 阅读这些习题, 把习题的代码精确地写出来(禁止复制和粘贴!), 修正你的错误, 观察程序的运行. 在这个过程中, 你将了解软件是如何工作的, 好的程序看起来是什么样子, 怎样阅读, 编写, 思考代码, 以及如何用专业程序员的技巧来找出并修正错误.* 重要的是, 你将学到下面这些编写优秀的 Python 软件必需的初始技能.
这本书会让你的每一分钟投入都有回报. Python 是世界上 * 强大,* 受欢迎的编程语言之一, 很快你就会成为一名 Python 程序员. 你还可以看 Zed 的视频! 随书附赠的 DVD 中包含 5 个多小时激情挥洒的教学内容: 一部完整的 Python 视频教程!
以上, 就是对于初学者而言的爬虫入门, 甚至是进阶.
如果对数据分析感兴趣, 欢迎到公号 @数据分析不是个事儿来交流,[十周入门数据分析]正在更新中.
来源: http://www.jianshu.com/p/4e594c6ab9db