一、为什么要做爬虫
近几年,“大数据”、“云计算”等新词汇应运而生,称为计算机行业的一大热门,那么海量数据是怎样获得的?(获取数据有哪些方式?分别举例)
1、企业产生的用户数据
百度指数、阿里指数
2、数据平台购买数据:
数据堂、国云数据市场】贵阳大数据交易所
3、政府/机构公开的数据:
国家统计局数据、世界银行公开数据
4、数据管理咨询公司:
麦肯锡、埃森哲、艾瑞咨询
5、爬取网络数据:
爬虫技术在技术基础上能获取网络数据。
二、爬虫是什么
(一)、定义
网络爬虫是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。
简单地说:就是用事先写好的程序去抓取网络上所需的数据,这样的程序就叫网络爬虫。
(二)、爬虫分类
1 、通用爬虫(了解)
从互联网中搜集网页,采集信息,这些网页信息用于为搜索引擎建立索引从而提供支持,它决定着整个引擎系统的内容是否丰富,信息是否即时,因此其性能的优劣直接影响着搜索引擎的效果。
2 、聚焦爬虫
聚焦爬虫在实施网页抓取时会对内容进行处理筛选,尽量保证只抓取与需求相关的网页信息
三、http基础
(一)、浏览器请求http的过程
1、当用户在浏览器的地址栏中输入一个URL并按回车键之后,浏览器会向http服务器发送http请求。http请求主要分为“Get”和“Post”两种方法。
2、当我们在浏览器输入URL :http://www.baidu.com的时候,浏览器发送一个Request请求去获取 http://www.baidu.com的html文件,服务器把Response文件对象发送回给浏览器。
3、浏览器分析Response中的 HTML,发现其中引用了很多其他文件,比如Images文件,CSS文件,JS文件。浏览器会自动再次发送Request去获取图片,CSS文件,或者JS文件。
4、当所有的文件都下载成功后,网页会根据HTML语法结构,完整的显示出来了。
(二)、URL 统一资源定位符
统一资源定位符,是用于完整地描述 Internet 上网页和其他资源的地址的一种标识方法。
比如百度搜索路由:https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&rsv_idx=1&tn=baidu.
基本格式:scheme://host[:port#]/path/…/[?query-string][#anchor]
①scheme:协议(例如:http, http, ftp)
②host:服务器的 IP 地址或者域名
③port:服务器的端口(如果是走协议默认端口,缺省端口 80)
④path:访问资源的路径
⑤query-string:参数,发送给 http 服务器的数据
⑥anchor:锚(跳转到网页的指定锚点位置)
(三)、客户端 http 请求
URL 只是标识资源的位置,而 http 是用来提交和获取资源
请求格式,由四部分组成:请求行、请求头部、空行、请求数据
(四)、get请求和post请求的区别
1、get:获取,从服务器获取数据。—获取什么(可以通过参数取告诉服务)—请求参数是拼接的url里面的—不安全和大小受限的缺陷。
2、post:提交,向服务器传递数据。—提交数据放在客户端请求的请求数据的位置。----更安全了而且大小是不受限的。
四、requests 模块 get 请求
(一)、爬虫基本流程:
1、导入requests包
2、准备url
两种方式:
①使用params属性:base_url = ‘?之前的路由’
②直接拼接的:base_url = ‘在需要修改的部分替换为%s’(最常用)
3、准备参数
参数以字典形式进行储存
get请求:①headers请求头,一般有浏览器标识:User-Agent②params,请求参数
post请求:①headers请求头,User-Agent、‘x-requested-with’: ‘XMLHttpRequest’异步必备、‘Content-Length’、 ‘Content-Type’。②data,提交的数据
4、发送请求获取响应
get请求:response = requests.get(base_url, headers=headers, params=params)
post请求:response = requests.post(base_url, headers=headers, data=data)
5、get获取页面
写入文件 with 上下文管理器
with open(f’{dirname}/{page}.html’, ‘w’, encoding=‘utf-8’) as fp:
fp.write(response.content.decode(encoding=‘utf-8’))
post获取数据
post获得的数据为json格式,想要使用requests模块自带的json()方法转换为字典、列表格式
response.json()
(二)、文本数据有哪两种格式?
字符串响应正文:response.text获取,response.text是通过response.encoding这个属性设置的值来进行编程字符串,response.encoding是通过requests模块自动识别的。(基本识别都是对的)
bytes响应正文:response.content得到二进制数据,response.content.decode(encoding=‘utf-8’),可将获取的二进制数据编码为中文适应的’utf-8‘格式。
实践案例可参考下文:第一讲案例
https://blog.csdn.net/lxd1908717401/article/details/107215863