Python爬虫学习笔记(一):从robots协议开始

Python爬虫学习笔记(一):从robots协议开始

一.关于爬虫和robots协议

网络爬虫:一种按照一定的规则,自动地抓取万维网信息的程序或者脚本
通用网络爬虫:捜索引擎抓取系统的重要组成部分,主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份

聚焦网络爬虫:针对某一特定领域的数据进行抓取的程序,在实施网页抓取时会对内容进行处理筛选,尽量只抓取与需求相关的网页信息

robots协议

网络爬虫排除标准:Robots Exclusion Protocol

网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取

robots.txt协议是存放于网站根目录下的ASCII编码的文本文件,告诉对应的爬虫被允许的权限

robots.txt语法

允许所有SE(搜索引擎)收录本站:robots.txt为空
禁止所有SE(搜索引擎)收录网站的某些目录:

User-agent: *
Disallow: /目录名1/
Disallow: /目录名2/
禁止某个SE(搜索引擎)收录本站:

User-agent: 禁止的SE的名称
Disallow: /
禁止所有SE(搜索引擎)收录本站:

User-agent: *
Disallow: /
禁止抓取图片

User-agent: *

Disallow: .jpg$ # jpg可以代替为gif,png 等

二.HTTP,HTTPS协议

URL

统一资源定位符:Uniform Resource Locato

互联网上标准资源的地址,用于完整地描述Internet上网页和资源的地址的一种标识方法
基本格式:scheme://host[:port#]/path/…/[?query-string][#anchor]

[]为可选参数
scheme:模式/协议(http, https, ftp等)
host:服务器的IP地址或域名
port:服务器的端口(默认端口80)
path:访问资源的路径
query-string:发送给http服务器的数据
anchor:跳转到网页的指定锚点位置

HTTP协议,HTTPS协议

HTTP协议(HyperText Transfer Protocol,超文本传输协议)

发布和接收 HTML页面的方法,应用层的协议,无连接(每次连接只处理一个请求),无状态(协议对处理没有记忆能力,每次连接传输都是独立的),端口号为80
HTTPS协议(Hypertext Transfer Protocol over Secure Socket Layer,超文本传输安全协议)

在HTTP下加入SSL层,HTTPS = HTTP+SSL(Secure Sockets Layer 安全套接层)

用于Web的安全传输协议,在传输层对网络连接进行加密,保障在Internet上数据传输的安全,端口号为443

HTTP请求方法

GET

从指定资源中请求数据,只是检索数据,不应对数据产生其他影响

GET请求可以缓存,请求有长度限制,仅用于请求数据,传输过程不够安全,在处理敏感数据时,不可以使用GET请求
POST

将数据发送到服务器以创建或更新资源

POST请求不会被缓存,对数据长度没有限制,传输过程安全
HEAD

与GET方法相同,但没有响应体,仅传输状态行和标题部分
PUT

将数据发送到服务器以创建或更新资源,可以用上传的内容替换目标资源中的所有当前内容
DELETE

删除指定的资源,删除URL给出的目标资源的所有当前内容
CONNECT

建立到URL标识的服务器的隧道,通过简单的TCP/IP隧道更改请求连接,通常使用解码的HTTP代理来进行SSL编码的通信(HTTPS)
OPTIONS

描述目标资源的通信选项,返回服务器支持预定义URL的HTTP策略
TRACE

沿着目标资源的路径执行消息环回测试,回应收到的请求

User-Agent

User Agent:用户代理(UA)

一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等

Response响应的状态码

Response响应的状态码用来判断爬虫当前是否正常在运行

200为成功,300是跳转,400500意味着有错误

当出现异常错误时:
如果是500 那么爬虫会进入休眠状态,说明服务器已经宕机
如果是400 ,需要考虑爬虫的抓取策略的修改,可能是网站更新或爬虫被禁
常见的HTTP RESPONSE响应状态码

1xx:消息,代表请求已被接受,需要继续处理

2xx:成功,代表请求已成功被服务器接收并接受

3xx:重定向,代表需要客户端采取进一步的操作才能完成请求

4xx:请求错误,代表客户端可能发生了错误,妨碍了服务器的处理

5xx:服务器错误,代表了服务器在处理请求的过程中有错误或异常发生,也可能是服务器认为当前的资源无法完成对请求的处理

400: ('Bad Request', '客户端请求的语法错误,服务器无法理解')
401: ('Unauthorized', '请求要求用户的身份认证')
403: ('Forbidden', '服务器理解请求客户端的请求,但拒绝执行此请求')
404: ('Not Found', '服务器无法根据客户端的请求找到资源')
423: ('Locked', '当前资源被锁定')

500: ('Internal Server Error', '服务器内部错误,无法完成请求')
502: ('Bad Gateway', '作为网关或代理工作的服务器尝试执行请求时,从远程服务器接收到一个无效的响应')

HTTP响应报文

 Response       = Status-Line             ;
				*(( general-header        ; 
				| response-header         ; 
				| entity-header ) CRLF)   ; 
				CRLF
				[ message-body ]          ; 

响应行(12):1是报文协议及版本,2是状态码及描述

响应头(3):和请求头一样,由属性组成。

响应体(4):服务器返回给客户端的文本信息
HTTP响应报文属性

Cache-Control :响应输出到客户端后,服务端通过报文属性告诉客户端如何控制响应内容的缓存,默认为private

private:客户端可以缓存
public:客户端和代理服务器都可缓存
max-age=xxx:缓存的内容将在 xxx 秒后失效
no-cache:需要使用对比缓存来验证缓存数据
no-store:所有内容都不会缓存
Location:重定向redirect时,设置Location的属性跳转到该地址
Cookie:缓存信息

三. 准备工作

网站的分析

估算网站体量量级

在浏览器中输入site:要查询的网站 ,获得站点信息

通过搜索引擎来估算受到网站本身对搜索引擎爬虫的限制,及搜索引擎本身爬取数据技术的限制,这可以作为估算网站体量量级的一个经验值
网站的所有者

安装python-whois(Windows):pip install python-whois

import whois
print(whois.whois("http://www.scdn.net"))

网页地图sitemap

网络抓取工具通常会通过网站内部和其他网站上的链接查找网页

Sitemap提供数据以便允许支持Sitemap的抓取工具抓取 Sitemap 提供的所有网址,并了解使用相关元数据的网址

使用Sitemap协议方便网站管理员通知搜索引擎,网站上有哪些可供抓取的网页
网页地图的形式:

HTML:网站地图(sitemap)用户可以在网站上看到,列出网站上所有主要页面的链接的页面

XML:网站地图(Sitemap)由XML标签组成,文件本身是utf8编码,最简单的网站地图可以是一个纯文本件,只要列出页面的URL,一行列一个URL,搜索引擎就能抓取并理解文件内容

深度优先算法和广度优先算法

深度优先(Depth-First-Search):

搜索引擎先从网站页面上的某个链接进行抓取,进入到这个链接的页面之后,继续顺着当前页面上的这个链接下去,直到这个页面上的链接全部抓取完,再顺着第一个网站页面上的另外一个链接进行抓取
深度优先
广度优先(Breadth-First Search):

一层一层的,向下遍历,先把该层次的都遍历完,再继续往下

广度优先

  • 一般重要的网页距离入口站点的距离很近
  • 宽度优先有利于多爬虫并行进行合作
  • 深度与广度结合的方式来实现抓取策略:优先考虑广度,对深度进行限制最大深度

四.场景的简单应用

通用爬虫的流程:

1.设置站点、宽度及深度

2.记录所有url

3.用函数取得当前url的内容以及所有的外链

4.递归调用这个函数,进行遍历网站

5.错误处理及日志记录
urllib 库,是 Python 内置的 HTTP 请求库,包含四个模块:

1.request:最基本的 HTTP 请求模块,来模拟发送请求
2.error :异常处理模块,使程序不会意外终止
3.parse :工具模块,提供了许多 URL 处理方法(分、解析、合并等)
4.robotparser:用来识别网站的 robots.txt 文件

安装模块(Windows):pip install requests
import requests

url = 'https://www.csdn.net/'
response = requests.get(url=url) #HTTP请求方法:get
print(response)  # 返回Response响应的状态码

<Response [200]> # 返回Response响应的状态码
import requests

url = 'http://jandan.net/'
response = requests.get(url=url) #HTTP请求方法:get
test = response.text # .text 返回字符串类型的相应数据
with open ('./jiandan.html','w',encoding='utf-8') as fi:
	fi.write(test) #将爬取到的信息进行存储 
print(test)
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值