赞
踩
以下所有爬取的网站都是可以爬取的,爬取时请先学学法律哦~
如有侵权,私信删除~
本章目录~。~
1,Requests是一个Python中的HTTP库,用于向Web服务器发送HTTP请求并获取响应。Requests库的使用方式与urllib库类似,但更加简单和灵活。Requests库支持HTTPS请求,并且可以自动处理cookies和会话,使得操作更加方便。
Requests库的主要特点如下:
2,安装下载
pip install requests
3,了解GET请求和POST请求
HTTP中最常见的两种请求GET和OPST。
GET请求:就是在浏览器中输入网址加回车就是GET请求,请求参数会直接包含到网址里,例如我们在百度搜索爬虫关键字,就会包含到请求的URL中
POST请求:大多数在提交表单时发起的,例如在登录页面输入账号密码后,点击登录后通常以POST请求将数据以表单的形式传输,不会提现在URL中
GET和POST是两种最常见的HTTP请求方法,它们在客户端与服务器之间传输数据时有一些关键区别:
- import requests as rq #别名为rq
-
- # 该网页会判断客户端发起的请求是否为GET请求
- url = "https://www.httpbin.org/get"
- rq = rq.get(url) # 发起GET请求
- print(rq.text) # 将内容转为text格式
如果成功发送了GET请求那么会返回一下结果:
例如,我们要出入name值和age值:
- import requests as rq
-
- # 设定参数,以字典的形式传入
- data = {
- "name": "张三",
- "age": "22"
- }
- # 该网页会判断客户端发起的请求是否为GET请求
- url = "https://www.httpbin.org/get"
- rq = rq.get(url, params=data) # 发起GET请求,并用params传入设定参数
- print(rq.text) # 将内容转为text格式
传入的参数中如果带中文,那么久会自动转为十六进制的信息
如图:
1.3,返回JSON格式数据方法
如果网页返回的类型虽然是str类型,但是它时JSON格式,如果想直接解析并返回结果,得到一个json格式的数据,可以直接调用json方法:
- import requests as rq
-
-
- # 该网页会判断客户端发起的请求是否为GET请求
- url = "https://www.httpbin.org/get"
- rq = rq.get(url) # 发起GET请求,并用params传入设定参数
- print(f"字符串格式:{type(rq.text)}") # 直接返回的格式类型为字符串
- print(f"转为json格式:{type(rq.json())}") # 转为json格式
- print(f"json格式输出内容:{rq.json()}") # 转为json格式
可以发现调用json格式的字符串转为了字典
我想抓取以下网页的电影标签:Scrape | Movie
进入网页--摁F12进入开发者模式---用左上角 小箭头点击电影名字,可以看到该名字在h2的二号标题下
当我们想抓取该网站的时候会出现以下错误:
requests.exceptions.SSLError: HTTPSConnectionPool(host='ssr1.scrape.center', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:997)')))
当出现该错误表示 “请求异常,SSL错误”解决办法就是引用urllib3的disable_warnings()来关闭警告,在用verify=False的方式关闭ssl认证,但还有其他方式请走链接:
- import requests as rq
- import urllib3
- urllib3.disable_warnings() # 关闭不安全请求警告
-
-
- url = "https://ssr1.scrape.center/"
- # 发起GET请求,并用params传入设定参数,传入 verify=False 避免ssl认证
- request = rq.get(url, verify=False)
- print(request.text) # 以text的格式返回
抓取到网页返回结果以后,想要提取h2包裹的电影名称,那么我们就用正则表达式的方式去提取
那么正则表达式不熟悉的小伙伴请走一下链接:
(16条消息) Python3正则表达式_i鲸落i的博客-CSDN博客
那么我们截取h2标题下的内容就可以了:
- import requests as rq
- import urllib3
- import re
-
- urllib3.disable_warnings() # 关闭不安全请求警告
-
-
- url = "https://ssr1.scrape.center/"
- # 发起GET请求,并用params传入设定参数,传入 verify=False 避免ssl认证
- request = rq.get(url, verify=False)
- pattern = re.compile('<h2.*?>(.*?)</h2>', re.S) # 截取h2标题的内容,包括换行符在内的任意字符(. 不包括换行符)
- titles = re.findall(pattern, request.text)
- print(titles)
抓取后的内容:
例如我们要抓取莫网站的免费音乐下载到本地:
打开网页---点到音乐详情---摁F12打开开发者模式----找到.mp3结尾的网址,发起请求即可
例如:
我们知道图片,视频,音频这些文件本质上就是二进制吗组成的,所以我们在抓取网页的时候,将抓取的信息以二进制的信息转为字节码格式写入到文件中,保存下来就是一个完整的文件
文件写入,读取不会的可以走以下链接:
链接先等等 马上补上0.0 或者 自行百度,回头我会更新哈~
- import requests as rq
-
- url = "https://lu-sycdn.kuwo.cn/dddd43c69c11a0cf9a27988208dea300/645c9a7e/resource/n3/6/44/3638605905.mp3"
- request = rq.get(url)
- # 当我们直接抓取返回数据的时候是二进制数据,会乱码,所以我们要将二进制码写到文件中
- with open('可能.mp3', 'wb') as f:
- # content 转为字节码,也就是转为二进制的方式写入文件中
- f.write(request.content)
抓取后的效果: 双击就可以播放啦
在上面的实验中我们没有添加请求头部,这样的话在某些网站会发现这并不是一个正常的浏览器发送的请求信息,于是返回错误的结果或者异常报错,所以我们添加请求头部的方式如下:
随便找一个网页打开---摁下F12---找到user-Agent,就是你浏览器的头部信息,复制下来并以字典的格式定义一个变量加入到访问请求中
在请求网页的时候加入:
- import requests as rq
-
- # 定义请求头部
- headers = {
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.62"
- }
-
- url = "https://lu-sycdn.kuwo.cn/dddd43c69c11a0cf9a27988208dea300/645c9a7e/resource/n3/6/44/3638605905.mp3"
- request = rq.get(url, headers=headers) # 将请求头部加入到get访问请求中
POST请求与GET请求类似,例如:我们访问一个可以测试post的网页
- import requests as rq
-
-
- # 定义请求头部
- headers = {
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.62"
- }
-
- data = {'name': "zhangsan", "password": "123456"} # 定义发起请求的数据
- url = "https://www.httpbin.org/post" # 测试post请求的网址
- request = rq.post(url=url, headers=headers, data=data) # data字样就是定义传输的数据所用
- print(request.text)
会将我们的内容传入到网页中,并返回
当我们用post请求访问网页的时候,如何将页面中的信息(状态码,响应头等)返回呢?
- import requests as rq
-
-
- # 定义请求头部
- headers = {
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.62"
- }
-
- # data = {'name': "zhangsan", "password": "123456"}
- url = "https://www.baidu.com"
- request = rq.get(url=url, headers=headers)
- print(f"访问网页状态码:{request.status_code}")
- print(f"访问网页头部信息:{request.headers}")
- print(f"访问网页cookies:{request.cookies}")
- print(f"访问网页网址:{request.url}")
- print(f"访问网页历史:{request.history}")
测试结果:
----------------------------------以上就是request的基本操作-----------------------------------------------
requests库高级用法,例如文件上传,Cookie设置,代理设置等
我们随便传一张很小的图片到网页上试试看:
- import requests as rq
-
-
- # 定义请求头部
- headers = {
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.62"
- }
-
- data = {'picture': open('1.png', 'rb')} # 以二进制的方式读取文件内容
- url = "https://httpbin.org/post"
- request = rq.post(url, files=data) # 将文件以二进制的方式传入到网页中
- print(request.text)
-
运行结果:
上传文件后,网站会返回响应,响应中包含files字段和from字段,而from字段是空的,证明文件上传部分会单独用一个files字段来标识
3.2.1Cookie的作用:
Cookie是一种用于在Web应用程序中保存敏感信息,例如登录信息、个人身份验证码等,以便在用户与Web应用程序之间提供一个安全的通信通道。
Cookie的作用如下:
需要注意的是,Cookie的使用也存在一些安全风险,如跨站脚本攻击(XSS)和中间人攻击等,因此应该采取一些措施来保护Web应用程序和用户的安全。
3.2.2获取Cookie:
当我们打开一个网页的时候---摁F12打开开发者模式----接着找到右边的cookie即可
找到cookie以后将他加入到我们访问的头部即可,以字典的形式添加
例如:
在访问请求时加入即可
简介:
Session(会话)是一种在Web应用程序中用于管理用户身份验证和数据共享的机制。在Web应用程序中,每个用户都有一个唯一的会话ID,用于标识他们在Web应用程序中的身份。会话是用户与Web应用程序之间的关键部分,它允许用户在应用程序中进行相互操作,例如创建、更改和删除表单数据、上传文件和浏览历史记录等。
在传统的Web应用程序中,会话通常由服务器端的脚本语言(如PHP、Python和Ruby)或服务器端的框架(如Apache和Nginx)来管理。这些脚本或框架会在每次用户请求时生成一个新的会话ID,并将其存储在服务器端的数据库中。每次用户请求的响应都会包含一个包含新会话ID的响应头,以便服务器可以识别当前会话的状态。
在现代的Web应用程序中,会话管理已经变得更加容易和自动化。许多Web服务器和框架都提供了内置的会话管理功能,例如Nginx的session
模块和PHP的session
函数。这些功能可以自动处理会话的创建、存储、刷新和销毁等操作,并确保会话的安全性和可靠性。
为了维护会话,Web应用程序通常会在用户请求的处理过程中跟踪当前会话的状态,并在用户会话结束时将其状态刷新为“不活动”状态。这可以通过在服务器端存储会话ID并在每次请求的响应头中包含一个过期时间来实现。当用户会话过期时,服务器会将其状态刷新为“不活动”状态,并从数据库中删除相关数据。这可以通过定期重置会话ID和清理无用数据来确保会话的高可用性和安全性。
request如何实现呢?
例如:
- import requests as rq
-
- # 首先加入Session会话保持
- s = rq.Session()
- # 在访问请求的时候加入往里面传入的cookies # “/number/123”这就是我们加入的cookies
- url = "https://www.httpbin.org/cookies/set/number/123"
- request = s.get(url)
- print(request.text)
输出结果:
所以,利用Session可以做到模拟同一个会话而不用担心cookie的问题,它通常在模拟登录成功之后,进行下一次操作的时会用到。
当我们访问一个网页的时候会出现,如图的问题,那么我门通过代码的方式绕开ssl认证,直接访问网页内容:
例如:
我们访问该网页 https://ssr2.scrape.center/
SLL证书提示:“连接不是私密连接”
我们通过get请求直接访问会出现以下问题:
requests.exceptions.SSLError: HTTPSConnectionPool(host='ssr2.scrape.center', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate (_ssl.c:997)')))
通过以下方式绕开:
# 在请求网页的时候将verify参数设置为False 表示忽略ssl证书验证
- import requests as rq
-
- url = "https://ssr2.scrape.center/"
- # 在请求网页的时候将verify参数设置为False 表示忽略ssl证书验证
- request = rq.get(url,verify=False)
- print(request.text)
这样访问网页会提示我们url的证书时无效的,不过页面内容以及反馈给我们了:
消除以上提示的方法如下:
看这个博客即可,上面也有类似的问题,所以这个地方是给直接跳到这部分的小伙伴看的哈~
(42条消息) requests.exceptions.SSLError 请求异常,SSL错误,证书认证失败问题解决_Xin学数据的博客-CSDN博客
当我们访问一个页面的时候为了提升效率设置一个超时时间,如果规定时间内没有及时反馈信息,那么我们就让它异常报错即可,我们在请求中加入timeout参数即可
请求分为两个阶段:连接(connect)和读取(read)
以下是timeout的几种写法:
- import requests as rq
-
- url = "https://www.baidu.com/"
- # 超过0.1秒没有反馈,就抛出异常
- request = rq.get(url, timeout=0.1)
- # 如果分别指定作用连接和读取的timeout 可以传入一个元组的方式
- request = rq.get(url, timeout=(5, 30))
- # 如果想永久等待 直接等于None,或者直接不加
- request = rq.get(url, timeout=None)
- request = rq.get(url)
当我们遇到以下页面的时候,需要输入账户密码:
这个网站就是启用了基本身份认证
我门想得到该网页的信息用代码登录的方法如下:
可以通过requests库自带的身份验证功能auth参数
- import requests as rq
- from requests.auth import HTTPBasicAuth
- import urllib3
-
- # 关闭安全警告
- urllib3.disable_warnings()
-
- url = "https://ssr3.scrape.center"
- request = rq.get(url, auth=HTTPBasicAuth('admin', 'admin'), verify=False)
- print(request.status_code) # 返回该网页请求的状态码
- print(request.text) # 将网页内容以text格式返回
运行结果:
在我们访问网站在测试的时候,请求几次都可得到返回的内容,但开始大规模爬取,频繁请求的时候,这些网页会跳出验证码或者其他认证网页,也可能直接对你的IP进行封禁,导致一定时间无法访问,那么为了防止这种情况,我们需要代理设置来解决问题,这时候需要用到proxies参数。当然还有一种方式那就是挂vpn。这里并不就不尝试了,就来说说proxies参数
使用 requests 库发送请求时,可以通过设置 proxies 参数来使用代理服务器。proxies 参数是一个字典,包含 http 和 https 两个键,分别对应 http 和 https 请求的代理地址。
- import requests as rq
-
- proxies = {
- "http:": "http://1.234.178.32:24200",
- "https:": "http://1.234.178.32:24200"
- }
-
- # 网页
- url = "http://httpbin.org/ip"
- # proxies 代理参数
- request = rq.get(url, proxies=proxies)
- print(request.status_code) # 网页请求返回值,200为正常
- print(request.text.encode("utf-8")) # 将网页内容以text格式返回,字符级为utf8
在上述代码中,我们首先定义了一个proxies字典,其中包含http和https两个键,分别对应代理服务器的地址。然后,在发送http请求时,我们将proxies参数设置为proxies字典,requests库会自动使用代理服务器发送请求。最后,我们打印出响应内容。
注意,在设置代理服务器地址时,必须包含连接方式(http或https)。同时,需要根据实际需要选择代理服务器的地址和端口号。
运行结果:
该ip是你的本机ip地址,如果网页有反代理技术,那么可以使用vpn的方式破解
还有一种代理方式SOCKS:
SOCKS代理是一种计算机代理服务器,它能够为用户提供更高级别的网络连接和数据传输服务。SOCKS代理是一种全能代理,支持多种网络协议和数据传输方式,包括HTTP、FTP、SSH等。它可以将一端的系统连接到另外一端,提供更高效、更安全的数据传输服务。SOCKS代理标准端口为1080。
这里不进行演示了~自行研究吧~
#注意:这里有代理,那么就有反向代理
反向代理(Reverse Proxy)是一种代理服务器技术,它主要用于将来自客户端的请求转发到后端服务器。反向代理服务器位于后端服务器的前端,它接收来自客户端的请求,并将其转发到后端服务器。后端服务器处理完请求后,将结果返回给反向代理服务器,反向代理服务器再将结果返回给客户端。
反向代理的主要功能包括缓存、负载均衡和安全性。它可以缓存静态内容,减少对后端服务器的请求,提高网站的性能和可靠性。同时,反向代理还可以作为负载平衡器,将请求路由到多个后端服务器,提高网站的并发能力和可用性。此外,反向代理还可以隔离客户端和后端服务器,提高网站的安全性。
反向代理可以通过两种方式实现:一种是多个网站的web服务器提供代理,其域名都指向反向代理服务器;另一种是为网站的web服务器集群提供代理,反向代理作为负载平衡器来决定哪个Web服务器接收请求。
总之,反向代理是一种重要的代理服务器技术,它可以提供缓存、负载均衡和安全性等功能,提高网站的性能、可靠性和安全性。
反向代理的技术让我们电脑端的ip一样会出现在网页中:
本次内容大概这么多,感谢观看~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。