import requests
r= requests.get("")
r.status_code#检测状态码,为200,可以正常访问,访问成功
r.encoding="utf-8"
r.text
这个代码用于交互式的IDLE中
requests常用的几个主要方法:
1,requests.request()构建一个请求,支撑一下
2,requests.get()获取网页的主要方式,对应HTTP中的GET
3,requests.head()获取开头信息的主要方式,对应HTTP中的HEAD
4,requests.post()向HTML网页提交POST请求的方法,对应于HTTP中的POST
5,requests.put()向HTML网页提交PUT请求的方法,对应于HTTP的put
6,requests.patch()向HTML网页提交局部修改请求,对应于HTTP的PATCH
7,requests.delete()向HTML网页提交删除请求,对应于HTTP的DELETE
二,requests中的get语法
1,最简单的爬取网站的代码是:r = requests.get(url)去构造一个向服务器请求的对象
response对象返回一个包含服务器资源的response对象
通常形式上的resquests.get有三种格式:requests.get(url,params=None,**Kwargs)
其中的:
url:拟获取页面的url链接
params:url中的额外参数,字典或字节流格式
**kwargs:12个控制访问的参数
这也是get方法源代码
requests库的2个重要对象:response和request
其中的response是获得网络内容相关的
response对象包含爬虫返回的内容
response最常用的对象的属性:
r.status_code:HTTP请求的返回状态, 200表示连接成功,404表示失败(不是200就是失败)
r.text:HTTP响应内容的字符串形式,即,url对应的页面内容
r.encoding:从HTTP header中猜测的响应内容编码方式
r.apparent_encoding:从内容中分析出的响应内容编码方式(备选编码方式)
r.content:HTTP响应内容的二进制形式
一般情况下有一下的这样一个流程:
首先用r.status_code检查返回状态
如果是200,可以继续用
r.text_encoding
r.apparent_encoding
r.content
等去解析访问的内容
如果是404或者其他,证明这次访问出现错误或出现异常了
建议平常的时候使用r.apparent_encoding
这个爬取中文的和全部的HTTP,而r.encoding仅仅是HTTP开头的内容
三,理解requests库几种常用的异常
1,requests.connectionError:网络连接错误异常,如DNS查询失败、拒绝连接等
2,requests.HTTPError:HTTP错误异常(访问HTTP时候出现)
3,requests.URLRequired:URL缺失异常(访问URL时出现)
4,requests.TooManyRedirects:超时最大重定向次数,产生重定向异常(访问的次数超过requests库的次数)
5,requests.ConnectTimeout:连接远程连接服务器超时异常(超过了预定时间而出现的异常)
6,requesta.Timeout:请求URL超时,产生超时异常
response提供了一个方法:r.raise_for_status()如果不是200,产生异常requests.HTTPError(专门与异常打交道的方法)
这个框架是专门来处理异常的
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、这个需要补充
四,HTTP协议跟Requests库的主要方法
HTTP:超文本传输协议,是一个基于“请求与响应”模式的、无状态的应用层协议
简单的说,用户发起请求,服务器做相关相应,无状态是第一次请求与第二次请求之间并没有相关的关联,应用层协议指的是该协议工作在TCO协议之上
HTTP是一个基于“请求与响应”模式的、无状态的应用层协议。
HTTP协议采用URL作为定位网络资源的标识
URL格式:http://host:port
host:合法的Intermet主机域名或ip地址
port:端口号,缺省端口为80
path:请求资源的路径
对URL的理解:
URL是通过HTTP协议存取资源的Internet路径,一个URL对应一个数据资源
基础常用的基本操作:
GET:请求获取URL位置的资源
HEAD:请求获取URL位置资源的响应消息报告,即获得该资源的头部信息
POST:请求向URL位置的资源后附加新的数据
PUT:请求向URL位置储存一个资源,覆盖原URL位置的资源
PATCH:请求局部更新URL位置的资源,即改变该处资源的部分内容
DELETE:请求删除URL位置存储的资源
这六个也是requests库所对应的六种方法
每一个操作都是独立的,上下一步不连接
patch的最主要好处:节省网络宽带
patch和put的区别:
patch的仅仅是选中那段,而put则是全部
在运行r=requests,head("http://httpbin.org/get")的时候,可以读取他的开头,r.header可以用来展示反馈的头部信息的内容
用head可以用极短的代码去获取网页的主要概括
requests库的post()
我们可以通过post去增加附加值,当我们用URL去post一个字典的话或者是post键值对话,可以默认的被存储到表单的字段下;
如果我们不提交键值对,就会储存在其他下面
他会根据用户提交的内容不同,在服务器上会做数据的相关的整理
requests库的put()
他这个余post类似,只不过他可以将原有的数据覆盖掉
五,requests库主要方法
主要就是那7种方法
其中的request方法是所有方法的基础方法
还有三个参数:
method,URL和控制访问参数
method:请求方式,对应get/put/post等7种方法
url:拟获取页面的URL链接
**kwargs:控制访问的参数,共13个
method的请求方式一共有7种:
r=requests.request("GET",url,**kwarges)
r=requests.request("HEAD",yrl,**kwargs)
r=requests.request("POST",url,**kwargs)
r=requests.request("PUT",url,**kwargs)
r=requests.request("PATCH",url,**kwargs)
r=requests.request("delete",url,**kwarks)
r=requests.request("OPTIONS",url,**kwargs)
前六个就是HTTP协议中的那六个,最后一个也是第七个事实上是向服务器获取一些服务器跟客户端能打交道的参数,这里边并不与获取资源直接相关所以咱们用的比较少
**kwargs:控制访问的参数,均为可选项
params:字典或字节序列,作为参数增加到url中。通过这样一个参数,我们可以把键值对增加到URL中,访问的时候不仅会带有这些资源还可以带些参数,也就是用这个函数插入的参数,服务器可以接受这些参数,并编辑根据这些参数筛选部分资源
data:字典、字节序列或文件对象,作为request的内容
json:JSON格式的数据,作为Request的内容
headers:字典,HTTP定制头(对应着向HTTP发起的头字段,也就是头值域,用这个字段可以定制访问某一个URL的http的协议头)
timeout:设定超市时间,秒为单位(当我们发起一个get请求时,如果在请求时间内我们的内容没有返回回来,他就会产生一个timeout异常)
Proxies:字典类型,设定访问代理服务器,可以增加登录认证(使用这个字段可以有效的隐藏用户爬取网页的源的IP地址的信息,可以有效地防止对爬虫的逆追踪)
allow_redirects:True/False,默认为True,重定向开关,他是个开关表示允不允许对URL重定向
stream:True/False,,默认为True,获取内容立即下载开关(默认情况是立即下载)
verify:True/False,默认为True,认证SSL证书开关
cert:本地SSL证书路径(是保存本地SSL证书路径)
六,robit协议
robots Exclusion Standard
网络爬虫排除标准
作用:网站告知爬虫哪些可以抓取哪些不行
形式,也是使用方法:在网站的根目录下的robots.txt文件(在这个文件中写)
User-agent代表爬虫,所有爬虫就“:*”
Disallow:/表示不允许
七,requests实训
如果出现了超过200的值的时候,我们需要转化为我们能看的的
r.encoding=r.apparent_encoding
会翻出一些代码,并出现一些出错的地方
我们具体想知道哪个位置出现问题,可以用头来查询一下
r.request.headers
然后构建一个键值对
kv={"user-gent":"mozillax/5.0"}
说明了我们重新定义了一个User-agent
其中的mozillax/5.0是在告知user-agent是一个浏览器,但是不一定的一个浏览器,哪个浏览器都行,他是一个身份标识的字段
然后我们再去进行操作
使用原来的URL
这个时候使用get需要在括号里面加一个headers=kv
不是返回200的,进行步骤:
import requests
url=" "
try:
kv={"user-gent":"mozilla/5.0"}
r=requests.get(url,headers=kv)
r.raise_for_status()
r.encoding=r.apparent_encoding
print(r.text[])
except:
print("爬取失败")
代码举例
import requests
引入我们的库·【在使用之前,我们都需要拥有才可以】
url = "https://www.yzu.edu.cn/"
然后是我们的网页链接【这个的获取方式是进行复制我们当前网页最上面的链接就可以】
# path = "i:/扬州.html"
# 这个是我们保存的地址,因为我的电脑当中有i盘,所以这里可以写i盘,因人而异
# headers={
"user-agent":""
}
# 这个是我们进行设置的请求头,因为我们爬虫是使用计算机来进行操作,网站是可以根据一些手段来检查出我们的操作是否是人为还是计算机,有了请求头,识别的时候就会模仿人类的操作,使我们的网站认为是人类操作
r = requests.get(url,headers=headers)
这一步是进行调用我们requests当中的get方法去获取我们的链接,后面是我们添加的头
r.raise_for_status()
这一步是进行查看我们的状态编码【这个是个人理解】,也就是200、404之类
r.encoding = r.apparent_encoding
这一步是进行查看我们的网页编码【这个是个人理解】,也就是utf-8,gbk等等
with open(path, "wb") as f:
f.write(r.content)
八,搜索引擎的关键词接口:
keyword_360搜索(360)
params可以向URL中增加相关的内容
为了使用它需要先构造一个键值对
键值对标明的就是我们要搜素的关键词是什么
可以用r.request.url来看我们输入的url
长度·查看len(r.text)
如何进行解析百度360返回的链接以及返回的内容呢要用到之后的beautifulsoup了
九,网络图片的爬取和存储
网络图片链接的格式:
http://www.example.com/picture.jpg
图片一般二进制的,可以用r.content来·显示他的二进制
with open(path,"wb")as f:
f.write(r.content)
root:表示正在遍历的文件夹的名字(根/子)
roots:代表需要遍历的根文件夹
dirs:记录正在遍历的文件夹下的子文件夹集合
files:记录正在遍历的文件夹中的文件集合
在这里涉及到一个方法的时候,也就是with open() as f:
这个其中有一些参数:
r:以只读方式打开文件。文件的指针将会放在文件的开头。这是**默认模式**
rb:以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式 rb+:以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头 w:打开一个文件只用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件 wb:以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件 w+:打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建文 wb+:以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件
a:打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+:打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的节结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写
ab:以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab+:以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
f.write(r.content)
我们的write是众多方法之一,还有一些其他的方法:
file.read([size]:将文件数据作为字符串返回,可选参数size控制读取的字节数
file.readlines([size]):返回文件中行内容的列表,size参数可选
file.write(str):将字符串写入文件
file.writelines(strings):将字符串序列写入文件
file.close():关闭文件
file.closed():表示文件已经关闭,否则为False
file.mode():Access文件打开时使用的访问模式
file.encoding:文件所使用的编码
file.name:文件名
file.newlines:未读取到行分隔符时为None,只有一种行分隔符时为一个字符串,当文件有多种类型的行结束符时,则为一个包含所有当前所遇到的行结束的列表
file.softspace:为0表示在输出一数据后,要加上一个空格符,要加上一个空格符,1表示不加。这个属性一般程序员用不到,由程序内容使用
这个代码不仅仅可以为图片,还可以是视频和flash等等
错误类型:
503错误:服务器不可访问
403错误:是一种在网站访问过程中,常见的错误提示,表示资源不可用。服务器理解客户的请求,但拒绝处理它,通常由于服务器上文件或目录的权限设置导致的WEB访问错误。
403.1
403.1错误是由于"执行"访问被禁止而造成的,若试图从目录中执行 CGI、ISAPI 或其他可执行程序,但该目录不允许执行程序时便会出现此种错误。
403.2
403.2错误是由于"读取"访问被禁止而造成的。导致此错误是由于没有可用的默认网页并且没有对目录启用目录浏览,或者要显示的HTML网页所驻留的目录仅标记为"可执行"或"脚本"权限。
403.3
403.3错误是由于"写入"访问被禁止而造成的,当试图将文件上载到目录或在目录中修改文件,但该目录不允许"写"访问时就会出现此种错误。
403.4
403.4错误是由于要求SSL而造成的,您必须在要查看的网页的地址中使用"https"。
403.5
403.5错误是由于要求使用 128 位加密算法的 Web浏览器而造成的,如果您的浏览器不支持128位加密算法就会出现这个错误,您可以连接微软网站进行浏览器升级。
403.6
403.6错误是由于IP 地址被拒绝而造成的。如果服务器中有不能访问该站点的 IP 地址列表,并且您使用的 IP 地址在该列表中时您就会返回这条错误信息。
403.7
403.7错误是因为要求客户证书,当需要访问的资源要求浏览器拥有服务器能够识别的安全套接字层(SSL) 客户证书时会返回此种错误。
403.8
403.8错误是由于禁止站点访问而造成的,若服务器中有不能访问该站点的 DNS 名称列表,而您使用的 DNS 名称在列表中时就会返回此种信息。请注意区别403.6与403.8错误。
403.9
403.9错误是由于连接的用户过多而造成的,由于Web 服务器很忙,因通讯量过多而无法处理请求时便会返回这条错误。
403.10
403.10错误是由于无效配置而导致的错误,当您试图从目录中执行 CGI、ISAPI 或其他可执行程序,但该目录不允许执行程序时便会返回这条错误。
403.11
403.11错误是由于密码更改而导致无权查看页面。
403.12
403.12错误是由于映射器拒绝访问而造成的。若要查看的网页要求使用有效的客户证书,而您的客户证书映射没有权限访问该Web站点时就会返回映射器拒绝访问的错误。
403.13
403.13错误是由于需要查看的网页要求使用有效的客户证书而使用的。
十,见过的反爬技术
登录异常
在之前进行爬取58同城的时候就会发现出现爬取失败的现象,返回去查看的时候就会提醒进行验证登录
笨手段的话,返回去在登录一下
简单的代码手段的话【现学现卖】
使用cookie来实现模拟登录效果的实现
首先是获取到自己的cookie
然后将其复制下来,给他放在headers当中
headers = {
'user-agent': '',
'cookie': ''
}
验证码
https://mp.weixin.qq.com/s/pxB35n_D8bh38LDem3XRRQ
这一部分是copy了一下这篇公众号上的文章内容
文字验证码识别
文字验证码识别的主要方法有两种:OCR 和深度学习。
1. OCR 识别
OCR(Optical Character Recognition,光学字符识别)是一种将图片中的文字转换为可编辑文本的技术。在 Python 中,我们可以使用 tesseract
这个库来实现 OCR 识别。下面是一个简单的示例:
from PIL import Image
import pytesseract
# 打开图片
image = Image.open("captcha.png")
# 识别图片中的文字
text = pytesseract.image_to_string(image)
print("识别结果:", text)
这里需要注意的是,OCR识别对于简单的文字验证码效果较好,但对于复杂的验证码识别率较低。
2. 深度学习识别
深度学习识别是使用神经网络模型来识别验证码,其识别率相对较高。我们可以使用 TensorFlow、Keras 等深度学习框架来搭建模型,然后训练并识别验证码。下面是一个简单的示例:
# ... 此处省略模型搭建和训练的代码 ...
# 加载模型,可网上下载或自己训练,此处不展开训练方法
model = load_model("captcha_model.h5")
# 读取图片
image = load_img("captcha.png", grayscale=True, target_size=(28, 28))
# 预测
prediction = model.predict(image)
print("识别结果:", prediction)
图像验证码识别
图像验证码识别同样可以使用深度学习的方法,但需要对图片进行预处理,提取出物体的特征,然后将其输入到神经网络中进行识别。下面是一个简单的示例:
# ... 此处省略模型搭建和训练的代码 ...
# 加载模型
model = load_model("image_captcha_model.h5")
# 读取图片,并进行预处理
image = load_img("image_captcha.png")
image = preprocess_input(image)
# 预测
prediction = model.predict(image)
print("识别结果:", prediction)
滑动验证码识别
滑动验证码的识别相对较为复杂,通常需要结合图像处理技术、模板匹配等方法。下面是一个简单的示例:
import cv2
# 读取背景图和滑块图
bg_image = cv2.imread("bg_image.png")
slider_image = cv2.imread("slider_image.png")
# 将图片转换为灰度图
gray_bg = cv2.cvtColor(bg_image, cv2.COLOR_BGR2GRAY)
gray_slider = cv2.cvtColor(slider_image, cv2.COLOR_BGR2GRAY)
# 使用模板匹配查找滑块在背景图中的位置
result = cv2.matchTemplate(gray_bg, gray_slider, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
# 计算滑块需要移动的距离
distance = max_loc[0] - slider_image.shape[1] // 2
print("滑块需要移动的距离:", distance)
实行动态,简单的静态爬虫爬取不到完整的
使用自动化库【 Selenium】来解决这个问题,博主没有学过这个库,所以暂时不能在这个位置进行解答
header识别
在写代码的时候最好带上请求头,是启动一个模拟的作业,让网站看不出咱们是爬虫