目录
Hello! 我是PYmili,一个喜欢敲代码的高中生(准确来说是一个小小的职高学生)。在Python中的爬虫模块,可是一个非常有意思的模块和方向。我们可以在网络上采集自己想要的资料或数据,平时只能一条一条复制的数据或下载不了的文件。我们都可以用Python尝试!但是!我们也不能干犯法的事哦!不然就是....你懂的!不仅仅是Python可以写爬虫,其他语言也可以写爬虫!所以爬虫并不是Python独有的。这一期,我们一起来学习requests库的一些用法!
1.安装Requests库
Python中的requests库可是一个非常强大的库!基本的Get和Post请求,文件数据保存等很多功能。可是写爬虫的一把好手!我们来安装它
pip install requests
什么?你不会怎么输入命令?这样这样!
Win键+R键,输入:cmd
cmd终端输入命令
2.Requests库基本使用方法
GET请求
import requests
url="http://47.108.189.192"
r=requests.get(url=url)
print(r.text)
print(r.status_code)
print(r.cookies)
requests.get()就是一个向网页发起get请求的方法
其中的 r.text 这个参数就是获取网页HTML源代码的方法。
r.status_code 这个参数获取网页返回状态码如果返回200就是没有出错了!
r.cookies 这个参数就是获取你向网页请求时的cookie码如图
获取网页json数据
import requests
url="http://47.108.189.192/API/Requests/requests.json"
r=requests.get(url=url)
print(r.json())
但是.text也可以获取网页数据 为什么要用.text呢?看下方实例
博主个人服务器其中一个requests.html文件:47.108.189.192/API/Requests/requests.html
如果用.text命令去获取网页内容就会使网页json容变成str数据
print(type(r.text))
print(type(r.json()))
如果用.json()就变成json数据。这样就很好处理了。
写入headers参数
import requests
url="http://47.108.189.192/"
headers={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36 Edg/96.0.1054.43",
}
r=requests.get(url=url, headers=headers)
print(r.text)
在这段代码里面填写了heraders参数一般网页没有headers参数就无法爬取所以就可以填写User-Agent或Cookies参数。
那么如何获取User-Agent和Cookies参数呢?打开网页按F12键,打开网络选项
图中指出的就是网页原链接请求文件,单击一下它
里面就有我们想要的所有参数了
.content保存文件
requests可以保存指定的文件,一般是二进制数据文件。
我们来爬取一张网页图片 tmpfile_03264effc93b4c78848028bca9bb546d.txtmt.jpg (1920×1080) (jsdelivr.net)
import requests
import os
url="https://cdn.jsdelivr.net/gh/PYmili/Image_api/Images/tmpfile_03264effc93b4c78848028bca9bb546d.txtmt.jpg"
headers={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36 Edg/96.0.1054.43",
}
r=requests.get(url=url, headers=headers)
path,file=os.path.split(url)
try:
print(url)
with open(f"{file}", "wb") as f:
f.write(r.content)
print("True")
except:
print("False")
这样文件爬取下来了!怎么样?是不是很简单?
POST请求
post请求一般用于API请求数据使用,网页上都是get请求post请求就是可以上传参数使服务器或得参数返回
import requests
import os
url="http://httpbin.org/post"
headers={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36 Edg/96.0.1054.43",
}
data={
"name":"PYmili",
"age":"16"
}#要上传的数据
r=requests.post(url=url, headers=headers, data=data)
print(r.text)
可以看到参数上出现了我们写入的参数,这就是POST请求
Post上传文件
上面说的是Post上传数据,这样我们也可以上传文件。
import requests
url="http://httpbin.org/post"
file={
"file":open("text.txt", "rb")
}
r=requests.post(url=url, files=file)
print(r.text)
获取响应数据
requests中我们要写一些请求数据也就是Heraders参数,但是我们也可以获取一些参数
import requests
url="http://47.108.189.192/"
r=requests.get(url=url)
print(r.headers)
print(r.url)
其中我们获取了heraders的参数和url也就是请求的链接。
SSL验证错误
由于博主找不到好的案例所以就随便 放一下代码实例一下
import requests
url="https://xxxxx"
r=requests.get(url=url, verify=False)
print(r.status_code)
当报错说SSL错误就可以写上上面参数跳过SSL验证
身份验证
在访问一些网站会遇见需要填写账号密码的情况如: http://httpbin.org/digest-auth/auth/user/pass
import requests
from requests.auth import HTTPBasicAuth
url="http://httpbin.org/digest-auth/auth/user/pass"
r=requests.get(url=url, auth=HTTPBasicAuth("username", "password"))
print(r.status_code)
这样我们就可以填写用户和密码
代理IP
当我们爬取一个网站时有时会不成功因为反爬机制及网站禁掉你的ip使其获取不到时就可以使用ip代理,但是你得去买一个代理ip。
import requests
proxies={
"http":"代理ip",
"https":"代理ip"
}
url="https://www.baidu.com"
r=requests.get(url=url, proxies=proxies)
print(r.status_code)
动手练习
我们前面的知识学的差不多了,就可以动手学习一下了,接下来我们爬取一个网站的音乐。
警告:此网站是博主和PYahao个人网站,属于个人财产请勿破坏他人财产!
站点:PYmili And PYahao Home你问我为什么没有域名,我没有?因为我没18。真可怜。
这次要用到正则表达式库,博主在前面写了一篇正则表达式的教程可以参考链接:,Python超详细的正则表达式_PYmili的博客-CSDN博客_python正则表达式
按F12键查看源代码
我们可以看见一个audio标签,<source src=xxx就是音乐地址了,那么代码可以这样写
import requests
import re
import os
url="http://47.108.189.192/"
r=requests.get(url=url)
print(r.status_code)
audio=re.search('<source src="(.*?)".*?</audio>', r.text, re.S)
if audio != None:
_url=audio.group(1).strip('..')
print(_url)
req=requests.get(url=_url)
print(req.status_code)
try:
path,file=os.path.split(_url)
with open(file, "wb")as f:
f.write(req.content)
print("True")
except:
print("False")
else:
pass
完美运行代码,欧耶!
对自己的测试
既然都学了那么多了!应该会爬取网页背景图片了吧!PYmili And PYahao Home 爬取此网站的所有背景图片练练手吧!
有什么问题可以联系我们Q群:706128290
我是PYmili,我们下次再见,拜拜!