爬虫基础知识详解

通用爬虫与聚焦爬虫

根据使用场景,网络爬虫可分为 通用爬虫 和 聚焦爬虫 两种。
通用网络爬虫 是捜索引擎抓取系统(Baidu、Google、Yahoo等)的重要组成部分。主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份。

通用搜索引擎(Search Engine)工作原理:
利用通用网络爬虫从互联网中搜集网页,采集信息,这些网页信息用于为搜索引擎建立索引从而提供支持,它决定着整个引擎系统的内容是否丰富,信息是否即时,因此其性能的优劣直接影响着搜索引擎的效果。
通用爬虫的基本工作流程:
在这里插入图片描述

那么搜索引擎如何获取一个新网站的URL:

  1. 新网站向搜索引擎主动提交网址;
  2. 在其他网站上设置新网站外链;
  3. 和DNS解析服务商(如DNSPod等)合作,新网站域名将被迅速抓取。

爬虫限制
搜索引擎蜘蛛的爬行是被输入了一定的规则的,它需要遵从一些命令或文件的内容。

  1. rel=“nofollow”,告诉搜索引擎爬虫无需抓取目标页,同时告诉搜索引擎无需将的当前页的Pagerank传递到目标页。
  2. Robots协议(也叫爬虫协议、机器人协议等),全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。

通用爬虫局限性

  1. 大多情况下,网页里90%的内容对用户来说都是无用的。
  2. 搜索引擎无法提供针对具体某个用户的搜索结果。
  3. 图片、数据库、音频、视频多媒体等不能很好地发现和获取。
  4. 基于关键字的检索,难以支持根据语义信息提出的查询,无法准确理解用户的具体需求。

聚焦爬虫
聚焦爬虫,是“面向特定主题需求”的一种网络爬虫程序,它与通用搜索引擎爬虫的区别在于:聚焦爬虫在实施网页抓取时会对内容进行处理筛选,尽量保证只抓取与需求相关的网页信息。
我们一般所说的爬虫就是指聚焦爬虫。

HTTP和HTTPS

HTTP协议-80端口
HyperTextTransferProtocol,超文本传输协议是一种发布和接收HTML页面的方法。
HTTPS-443端口
HypertextTransferProtocoloverSecureSocketLayer, 简单讲是HTTP的安全版,在HTTP下加入SSL 层。

网络爬虫抓取过程可以理解为模拟浏览器操作的过程。
在这里插入图片描述
浏览器发送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
URL(Uniform/UniversalResourceLocator的缩写):统一资源定位符,是用于完整地描述Internet上网页和其他资源的地址的一种标识方法。
基本格式: scheme://host[:port#]/path/…/[?query-string][#anchor]

客户端HTTP请求

客户端发送一个HTTP请求到服务器的请求消息,包括以下格式:

在这里插入图片描述
例如一个完整的请求报文协议如下:
在这里插入图片描述
请求方法Method

根据HTTP标准,HTTP请求可以使用多种请求方法:

  • HTTP0.9:只有基本的文本GET功能。
  • HTTP1.0:完善的请求/响应模型,并将协议补充完整,定义了三种请求方法:GET,POST和HEAD方法。
  • HTTP1.1:在1.0基础上进行更新,新增了五种请求方法:OPTIONS,PUT,DELETE,TRACE和CONNECT方法。

总结如下:
在这里插入图片描述
Get 和 Post 详解

  • GET是从服务器上获取数据,POST是向服务器传送数据
  • GET请求参数显示,都显示在浏览器网址上,即“Get”请求的参数是URL的一部分。
  • POST请求参数在请求体当中,消息长度没有限制而且以隐式的方式进行发送,通常用来向HTTP服务器提交量比较大的数据(比如请求中包含许多参数或者文件上传操作等),请求的参数包含在“Content-Type”消息头里,指明该消息体的媒体类型和编码。

常用的请求报头
Host:主机和端口号
Connection :客户端与服务连接类型, 默认为keep-alive
User-Agent : 客户浏览器的名称
Accept : 浏览器或其他客户端可以接受的MIME文件类型
在这里插入图片描述
Referer :表明产生请求的网页来自于哪个URL
Accept-Encoding :指出浏览器可以接受的编码方式。
Accept-Language :语言种类
Accept-Charse t: 字符编码
常见的字符编码:
在这里插入图片描述
Cookie :浏览器用这个属性向服务器发送Cookie
Content-Type :POST请求里用来表示的内容类型。

HTTP响应

HTTP响应由四个部分组成,分别是: 状态行 、 消息报头 、 空行 、 响应正文。 如下所示:

在这里插入图片描述
响应状态码
一般以第一个数字的不同代表不同的状态,如下:
在这里插入图片描述
常见状态码:
200: 请求成功
302:请求页面临时转移至新url
307和304: 使用缓存资源
404: 服务器无法找到请求页面
403: 服务器拒绝访问,权限不够
500: 服务器遇到不可预知的情况

Cookie和Session
服务器和客户端的交互仅限于请求/响应过程,结束之后便断开,在下一次请求时,服务器会认为新的客户端。为了维护他们之间的链接,让服务器知道这是前一个用户发送的请求,必须在一个地方保存客户端的信息。

  • Cookie:通过在客户端记录的信息确定用户的身份。
  • Session:通过在服务器端记录的信息确定用户的身份。

requests请求方法详解

requests请求有四种方法,它们分别是:get、post、put和delete。

get方法
get方法可以获得页面的相应内容,其中的text属性是得到文本类型的内容,content属性是得到二进制类型的内容,还有一个json得到的是json字符串, 转成python可以识别的字典。
可以用代码具体看一下它们的内容,代码如下:

# GET
import requests

url = 'http://www.baidu.com'
response = requests.get(url)
print(response.text)  # 文本
print(response.content)# 二进制
# print(response.json())  # 返回的是json字符串, 转成python可以识别的字典;

输出如下:
在这里插入图片描述
post方法
测试代码如下:

import requests
# POST
url = 'http://httpbin.org/post'  # 专门用来测试post方法的网站
response = requests.post(url, data={'name':'xiaoming', 'age':10})
print(response.text)

返回的是:
在这里插入图片描述
可以看到页面会返回一个发送的信息表单。

put方法
测试代码如下:

import requests
# PUT
url = 'http://httpbin.org/put'  # 专门用来测试post方法的网站
response = requests.put(url, data={'name':'xiaoming', 'age':10})
response = requests.put(url, data={'name':'zhihu'})
print(response.text)

返回的内容是:
在这里插入图片描述
可以看到后一个传输的数据会把前面的数据覆盖掉。

delete方法
测试代码如下:

import requests
# DELETE
url = 'http://httpbin.org/delete'
response = requests.delete(url, data={'name':'xiaoming', 'age':10})
print(response.text)

返回的内容是:
在这里插入图片描述
url解析
我们可以通过requests修改url的属性内容,从而可以获得我们想要获取到的页面。
例如,我们打开一个页面,如下:
在这里插入图片描述
我们对其修改url属性,获取我们想要的页面内容,代码如下:

import requests
url = 'https://movie.douban.com/subject/26794435/photos'
params = {
    'type': 'R',
    'start': 90,
    'sortby': 'like',
    'subtype': 'a'
}
response = requests.get(url, params=params)
with open('douban.html', 'wb') as f:
    f.write(response.content)

运行之后,就得到了我们想要的内容了:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值