这是我参与2022首次更文挑战的第19天,活动详情查看:2022首次更文挑战」
详细代码ref:code 接上回,requests库的使用
抓取二进制的数据
之前的例子,我们都是抓取的整个页面,实际上返回的都是HTML文档,那么我们想抓取图片音频视频该怎么做呢? 比如抓取示例站点的图标:
import requests
r = requests.get("https://scrape.center/favicon.ico")
print(r.text)
print(r.content)
得到的结果:
令我惊讶的是,第一个输出的结果,r.text竟然是乱码,第二个得到的结果有b/开头说明是bytes类型的数据.我们将得到的数据保存下来,代码如下:
with open("facicon.ico",'wb') as f:
f.write(r.content)
在我们项目的当前路径下就完成了保存这个信息. 这里用到了open方法,第一个参数其实是文件名字,第二个参数代表的是二进制写的形式打开文件,可以像文件里写入二进制数据. 同样的,我们也就可以利用这种方式获取音频和视频文件.
添加请求头
正如我们前面学过的urllib可以添加请求头,requests也可以添加请求头,而且更简单,同时某些网站会发现,这些请求不是正常的浏览器发出的,于是可能返回我们想不到的的一些结果,导致最后抓取网页失败. 添加请求头:
import requests
headers = {
"User-Agent" : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36',
}
r = requests.get("https://ssr1.scrape.center/",headers=headers)
print(r.text)
POST 请求
我们会了get请求,另外一种很常见的请求是POST请求
import requests
data = {
'name': "flynt",
"age":"24"
}
r = requests.post("https://www.httpbin.org/post",data)
print(r.text)
结果就不发了,免得说我凑字数,跟urllib的结果是一样的
响应
发送请求后,自然就会得到响应, 我们可以得到响应的状态码啊,响应头啊,Cookie等等,
import requests
r = requests.get("https://ssr1.scrape.center/")
print(r.status_code)
print(r.headers)
print(r.cookies)
print(r.url)
print(r.history)
结果:
200
{'Date': 'Wed, 02 Feb 2022 12:45:10 GMT', 'Content-Type': 'text/html; charset=utf-8', 'Content-Length': '41538', 'Connection': 'keep-alive', 'Server': 'Lego Server', 'Cache-Control': 'max-age=600', 'Expires': 'Wed, 02 Feb 2022 12:55:10 GMT', 'X-Frame-Options': 'DENY', 'X-Content-Type-Options': 'nosniff', 'Strict-Transport-Security': 'max-age=15724800; includeSubDomains', 'X-NWS-LOG-UUID': '2dc87d28-3698-40f1-a454-1bbebefa7d9a', 'X-Cache-Lookup': 'Cache Miss', 'X-Daa-Tunnel': 'hop_count=1'}
<RequestsCookieJar[]>
https://ssr1.scrape.center/
[]
好了到这里了,明天去学习一下,怎样使用POST上传文件和Cookie设置