对于小白来说,爬虫可能是一件非常复杂、技术门槛很高的事情。
但掌握正确的方法,在短时间内做到能够爬取主流网站的数据,其实非常容易实现!
同时,你需要从一开始就有一个具体的目标!只有在目标的驱动下,你的学习才会更加精准和高效。那些所有你认为必须的前置知识,都是可以在完成目标的过程中学到的。
这里给你一条零基础快速入门的学习步骤,之后我会举例说明怎么用,并推荐一些个人认为不错的书给你。(文章稍长,可按个人需求跳着看:))
一、爬虫学习方法论:
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视频教程!
以上,就是对于初学者而言的爬虫入门,甚至是进阶。
如果对数据分析感兴趣,欢迎到公号@数据分析不是个事儿 来交流,[十周入门数据分析]正在更新中。
网友评论