什么是爬虫网络爬虫
网络爬虫(又被称为网页蜘蛛,网络机器人), 是一种按照一定的规则,自动第抓取万维网信息的大程序或者脚本。
通俗的讲:就是模拟客户端发起网络请求,接收请求的响应,按照一定的规则,自动的抓取互联网信息的程序。原则上只要是浏览器能够做的事情,爬虫都能够实现
爬虫的基本原理:
我们把互联网比喻为一张大网,网络爬虫我们想象为网上的蜘蛛,网页与网页直接的连接我们理解为节点,爬虫就相当于是访问网页,获取网页的信息,又通过节点可以爬取另一个网站,然后不停的通过一个个节点即访问一个个网页,这样网站的数据就可以被我们获取下来了。
爬虫的分类
网络爬虫分为 通用爬虫和 聚焦爬虫 两种
通用爬虫
通用网络爬虫是搜索引擎抓取系统的重要组成部分。主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份
聚焦爬虫
聚焦爬虫是“面向特定主题需求“”的一种网络爬虫程序,它与通用搜索引擎爬虫的区别在于:聚焦爬虫在实施网页抓取时会对内容进行处理筛选,尽量保证只抓取与需求相关的网页信息
通用搜索引擎工作原理
通用网络爬虫是互联网中搜集网页,采集信息,这些网页信息用于为搜索引擎建立索引从而提供支持,它决定 着整个引擎系统的内容是否丰富,信息是否即时,因此其性能的优劣直接影响着搜索引擎的效果。
七层协议
目的: OSI七层模型通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯,因此其最主要的功能就是帮助不同类型的主机实现数据传输
应用层:
网络服务与最终用户的一个接口。
协议有: HTTP HTTPS FTP …
表示层:
主要功能是定义数据格式及加密即对上层数据或信息进行变换以保证一个主机应用层信息可以被另一个主机的应用程序理解,并按照一定的格式传送给会话层
会话层:
建立 管理,终止会话。
传输层:
定义传输数据的协议端口号,以及流控和差错校验。
TCP/UDP
网络层:
进行逻辑地址寻址,实现不同网络之间的路径选择。
数据链路层:
建立逻辑连接,进行硬件地址寻址,差错校验等功能。(由底层网络定义协议)网桥,交换机
物理层:
建立,维护,断开物理连接
TCP协议和UDP协议的差别:
tcp 是面向连接的 是长连接,传输的是数据流、安全可靠。传输少量数据,速度慢,
udp是非面向连接 传输的是数据包,所以是不安全的,传输大量数据,速度快
应用层协议
HTTP协议中文名是超文本传输协议:
是用于从网络传送超文本数据到本地浏览器的传送协议
HTTPS协议 简单讲是HTTP 的安全版,在 http协议的基础上加入SSL层(HTTP+SSL)
SSL 安全套接层
主要用于Web的安全传输协议,在传送层对网络连接进行加密,保障在Internet上数据传输的安全
HTTP的端口号为80
HTTPS的端口号为443
HTTP通信由两部分组成:
客户端请求消息 与 服务器响应消息
URL介绍
URI:统一资源标识符
URL:统一资源定位符,是用于完整地描述Internet上网页和其他资源的地址的一种标识方法。
URN:统一资源名称,只命名资源而不指定如何定位资源
那三者之间有什么关系呢?
URI是URL与URN的父类,URN用的很少,我们一般会提到URI和URL,每一个URL都是一个URI,但是并不是每一个URI都是一个URL。
URL的基本组成
scheme: 协议
host:服务器的IP地址或者域名
post:服务器的端口(如果是走协议默认端口,缺省端口80)
path: 访问资源的路径
query-string:参数,发送给http服务器的数据
anchor:锚(跳转到网页的指定锚点位置)
请求方法
GET
POST
PUT
DELETE
PATH
HEAD
CONNECT
OPTIONS
TRACE
HTTP请求主要分为Get和Post两种方法
GET是从服务器上获取数据,POST是向服务器传送数据
注意:避免使用Get方式提交表单,因为有可能会导致安全问题。 比如说在登陆表单中用Get方式,用户输入的用户名和密码将在地址栏中暴露无遗。
常用的请求报头
1,user-agent(浏览器名称)
User-Agent:是客户浏览器的名称,以后会详细讲
2,Cookie
Cookie:浏览器用这个属性向服务器发送Cookie.Cookie是在浏览器中七寸的小型数据体,它可以记载和服务器相关的用户信息,也可以用来实现会话功能
3,Referer(页面跳转处)
Referer:表明产生请求的网页来自于哪个URL,用户是该Referer页面访问到当前请求的页面,这个属性可以用来跟踪Web请求来自哪个页面,是从什么网站来的等。
有时候遇到下载某网站图片,需要对应的referer,否则无法下载图片,那是因为人家做了防盗链,原理就是根据referer去判断是否是本网站的地址,如果不是则拒绝,如果是,就可以下载;
Cookie 和 Session:
服务器和客户端的交互仅限于请求/响应过程,结束之后便断开,在下一次请求时,服务器会认为新的客户端。
为了维护他们之间的链接,让服务器知道这是前一个用户发送的请求,必须在一个地方保存客户端的信息。
Cookie:通过在 客户端 记录的信息确定用户的身份。
Session:通过在 服务器端 记录的信息确定用户的身份。
常见的响应状态码:
100~199:表示服务器成功接收部分请求,要求客户端继续提交其余请求才能完成整个处理过程。
2xx:表示服务器成功接收请求并已完成整个处理过程。
200 (请求成功)
3xx:为完成请求,客户需进一步细化请求。例如:请求的资源已经移动一个新地址、
常用 301 :永久重定向 302:临时重定向(所请求的页面已经临时转移至新的url)
4xx:客户端的请求有错误。
400:错误请求,服务器无法解析请求
401:未授权,没有进行身份验证
403,服务器拒绝访问
404:服务器无法找到背请求的页面
405:请求方式不被允许
408:请求超时
5xx:服务器端出现错误
500:服务器内部错误
501:服务器不具备完成请求的功能
503:服务器不可用
str与bytes的区别
结论:bytes是ptrhon 3中特有的,Python 2 里不区分bytes和str。
python3中:
str类型使用encode方法转化为bytes类型
bytes类型通过decode转化为str类型
python CSV文件的读写
写入列表类型的数据import csv
with open("test.csv","w") as csvfile:
#创建文件句柄
writer = csv.writer(csvfile)
#先写入columns_name
writer.writerow(["index","a_name","b_name"])
#写入多行用 writerows
writer.writerows([[0,1,3],[1,2,3],[2,3,4]])
#单行写入writerow
writer.writerow([0,1,3])
12345678910
写入字典类型的数据
import csv
With open(‘test.csv’,’w’) as csvfile:
fieldnames = ['index','a_name','b_name’]
#创建文件句柄
writer = csv.DictWriter(csvfile,fieldnames=fieldnames)
先写入头信息即
fieldnames = ['index','a_name','b_name’]
writer.writeheader()
writer.writerow({'index’:’1’,'a_name’:’2’,'b_name’:’3’})
123456789
读取csv文件:
import cs
import csv with open("test.csv","r") as csvfile:
#创建一个读取文件的句柄
reader = csv.reader(csvfile)
#遍历获取每一行数据
for line in reader:
print (line)
1234567
urllib库的基本使用
request它是最基本的HTTP请求模块,可以用来模拟发送请求,就像在浏览器中输入网址,然后敲击回车键一样,使用的时候只需要给库方法传入相关的URL的相关的参数即可.
error:异常处理模块,如果出现请求错误,我们课使用这个模块来捕获异常,然后进行重试或者其他操作,保证程序不会以为终止。
parse:这是一个工具模块,提供了许多url的处理方法,比如拆分,解析,合并等等
urlopen方法的使用
url:设置目标url
data:如果设置该参数,则请求默认为post请求
timeout:用于设置超时时间,单位为秒。
context:必须是一个ssl.SSLcontext类型,用来指定SSL设置,忽略未认证的CA证书
Request
使用urlopen直接发送请求,获取一些反爬手段低的网站,有些网站会根据请求头来判断是否是浏览器访问,则需要增加HTTP报头,必须创建一个Request实例来作为urlopen()的参数;而需要访问的url地址则作为Request实例的参数。
url参数是请求链接,这个是必传参数,其他的都是可选参数。
data(默认空) 参数跟urlopen()中的data参数用法相同。
headers(默认空)是一个字典,它除了在Request中添加,还可以通过调用Request实例的add_header()方法来添加请求头
unberifiable参数表示这个请求是否是无法验证的,默认值是False,意思就是说用户没有足够权限来选择接受这个请求的结果。例如我们请求一个HTML文档中的图片,但是我们没有自动抓取图像的权限,我们就要将unverifiable的值设置为True.(这个参数我们不需要设置)
method参数指的是发起HTTP请求的方式
urllib的异常错误处理
**URLError:**来自urllib库的error模块,继承自OSError,由request模块产生的异常都可以通过捕捉这个类来处理。
主要原因有:
没有网络连接
服务器连接失败
找不到指定的服务器
它具有一个属性reason,返回错误的原因
HTTPError
HTTPError是URLLError的子类,我们发出一个请求时,服务器都会对应一个response应答对象,其中它包含一个数字“响应状态码”
专门用来处理HTTP请求错误,比如未认证,页面不存在等
有三个属性:
code:返回HTTP的状态码
reasn:返回错误的原因
headers:返回请求头
parse模块下常用的url解析、合并、编码、解码方法
使用时需导入
from urllib import parse
urlencode()将字典构形式的参数序列化为url编码后的字符串
(常用来构造get请求和post请求的参数)
parse_qs()将url编码格式的参数反序列化为字典类型
quote()可以将中文转化为url编码格式
unquote:可以将url编码进行解码
urljoin()传递一个基础链接,根据基础链接可以将某一个不完整的链接拼接为一个完整链接
urlparse()实现URL的识别和分段(了解)
GET请求
url地址中包含中文参数的get请求
#urllib_get.py
url = "http://www.baidu.com/s"
word = {"wd":"六一儿童节,可我还是单身"}
word = urllib.parse.urlencode(word) #转换成url编码格式(字符串)
newurl = url + "?" + word
headers={ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36" }
request = urllib.request.Request(newurl, headers=headers)
response = urllib.request.urlopen(request)
html = response.read()
print (html)
12345678910
post请求
Request请求对象的里有data参数,它就是用在post里的,我们要传送的数据就是这个参数data。data是一个zid,里面要匹配键值对。
处理HTTPS请求 SSL证书验证
出现ssl.CertificateError:…
这种错误时,我们就需要单独处理SSL设置,忽略未认证的CA证书,让程序忽略SSL证书验证错误,即可正常访问。
. 表示忽略未经核实的SSL证书认证 context = ssl._create_unverified_context()
1
urllib高级用法(设置代理)
代理的作用:
1,突破自身IP访问的限制,访问一些平时不能访问的站点。
2,提高访问速度:通常代理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时,同时也讲偶保存到缓冲区中,当其他用户在访问相同的信息时,则直接由缓冲区中取出信息,传给用户,以提高访问速度。
3,隐藏真实IP:上网者也可以通过这种方式隐藏自己的IP,免受攻击,对于爬虫来说,我们用代理就是为了隐藏自身IP,防止自身的IP被封锁。
常见的代理分类:
1 根据协议划分:
FTP代理服务器:主要用户访问FTP服务器,一般有上传,下载的功能以及缓存的功能,端口号一般为21,2121等。
HTTP/HTTPS代理服务器:主要用于访问网页,一般有内容过滤和缓存的功能,端口号一般为80、8080、3128等
SOCKS代理:只是单纯的用于传输数据包,不关心具体的协议用法,速度快、有缓存功能,端口号一般为1080
2 .根据匿名内容划分:
高度匿名代理:会将数据包原封不动的转发,在服务器看来就好像真的是一个普通的用户短在的访问,而记录的IP就是代理服务器的IP
普通匿名代理: 会在数据包上做一些改动,服务端上有可能发现这个是代理服务器,也有一定的几率追查到客户端的真是IP
透明代理:不但改动了数据包,还会告诉服务器客户端的真是IP,这种代理除了用缓存技术提高浏览器速度,能用内容过滤提高安全性职位,并没有其他作用
透明代理:不但改动了数据包,还会告诉服务器客户端的真实IP,这种代理除了用缓存技术提高浏览器速度。能用内容过滤提高安全性之外,并没有其他作用。
自定义代理Opener
ProxyHandler处理器用来设置代理
Cookie
是指某些网站服务器为了辨别用户身份和进行Session跟踪,而储存在用户浏览器上的文本文件,Cookie可以保持登录信息到用户下次与服务器的会话。
Cookie原理
HTTP是无状态的面向连接的协议, 为了保持连接状态, 引入了Cookie机制 Cookie是http消息头中的一种属性
cookiejar库 和 HTTPCookieProcessor处理器
在Python处理Cookie,一般是通过cookiejar模块和 urllib模块的HTTPCookieProcessor处理器类一起使用。
cookiejar模块:主要作用是提供用于存储cookie的对象
HTTPCookieProcessor处理器:主要作用是处理这些cookie对象,并构建handler对象。
cookiejar 库
该模块主要的对象有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。其实大多数情况下,我们只用CookieJar(),如果需要和本地文件交互,就用 MozillaCookjar()
CookieJar:管理HTTP cookie值、存储HTTP请求生成的cookie、向传出的HTTP请求添加cookie的对象。整个cookie都存储在内存中,对CookieJar实例进行垃圾回收后cookie也将丢失。
MozillaCookieJar (filename,delayload=None,policy=None):从FileCookieJar派生而来,创建与Mozilla浏览器 cookies.txt兼容的FileCookieJar实例。
模拟登录要注意几点:
登录一般都会先有一个HTTP GET,用于拉取一些信息及获得Cookie,然后再HTTP POST登录。
HTTP POST登录的链接有可能是动态的,从GET返回的信息中获取。
password 有些是明文发送,有些是加密后发送。有些网站甚至采用动态加密的,同时包括了很多其他数据的加密信息,只能通过查看JS源码获得加密算法,再去破解加密,非常困难。
大多数网站的登录整体流程是类似的,可能有些细节不一样,所以不能保证其他网站登录成功.
Requests的使用
安装方式
利用 pip安装 或者利用easy_install 都可以完成安装
pip3 install requests
1
基本GET请求
1,最基本的GET请求可以直接用get方法
response的常用方法:
respons.text 返回解码后的字符串
responses.content 以字节形式(二进制)返回
response.status_code 响应状态码
response.request.headers 请求的请求头
response.headers 响应头
response.encoding = ‘utf-8’ 可以设置编码类型
response.encoding获取当前的编码
response.json() 内置的JSON解码器,以json形式返回,前提返回的内容确保是json格式的,不然解析出错会抛异常
2 。添加headers和params查询参数
如果想添加headers,可以传入headers参数来增加请求头中的headers信息。如果要将参数放在url中传递,可以利用params参数
基本POST请求(data参数)
url:post请求的目标url
data:post请求的表单数据
post请求上传文件
如果我们想post一个文件怎么办呢?这个时候就需要用到files参数了:
web客户端验证
如果是Web客户端验证,需要添加 auth = (账户名, 密码)
设置代理(proxies参数)
session的使用
在 requests 里,session对象是一个非常常用的对象,这个对象代表一次用户会话:从客户端浏览器连接服务器开始,到客户端浏览器与服务器断开。
处理HTTPS请求 SSL证书验证
Requests也可以为HTTPS请求验证SSL证书:
要想检查某个主机的SSL证书,你可以使用 verify 参数(Defaults to True)
————————————————
版权声明:本文为CSDN博主「冷暖自知···」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43167531/article/details/90744877