当前位置: 首页 > 科技观察

从0到1:Python爬虫知识梳理

时间:2023-03-15 20:28:10 科技观察

数据分析和任何技术一样,应该带着目标去学习。目标就像一座灯塔,指引着你前进。很多人学着学着就放弃了,很大一部分原因是没有明确的目标,所以一定要明确学习的目的。在准备学习爬虫之前,问问自己为什么要学习爬虫。有的人是为了工作,有的人是为了好玩,还有的人是为了黑科技功能。但可以肯定的是,学习爬行可以为你的工作提供很多便利。小白入门必须作为一个零基础的小白来阅读,大致可以分为三个阶段来实现。第一阶段入门,掌握必要的基础知识,如Python基础、网络请求的基本原理等;第二阶段是模仿,学习别人的爬虫代码,理解每一行代码,熟悉主流的爬虫工具。第三阶段是自己动手。这个阶段你开始有自己的解题思路,可以独立设计爬虫系统了。爬虫涉及的技术包括但不限于熟练掌握一门编程语言(这里以Python为例)、HTML知识、HTTP协议基础知识、正则表达式、数据库知识、常用抓包工具的使用、使用爬虫框架,相关的大型爬虫还需要了解分布式、消息队列、常用数据结构和算法、缓存,甚至机器学习的应用等概念。许多技术支持大型系统。数据分析、挖掘,甚至机器学习都离不开数据,而数据往往需要通过爬虫来获取。所以,即便是把爬虫作为专业来学习,也是大有前途的。那么,是不是要把上面的知识都学会了,才能开始写爬虫呢?当然不是,学习是一辈子的事。只要会写Python代码,就可以直接上手爬虫。就像学车一样,写代码比开车安全多了。用Python写爬虫,首先需要懂Python,了解基本语法,知道函数、类、列表、dict中常用方法的使用。然后你需要了解HTML。HTML是一种文档树结构。网上有30分钟介绍HTML的教程https://img.ydisp.cn/news/20220912/mzvwflctekh.htm,足够了。HTTP知识爬虫的基本原理是通过网络请求从远程服务器下载数据的过程,而这种网络请求背后的技术是基于HTTP协议的。作为一个入门级的爬虫,你需要了解HTTP协议的基本原理。HTTP规范虽然不能一本书写完,但是深入的内容以后可以慢慢看,理论联系实际。网络请求框架是HTTP协议的实现。比如著名的网络请求库Requests就是一个模拟浏览器发送HTTP请求的网络库。了解了HTTP协议之后,就可以有针对性的学习和网络相关的模块了。比如Python自带的urllib、urllib2(Python3中的urllib)、httplib、cookies等,当然你可以直接跳过这些。要学习如何直接使用Requests,前提是你熟悉HTTP协议的基本内容。数据爬下来的时候,大部分是HTML文本,少数是基于XML格式或者Json格式的数据。要正确处理这些数据,必须熟悉每种数据类型的解决方案,比如JSON数据可以直接使用Python内置的模块json进行处理;对于HTML数据,可以使用BeautifulSoup、lxml等库进行处理;对于xml数据,可以使用untangle、xmltodict等第三方库。爬虫工具在爬虫工具中,学习使用Chrome或FireFox浏览器来审查元素、跟踪请求信息等。现在大多数网站都有URL,可供应用程序和移动浏览器访问。先用这些接口相对容易一些。还有就是Fiddler等代理工具的使用。入门爬虫,没必要学正则表达式。当你真正需要它们时,你可以学习它们。比如你把数据爬回来之后,你需要清洗数据。当你搞不定的时候,这时候可以试着去理解正则表达式,往往能起到事半功倍的效果。Python的re模块可以用来处理正则表达式。这里也推荐一个教程:Python正则表达式指南https://img.ydisp.cn/news/20220912/0lejzkqwruy.html数据清洗数据清洗后会持久化存储。可以使用文件存储,比如CSV文件,也可以使用数据库存储,比如简单用的SQLite,专业用的MySQL,或者分布式文档数据库MongoDB。这些数据库对Python非常友好,有现成的库支持。您需要做的就是熟悉如何使用这些API。进阶之路经历了从数据抓取到清洗到存储的基本过程,算是基本入门了。接下来就是考验你的内功了。许多网站都有反爬虫策略。他们极力阻止你使用非正常方式获取数据,比如各种奇怪的验证码来限制你的请求操作,限制请求速度,限制IP,甚至加密数据。简而言之,就是增加获取数据的成本。这时候,你需要掌握更多的知识。你需要深入了解HTTP协议,你需要了解常见的加解密算法,你需要了解HTTP中的cookies,HTTP代理,HTTP中的各种HEADER。爬虫和反爬虫是相爱相杀的一对。如何对付反爬虫并没有一个统一的解决方案,这取决于你的经验和掌握的知识体系。这可不是仅仅21天的入门教程就能达到的高度。进行大规模爬取,我们通常从一个URL开始爬取,然后将页面中解析出的URL链接添加到待爬取的URL集合中。我们需要使用队列或者优先级队列来区分先爬和后爬一些网站。.每次爬取一个页面,是使用深度优先还是广度优先算法爬取下一个链接。每次发起网络请求,都会涉及到一个DNS解析过程(将URL转换为IP)。为了避免重复的DNS解析,我们需要缓存解析出的IP。URL那么多,如何判断哪些URL已经被抓取,哪些还没有被抓取,简单点就是用字典结构来存储已经抓取到的URL,但是如果遇到大量的URL,字典占用的内存空间非常大,这时候就需要考虑使用BloomFilter,一个线程一个一个地爬取数据。效率低得可怜。如果要提高爬虫的效率,应该使用多线程、多进程或协程,还是分布式运行?都需要反复练习。