美文网首页程序员数据分析大数据分析
零基础如何学爬虫技术?一篇带你入门!(理论+实操+荐书)

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

作者: 数据分析不是个事儿 | 来源:发表于2019-01-08 08:15 被阅读9次

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

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

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

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


    一、爬虫学习方法论:

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

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


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

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/ujiurqtx.html