零基础如何学爬虫技术?一篇带你入门!(理论+实操+荐书)

科学计算与大数据

浏览数:51

2019-10-10

对于小白来说,爬虫可能是一件非常复杂、技术门槛很高的事情。

但掌握正确的方法,在短时间内做到能够爬取主流网站的数据,其实非常容易实现!

同时,你需要从一开始就有一个具体的目标!只有在目标的驱动下,你的学习才会更加精准和高效。那些所有你认为必须的前置知识,都是可以在完成目标的过程中学到的。

这里给你一条零基础快速入门的学习步骤,之后我会举例说明怎么用,并推荐一些个人认为不错的书给你。(文章稍长,可按个人需求跳着看:))

一、爬虫学习方法论:

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视频教程!

以上,就是对于初学者而言的爬虫入门,甚至是进阶。

如果对数据分析感兴趣,欢迎到公号@数据分析不是个事儿 来交流,[十周入门数据分析]正在更新中。

作者:数据分析不是个事儿