爬虫技术入门:从基本概念到实战开发
爬虫技术入门:从基本概念到实战开发
爬虫技术是大数据和人工智能时代不可或缺的工具,它可以帮助我们从互联网上获取大量有价值的数据。本文将从爬虫的基本概念、应用场景、技术细节等多个维度,为您全面解析爬虫技术的核心原理和实践方法。
什么是爬虫
网络爬虫(又称为网页蜘蛛,网络机器人,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。本质上来说,爬虫就是模拟客户端发起请求并接收响应;原则上只要是在浏览器上能够看到的数据都是可以爬取的。
为什么要学习爬虫
在当今互联网时代,大数据,人工智能离我们越来越近,很多公司都在开展相关部分,但无论是大数据还是人工智能,都有一个非常重要的部分,那就是数据,但是数据又是从上面地方来呢?当我们所需要的数据量越来越大的时候,又该如何减少繁琐的数据获取工作呢?
来看一下这个微博指数的例子,通过上方图片我们可以发现,它是对微博上面用户的微博和评论进行提取,然后统计热搜关键词,统计出来后将流行趋势进行展示。类似这种网站其实是比较多的,比如百度指数、搜狗指数、阿里指数等,这些大平台用户量是非常庞大的,因此他们能够获取自己的用户数据进行统计分析。
那么就出现了一个问题,大平台有自己数据平台,那么一些中型企业或者个人并没有这么大的用户量,那么又该如何?这些数据又该从何而来呢?
数据的来源
- 企业用户产生的数据
比如用户在日常生活中浏览网页,使用app或者小程序时,产生的用户数据,如注册时的用户名、密码、姓名、手机号、身份证号等等,还有上文提到的微博,评论,以及微信发布的朋友圈等等都是企业用户所产生的数据。 - 第三方数据平台购买数据
企查查以及其他第三方平台 - 公开数据
国家统计局 - 数据管理咨询公司
- 爬虫爬取网络数据
这几种方式中第一种方式是企业内部数据,不会直接进行公开,第二种和第四种是需要花钱购买,对于咱白嫖的很不友好,第三种公开数据虽然免费,但是数据质量不高,所以获取数据的最佳途径就是通过爬取。
数据可以用来干什么
- 市场分析:企业可以通过爬取竞争对手的网站、消费者评论以及市场趋势信息,来进行市场分析,从而优化自身的产品和营销策略。
- 趋势预测:通过收集社交媒体数据、新闻文章等信息,可以分析公众情绪和趋势,为未来的决策提供依据。
- 学术研究:研究人员可以爬取大量数据以支持其研究,获取特定领域的资料或进行数据挖掘。
- 价格监控:电商平台和零售商可以爬取竞争对手的价格,监控市场动态,从而调整自己的定价策略。
- 内容聚合:聚合网站可以爬取多个来源的数据,通过汇总相关信息提供给用户,便于用户获取信息。
- 数据清洗与训练模型:在机器学习和人工智能领域,爬取的数据可以用于构建训练集,以此训练模型来提高预测精度。
- SEO优化:通过分析其他网站的关键词和流量数据,网站管理员可以改进自己网站的搜索引擎优化(SEO)策略。
爬虫的分类
爬虫分为通用爬虫与聚焦爬虫。通用爬虫是将整个网页下载到本地,形成一个互联网内容的镜像备份;聚焦爬虫是在实施网页抓取的时候会对内容进行处理筛选,尽量只获取与需求相关的数据。通用爬虫是具有非常大的局限性的,大多数情况下,网页中百分之95%的内容对用户来说都是无用的,如果将整个网页都下载下来,就会显得很多余。其次,现在的网页当中是存在图片、音乐或者视频的,通用爬虫对这些数据无能为力,不能较好的去处理获取这些数据。针对这些情况,导致通用爬虫难以发展,聚焦爬虫得到了广泛的应用,目前市面上的爬虫几乎都是聚焦爬虫。
爬虫不能做的事情
- 法律合规:在很多国家和地区,未经允许爬取网站数据可能违反法律法规,例如违反《著作权法》和《计算机 fraud and abuse act》。爬虫使用者需确保其行为合法。
- 网站协议:许多网站在其“robots.txt”文件中明确规定了允许或禁止爬取的规则,爬虫必须遵循这些规则,尊重网站的使用条款。
- 道德规范:即使法律上不禁止,爬虫的使用也应遵循道德规范,避免对网站造成负担,确保不会影响用户体验或服务的正常运行。
- 数据隐私:涉及个人数据的爬取必须遵守相关的数据保护法律,例如GDPR等,确保不侵犯用户隐私。
- 频率限制:过于频繁的请求可能会导致目标网站的服务器崩溃或封禁,因此需要合理控制爬取的频率。
- robots协议。规定了哪些数据能爬哪些数据不能爬。又名为君子协议,是一条不成文的规定,没有法律效应也没有强制作用。想要查看网站的robots协议只需要在该网站域名后面跟上robots.txt即可。
爬虫应该怎么写
明确目标
明确目标主要是需要明确所需要爬取的网站的 url (网址,路由,也叫统一资源定位符)(用于完整的描述internet网页和其他资源地址的一种标识方法。)以python官网首页url为例: https://docs.python.org/zh-cn/3/tutorial/index.html , https 为协议,后面的 docs.python.org 为python官网的域名 zh-cn/3/tutorial/in dex.html 为路由。可能大家在平时浏览网页的过程中也看到过 http 形式的协议,那这两种分别是什么东西,又都有什么不同的地方呢?
HTTP与HTTPS
HTTP:超文本传输协议,是一种用于分布式、协作式和超媒体信息系统的应用层协议。简单来说就是接收和发布HTML页面的方法,用于web浏览器和网站服务器之间传递信息。默认工作在TCP协议端口为80端口,以http://开头的网站都是使用的HTTP协议。HTTP协议以明文的方式进行发送,不对内容进行加密,如若被攻击者截取了浏览器与网站服务器之间的传输报文,就能够直接读取其中的信息。因此HTTP协议不适合用于传输敏感信息。
HTTPS:超文本传输安全协议,是一种透过计算机网络进行安全传输的协议,HTTPS经由HTTP进行通信,但是利用了SSL/TLS来加密数据包。HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。默认工作在TCP协议443端口。
这2个的区别:
域名
(以下解释来源于百度百科)域名(英语:Domain Name),又称网域,是由一串用点分隔的名字组成的internet上某一台计算机或计算机组的名称,用于在数据传输时对计算机的定位标识(有时也指地理位置)。由于IP地址具有不方便记忆并且不能显示地址组织的名称和性质等缺点,人们设计出了域名,并通过网域名称系统(DNS,Domain Name System)来将域名和IP地址相互映射,使人更方便地访问互联网,而不必去记住能够被机器直接读取的IP地址数串。
特点:独一无二,不可重复。
路由
路由(routing)是指分组从源到目的地时,决定端到端路径的网络范围的进程。
浏览网页的基本流程
比如我们在浏览器地址栏输入:https://www.baidu.com,回车后会浏览器会显示百度的首页。这是一个发起请求获取响应的过程,这段过程发生了以下四个步骤:
a. 浏览器通过 DNS服务器 查找域名对应的 IP地址;
b. 向 IP地址 对应的 Web服务器 发送请求;
c. Web服务器 响应请求,发回 HTML页面;
d. 浏览器解析 HTML内容,并显示出来。
DNS服务器:DNS是计算机域名系统 (Domain Name System 或Domain Name Service) 的缩写,由解析器和域名服务器组成的。域名服务器是指保存有该网络中所有主机的域名和对应IP地址,并具有将域名转换为IP地址功能的服务器。一个域名必须对应一个IP地址,而一个IP地址不一定会有域名。
爬取数据
发起请求
发起请求 (当用户在浏览器的地址栏中输入一个URL地址并按回车键之后,浏览器会向HTTP服务器发送HTTP请求)。http请求方式主要有两种:get请求与post请求。比如我们在浏览器中输入一个关键词回车进行搜索,这个请求就是一个get请求。那一般post请求在什么地方会用到呢,举一个最常见的例子,各位在登录账号的时候,输入账号或者用户名邮箱手机号等等,再输入密码,点击登录,这个登录请求就是一个post请求。这两种请求方式最直观的区别就是,get请求会把参数以明文的形式显示出来,而post请求则不会讲明文显示。
get请求与post请求的区别:
请求头是HTTP请求中的一种标头,它由关键字/值对组成,用英文冒号“:”分隔。请求头用于说明请求的来源、类型、条件、喜好、能力等信息,以便服务器根据客户端的情况提供更好的响应。请求头包含请求时的头部信息,请求头可能包含的字段有Accept、Host、User-Agent、Authorization等,请求头部信息是可以相信的。
请求体是客户端发送给API的数据,它是HTTP请求报文的一部分,可以通过不同的请求方法(如GET、POST等)和格式(如键值对、JSON等)编码。请求体和请求URL都可以传递请求参数。
获取响应
响应状态:HTTP状态码(响应码)是用来表示HTTP请求是否已经完成,HTTP状态类型一个分为五大类“消息响应、成功响应、重定响应、客户端错误”,所有状态码第一个数字代表了响应的五种状态之一。
响应头是一种 HTTP 标头,其可以用于 HTTP 响应,且与响应消息主体无关。被用于提供更详细的响应上下文。就是服务器告诉我们的信息,比如内容,内容长度,服务器信息等。响应头是不可信的。响应体就是请求内容的资源内容,如果网页的HTML。
取存数据
一般对一个网页的请求url发起请求,获取到响应数据会是一个HTML,倘若目标数据在该HTML结构中,还需要对响应数据进行数据解析。解析方式有多种:正则解析,bs4解析,Xpath解析以及针对 json数据的jsonpath解析;这些方式在之后都会讲到的,讲到了再详细解释。包括数据存储,数据存储可以按照数据类型保存为该类型的本地文件,如文本数据的txt,json格式的json文件,图片数据的jpg、png等格式,音频的m4a、mp3格式,视频的ts、MP4等格式。数据还可以保存到excel表格,数据库 (mysql、mongodb、redis)中。取存数据本文先不赘述,后续文档中再对上文提到的方式一一进行细致讲解。
开发者工具(重点)
每一个现代网络浏览器都包含一套强大的开发工具套件。这些工具可以检查当前加载的 HTML、CSS 和 JavaScript,显示每个资源页面的请求以及载入所花费的时间,以及其他功能。
调出开发者工具
如何调出浏览器开发者工具呢?这里提供三种方式:
a. F12键(笔记本键有的是Fn + F12);
b. 快捷键 Ctrl + Shift + I(也就是i);
c. 右键后点击选项栏里面的检查选项(360浏览器为审查元素(N))。
开发者工具最常用的四大功能选项卡
ELements(元素)、Console(控制台)、Sources(源代码),Network(网络)。
Elements(元素):这里显示的是整个网页页面的HTML结构,能够查看页面里的所有元素,还能查看修改元素的属性以及查看修改css属性、监听事件,下DOM断点等等。很多人会有一个误区,都以为对页面请求url发起请求拿到的响应数据结构会和Elements内的结构相同,其实大多数都是不同的,Elements内的数据是所有的文件加载渲染后的结构,而响应的结构就只是单个页面的响应结构,所以这一点是点区分开的。
Console(控制台):这里可以执行js代码以及查看js对象与其属性,页面加载的js代码输出的日志信息也会在这里显示,以及js运行过程中的bug报错信息也会显示在这里。
Sources(源代码):查看源文件,在源代码中可以查看当前网页所有的文件,如js、html、css、图片等。除了查看文件功能之外,此处还能够新建脚本以浏览器环境运行脚本,以及下断点,查看断点信息,跟栈等功能。
Network(网络):该选项卡是爬虫开发过程中最常用到的一个选项卡。
保留日志:勾选上每次刷新不会清空前一次的请求,不勾选每次请求都会刷新清空上次的请求(一般勾选)。
禁用缓存:勾选每次就会重新请求服务器得到资源,不勾选是拿内存中已经缓存的资源,不会再去请求服务器有有一些不会进行网络请求(必须勾选)。随便点击一个数据包会弹出如下界面,头部信息包含数据包的一些常规信息(请求url、请求方式、状态码、远程地址、引⽤站点策略),响应头与请求头信息
常见的请求报头
Host (主机和端口号):对应网址URL中的Web名称和端口号,用于指定被请求资源的Internet主机和端口号,通常属于URL的Host部分;
User-Agent (浏览器名称):标识客户端身份的名称,通常页面会根据不同的User-Agent信息自动做出适配,甚至返回不同的响应内容。
Accept(传输文件类型) :指浏览器或其他客户端可以接受的MIME(Multipurpose Internet Mail Extensions(多用途互联网邮件扩展))文件类型,服务器可以根据它判断并返回适当的文件格式;
Referer (页面跳转来源):表明产生请求的页面来自于哪个URL,用户是从该 Referer页面访问到当前请求的页面。这个属性可以用来跟踪Web请求来自哪个页面,是从什么网站来的等;
Accept-Encoding(文件编解码格式):指出浏览器可以接受的编码方式。编码方式不同于文件格式,它是为了压缩文件并加速文件传递速度。浏览器在接收到Web响应之后先解码,然后再检查文件格式,许多情形下这可以减少大量的下载时间;
Accept-Language(语言种类):指出浏览器可以接受的语种种类,如en或en-us指英语,zh或者zh-cn指中文,当服务器能够提供一种以上的语种版本时要用来到;
Accept-Charset(字符编码):指出浏览器可以接受的字符编码;
Cookie:浏览器用这个属性向服务器发送Cookie。Cookie是在浏览器中寄存的小型数据体,它可以记载和服务器相关的用户信息,也可以用来实现模拟登陆,之后会详细讲。
常见的响应报头
Cache-Control:这个值告诉客户端,服务端不希望客户端缓存资源,在下次请求资源时,必须要从新请求服务器,不能从缓存副本中获取资源;
Content-Encoding:gzip:告诉客户端,服务端发送的资源是采用gzip编码的,客户端看到这个信息后,应该采用gzip对资源进行解码;
Content-Type:text/html;charset=UTF-8:资源文件的类型,还有字符编码,客户端通过utf-8对资源进行解码,然后对资源进行html解析。通常我们会看到有些网站是乱码的,往往就是服务器端没有返回正确的编码;
Date:Sun, 21 Sep 2016 06:18:21 GMT:这个是服务端发送资源时的服务器时间,GMT是格林尼治所在地的标准时间。http协议中发送的时间都是GMT的,这主要是解决在互联网上,不同时区在相互请求资源的时候,时间混乱问题;
Server:Tengine/1.4.6:这个是服务器和相对应的版本,只是告诉客户端服务器的信息。