反爬虫机制
门户网站,可以通过制定相应的策略或者技术手段,防止爬虫程序进行网站数据的爬取
反反爬虫策略:
爬虫程序可以通过制定相关策略或者技术手段,破解门户网站中具备的反爬机制,从而可以获取门户网站
http协议
就是服务器和客户端进行数据交互的一种形式
常用请求头信息:
User—Agent:请求载体的身份 Conneection: 请求完毕后,是断开连接还是保持连接
常用响应头信息
Content-type: 服务器响应回客户端的数据类型
https协议:
安全的超文本传输协议
加密方式
对称密钥加密 非对称密钥加密 证书密钥加密
requests模块:
- urllib模块
- requests模块
requests模块:python中原生的一款基于网络请求的模块,功能非常强大,简单便捷,效率极高。
作用:模拟浏览器发送请求。 如何使用:
- 指定url
- 发起请求
- 获取响应数据
- 持久化存储
数据解析分类:
-正则 -bs4 -xpath
数据解析原理概述:
解析局部的文本内容都会在标签之间或者标签对应的属性中进行存储 -1、进行指定标签的定位
-2、标签或者标签对应的属性中存储的数据值进行提取(解析)
正则解析:
如下是一个div转变成正则:
<div class="mend">
<a href="/tst" target="black">
<img src="/teat">
</a>
</div>
# 转换之后
he = '<div class="mend">.*?<img src="(.*?) alt.*?</div>
bs4进行数据解析
1、数据解析的原理: ·标签定位 ·提取标签、标签属性中存储的数据值 2、bs4 数据解析的原理:
·实例化一个BeautifulSoup对象,并且将页面源码数据加载带该对象中
·通过调用BeautifulSoup对象中相关的属性或者方法进行标签定位和数据提取
如何实例化BeautifulSoup对象:
from bs4 import BeautifulSoup 对象的实例化:
1、将本地的html文档中的数据加载到该对象中
fp = open('./test.html','r',encoding='utf-8')
# test.html 为本地文件
soup = BeautifulSoup(fp,'lxml')
2、将互联网上获取的页面源码加载到该对象中
page_text = response.text
soup = BeautifulSoup(page_text,'lxml)
soup.taName:返回的是文档中第一次出现的tagName对应的标签
soup.find():
find('tagName'):等同于soup.div
# 属性定位:
soup.find('div',class_/id/attr=’song‘)
soup.find_all('tag'):返回符合要求的所有标签(标签)
select:
select('某种选择器(id,class,标签……选择器)'),返回的是一个列表
层级选择器:
soup.select('.tang > ul > li > a')[0] :> 表示的是一个层级
soup.select('.tang > ul > a') :空格表示的是多个层级
获取标签之间的文本数据:
soup.a…text/string/get_text()
text/get_text():可以获取某一个标签中所有的文本内容
string:只可以获取该标签下面直系的文本内容
获取标签中属性值:
soup.a[‘href’]
xpath解析:
最常用且最便捷高效的一种解析方式。
xpath解析原理:
1、实例化一个etree的对象,且需要将被解析的页面源码数据加载到该对象中
2、调用etree对象中的xpat方法结合着xpath表达式实现标签的定位和内容的捕获
如何实例化一个etree对象:
1、将本地的html文档中的源码数据加载到etree对象中: etree.parse(filePath)
2、可以将从互联网上获取的源码加载到该对象中 etree.HTML(‘page_text’) xpath(‘xpath表达式’)
xpath表达式:
/:表示的是从根节点开始定位,表示的是一个层级。
//:表示的是多个层级,可以表示从任意位置开始定位。
属性定位://div[@class=‘className’] tag[@attrName=“attrValue”]
索引定位://div[@class=“className”]/p[3] 索引是从1开始的。
取文本:
/text() 获取的是标签中直系的文本内容
//text() 标签中非直系的文本内容(所有的文本内容)
取属性:
/@attrName ==>img/src
http/https协议特征:无状态
没有请求的对应页面数据的原因
发起的第二次基于个人主页页面请求的时候,服务器并不知道该此请求是基于登录状态下的请求,
cookie:用来让服务器端记录客户端的相关状态。
手动处理:通过抓包工具获取cookie值,将该值封装到headers中
自动处理:
cookie值的来源是哪里?
模拟登录post请求后,有服务器端创建,
session 会话对象:
作用:1、可以进行请求的发送。
2、-如果请求过程中产生了cookie,则该cookie会被自动存储/携带在该session对象中
创建一个session对象:requests.Session()
-使用session对象进行模拟登录post请求的发送(cookie会被存储在session中)
-session对象对个人主页对应的get请求进行发送(携带cookie)