小白必学的爬虫基础
Posted ZSYL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小白必学的爬虫基础相关的知识,希望对你有一定的参考价值。
爬虫基础知识
请参考:小白必学的爬虫基础
网络爬虫
定义:一个程序脚本,可以自动地抓取互联网上信息的脚本。
爬虫可以解决的问题
- 解决冷启动问题
- 搜索引擎的根基,做搜索引擎少不了爬虫
- 建立知识图谱,帮助建立机器学习知识图谱
- 可以制作各种商品的比价软件、趋势分析
知识图谱 相关内容请关注我的专栏
爬虫工程师的进阶之路
初级爬虫工程师
- web 前端的知识: html、CSS、JavaSc1ipt、 DOM、 DHTML 、Ajax、jQuery、json 等
- 正则表达式, 能提取正常一般网页中想要的信息,比如某些特殊的文字, 链接信息, 知道什么是懒惰, 什么是贪婪型的正则
- 会使用 XPath 等获取一些DOM 结构中的节点信息
- 知道什么是深度优先, 广度优先的抓取算法, 及实践中的使用规则
- 能分析简单网站的结构, 会使用urllib或requests库进行简单的数据抓取
中级爬虫工程师
- 了解什么是HASH,会简单地使用MD5,SHA1等算法对数据进行HASH一遍存储
- 熟悉HTTP,HTTPS协议的基础知识,了解GET,POST方法,了解HTTP头中的信息,包括返回状态码,编码,user-agent,cookie,session等
- 能设置user-agent进行数据爬取,设置代理等
- 知道什么是Request,什么是response,会使用Fiddler等工具抓取及分析简单地网络数据包;对于动态爬虫,要学会分析ajax请求,模拟制造post数据包请求,抓取客户端session等信息,对于一些简单的网站,能够通过模拟数据包进行自动登录。
- 对于一些难搞定的网站学会使用phantomjs+selenium抓取一些动态网页信息
- 并发下载,通过并行下载加速数据爬取;多线程的使用。
高级爬虫工程师
- 能够使用Tesseract,百度AI,HOG+SVM,CNN等库进行验证码识别。
- 能使用数据挖掘技术,分类算法等避免死链。
- 会使用常用的数据库进行数据存储,查询。比如mongoDB,redis;学习如何通过缓存避免重复下载的问题。
- 能够使用机器学习的技术动态调整爬虫的爬取策略,从而避免被禁IP封禁等。
- 能使用一些开源框架scrapy,scrapy-redis等分布式爬虫,能部署掌控分布式爬虫进行大规模数据爬取。
搜索引擎
搜索引擎的主要组成
通用爬虫:就是将互联网上的页面整体的爬取下来之后,保存到本地
通用爬虫想要爬取页面,需要页面的url,但是搜索引擎是可以搜索所有网页的。那么通用爬虫url就要涉及到所有网页。这个“所有”是如何做到的?
- 新网站向搜索引擎主动提交地址
- 在其他网页上设置新网站链接
- 搜索引擎和DNS解析服务商(比如DNSPod等)合作,新网站域名将被快速抓取
搜索引擎的工作流程
第一步:抓取网页
通过将待爬取的url
加入到通用爬虫的url队列中,进行页面内容的爬取。
第二步:数据存储
将爬取下来的网页保存到本地,这个过程中会有一定的去重操作。如果某个网页的内容大部分重复,搜索引擎可能不会保存。
第三步:预处理
- 提取文字
- 中文分词
- 消除噪音(比如版权声明文字、导航条、广告等)
- 索引处理
第四步:提供检索服务,网站排名
搜索引擎的局限性
- 搜索引擎只能爬取原网页,但是页面90%的内容都是无用的
- 搜索引擎不能满足不同行业,不同领域,不同背景的特定需求
- 通用搜索引擎只能爬取文字信息,对于视频,文件,音频等其他信息无法爬取
- 只能基于关键字查询,无法基于语义查询
聚焦爬虫
聚焦爬虫在实施网页抓取是会对内容进行处理筛选,尽量保证只抓取与需求相关的网页信息。
爬虫准备工作
robots协议
robots协议也叫robots.txt(统一小写)是一种存放于网站根目录下的ASCII编码的文本文件,它通常告诉网络搜索引擎的漫游器(又称网络蜘蛛),此网站中的哪些内容是不应被搜索引擎的漫游器获取的,哪些是可以被漫游器获取的。因为一些系统中的URL是大小写敏感的,所以robots.txt的文件名应统一为小写。robots.txt应放置于网站的根目录下。如果想单独定义搜索引擎的漫游器访问子目录时的行为,那么可以将自定的设置合并到根目录下的robots.txt,或者使用robots元数据(Metadata,又称元数据)。
robots协议并不是一个规范,而只是约定俗成的,所以并不能保证网站的隐私。
------百度百科
定义:网络爬虫排除标准
作用:告诉搜索引擎哪些可以爬取,哪些不可以爬取
https://www.taobao.com/robots.txt
sitemap–网站地图
网站地图,又叫站点地图,它就是一个列出了你网站上所有页面地址的清单文件,一般来说分为2种,一种是给搜索引擎看的,一种是给用户看的,前者帮助搜索引擎更好地收录你的网站,后者帮助用户更好的了解你的网站整体结构、更快的找到他们想要找的内容。
sitemap一般有3种格式,txt、xml、html,绝大部分情况下都是用xml格式,百度、谷歌都是支持xml格式。
就是一个网站地图,可以指导我们查看哪些网页下有哪些内容
https://help.bj.cn/
估算网页的大小
在百度中输入:site:
目标网站的地址
识别网站使用了何种技术
为了更好的了解网站,抓取该网站的信息,我们可以先了解一下该网站大致所使用的的技术架构。
寻找网站的所有者
有时候,我们需要知道网站的所有者是谁,这里在技术上有个简单地方法可以参考:
安装python-whois:pip install python-whois
import whois
whois.whois(‘http://www.sina.com.cn’)
http和https协议
http协议
http(Hyper Text Transfer Protocol,HTTP):超文本传输协议
http 是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;而消息内容则具有一个类似MIME的格式。这个简单模型是早期Web成功的有功之臣,因为它使开发和部署非常地直截了当。
它是一个规范,约束发布和接收html页面的规范。
https (Hypertext Transfer Protocol over Secure Socket Layer)
简单讲是http的安全版,在http下加入SSL层
默认端口号
- http协议的端口号:80
- https协议的端口号:443
http请求的特点
- 是一个应用层协议
- 无连接
每次请求都是独立的
http1.1
增加了一个Connection:keep-alive,这个头表示,客户端和服务器的链接是一个长连接。 - 无状态
无状态表示客户端每次请求都不能记录请求状态。也就是两条请求之间无法进行通信。
cookie和session可以帮助记录状态。
统一资源定位符(url)
为什么可以通过url来定义互联网上的任意资源?
基本格式:
scheme://host[:port#]/path/…/[?query-string][#anchor]
- scheme:协议(例如:hhttp,https,ftp)
- host:服务器的IP地址或者域名,可以定位电脑
- port:端口号,用来从互联网上进入电脑
- path:资源路径,为了在电脑中找到对应的资源
- query-string:参数,发送给http服务器的数据
- anchor:锚(跳转到网页的指定锚点位置)
三种特殊符号
- ?:问号后面就是请求参数
- &:请求参数用&连接
- #:表示锚点,在请求这个url时,页面会跳入锚点的指定位置
解析url
from urllib import parse
url = 'http://localhost.com:8080/index.htm?username="zhangsan"&password="123"'
print(parse.urlparse(url))
结果:
ParseResult(
scheme='http',
netloc='localhost.com:8080',
path='/index.htm',
params='',
query='',
fragment='')
http工作过程
- 地址解析,将url解析出对应的内容
- 封装http请求数据包
- 封装成TCP包,建立TCP连接
TCP的三次握手
- 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确定
- 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态
- 第三次握手:客户端收到服务器的SYN+ACK包,想服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态
- 客户端发送请求
- 服务器发送响应
- 服务器关闭TCP连接
浏览器如何加载页面
当我们在浏览器输入一个url时,为什么可以加载出一个页面?
在抓包的过程中,请求了一个url,会出现很多的资源请求。
- 当我们在浏览器中输入一个url,客户端会发送这个url对应的一个请求到指定服务器获取内容.
- 服务器接收到这个请求,解析出对应的内容,之后将内容封装到响应里面发送给客户端,比如index.html.
- 当客户端拿到这个
html
页面,会查看这个页面中是否有css、js、image
等url
,如果有,再分别进行请求,获取到这些资源. - 客户端会通过
html
的语法,将获取到的所有内容完美的显示出来.
客户端请求
请求的组成
请求行、请求头、空行、请求数据
四个部分组成。
请求方法get/post
get请求
从服务器上获取资源,通过请求参数来告诉服务器获取什么资源。请求参数是在url里面的?
后,使用&
拼接,数据不安全,传输参数的大小受限。
post请求
向服务器传递数据,数据是封装在请求中的实体,可以传递更多内容,也更安全。
区别:
- get是从服务器获取数据,post是向服务器传递数据.
- get不安全,因为参数拼接在url后面。post比较安全,因为参数是放在实体里面.
- get传参大小受限,post不受限.
重要的请求头
User-Agent(浏览器名称):客户端请求标识
Accept(传输文件类型):允许传入的文件类型
Referer(页面跳转处):表明产生请求的网页来自于哪个url,用户是从该Referer页面访问到当前请求的页面
Cookie:在做登录的时候需要封装这个头
Content-Type(post数据类型):POST请求里用来表示的内容类型
发送post请求时,需要特别注意headers的一些属性:
Content-Length: 144: 是指发送的表单数据长度为144,也就是字符个数是144个
X-Requested-With: XMLhttpRequest :表示Ajax异步请求
服务器响应
响应的组成
状态行,响应头,空行,响应正文。
重要响应头
Content-Type:text/html;charset=UTF-8:告诉客户端,资源文件的类型,还有字符编码
状态码
- 100~199:表示服务器成功接收部分请求,要求客户端继续提交其余请求才能完成整个处理过程。
- 200~299:表示服务器成功接收请求并已完成整个处理过程。常用200(OK 请求成功)。
- 300~399:为完成请求,客户需进一步细化请求。例如:请求的资源已经移动一个新地址、常用302(所请求的页面已经临时转移至新的url)、307和304(使用缓存资源)。
- 400~499:客户端的请求有错误,常用404(服务器无法找到被请求的页面)、403(服务器拒绝访问,权限不够—DDos)。
- 500~599:服务器端出现错误,常用500(请求未完成。服务器遇到不可预知的情况)。
Cookie和Session
会话技术
- 会话:一次会话中包含多次请求和响应。
- 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止
- 功能:在一次会话的范围内的多次请求间,共享数据
- 方式:
- 客户端会话技术:Cookie
- 服务器端会话技术:Session
服务器和客户端的交互仅限于请求/响应过程,结束之后便断开,在下一次请求时,服务器会认为新的客户端。
为了维护他们之间的连接,让服务器知道这是前一个用户发送的请求,必须在一个地方保存客户端的信息。
Cookie:通过在 客户端 记录的信息确定用户的身份。
Session:通过在 服务器端 记录的信息确定用户的身份。
Cookie
概念: 客户端会话技术,将数据保存到客户端
实现原理: 基于响应头set-cookie和请求头cookie实现
cookie的细节:
- 一次可不可以发送多个cookie?
* 可以
* 可以创建多个Cookie对象,使用response调用多次 - cookie在浏览器中保存多长时间?
1. 默认情况下,当浏览器关闭后,Cookie数据被销毁
2. 持久化存储:
* setMaxAge(int seconds)
1. 正数:将Cookie数据写到硬盘的文件中。持久化存储。并指定cookie存活时间,时间到后,cookie文件自动失效
2. 负数:默认值
3. 零:删除cookie信息 - cookie能不能存中文?
* 在tomcat 8 之前 cookie中不能直接存储中文数据。
* 需要将中文数据转码—一般采用URL编码(%E3)
* 在tomcat 8 之后,cookie支持中文数据。特殊字符还是不支持,建议使用URL编码存储,URL解码解析 - cookie共享问题?
* 默认情况下cookie不能共享
Cookie的特点和作用
特点:
1.cookie存储数据在客户端浏览器
2. 浏览器对于单个cookie 的大小有限制(4kb) 以及对同一个域名下的总cookie数量也有限制(20个)
作用:
1. cookie一般用于存出少量的不太敏感的数据
2. 在不登录的情况下,完成服务器对客户端的身份识别
Session
概念:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。
Session的特点:
1.Session用于存储一次会话的多次请求的数据,存在服务器端
2. Session可以存储任意类型,任意大小的数据
Session与Cookie的区别:
1.Session存储数据在服务器端,Cookie在客户端
2. Session没有数据大小限制,Cookie有
3. Session数据安全,Cookie相对于不安全
hash算法
字符串加密
import hashlib
def get_hex(value):
#1.c创建一个加密对象
md5_ = hashlib.md5()
#2.将需要加密的内容update到md5对象中
#将字符串转化成bytes类型两种方法:
#str.encode('utf-8')
#bytes(str,encoding='utf-8')
md5_.update(value.encode('utf-8'))
#3.获取加密内容
return md5_.hexdigest()
content = '''
User-Agent:客户端请求标识。
cookie (cookie):在做登录的时候需要封装这个头。
'''
print(get_hex(content)) # 881d8ddae168083dc2e4638f5ba27d65
文件加密
def get_file_hex(filename):
chunk_size = 1024
md5_ = hashlib.md5()
with open(filename,'r',encoding='utf-8') as fp:
chunk = fp.read(chunk_size)
if chunk:
md5_.update(bytes(chunk,encoding='utf-8'))
return md5_.hexdigest()
print(get_file_hex('01.txt')) # b4faaad91ae69258e1bdf95e7783318e
requests修饰符
参考:Link
加油!
感谢!
努力!
以上是关于小白必学的爬虫基础的主要内容,如果未能解决你的问题,请参考以下文章
Django是Python开发最火热的一个框架!小白必学的Django框架!