python3网络爬虫学习——使用requests

Posted gausstu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python3网络爬虫学习——使用requests相关的知识,希望对你有一定的参考价值。

reuqests库中有很多便捷的方法,比如以GET方式获得网页,在requests库中就是方法get(),上代码

import requests
r = requests.get(\'https://www.baidu.com\')
print(type(r))
print(r.status_code)
print(type(r.text))
print(r.text)
print(r.cookies)

相当于urlopen的方法,得到一个Response对象,然后分别输出他的类型,状态码,相应体的类型,内容以及Cookies

requests还有许多的方法比如post,put,delete,head,options等分别表示其请求

由于HTTP中最常见的就是GET请求,因此下面用其来构建一个GET请求实例:

  • 基本实例
import requests
data = {
        \'name\':\'germey\',
        \'age\':\'22\'
        }
#也可以不用创建data字典,直接把网址后面加上“?name=germey&age=22"但这样明显麻烦很多
r = requests.get(\'http://httpbin.org/get\',params = data)
print(r.text)
#网页返回的是str类型,JSON格式的,我们可以用json方法将JSON格式的字符串转化为字典
print(r.json()) runfile(\'F:/Python/exercise/pygame/untitled0.py\', wdir=\'F:/Python/exercise/pygame\') { "args": { "age": "22", "name": "germey" }, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Connection": "close", "Host": "httpbin.org", "User-Agent": "python-requests/2.18.4" }, "origin": "182.108.3.27", "url": "http://httpbin.org/get?name=germey&age=22" } {\'args\': {\'age\': \'22\', \'name\': \'germey\'}, \'headers\': {\'Accept\': \'*/*\', \'Accept-Encoding\': \'gzip, deflate\', \'Connection\': \'close\', \'Host\': \'httpbin.org\', \'User-Agent\': \'python-requests/2.18.4\'}, \'origin\': \'182.108.3.27\', \'url\': \'http://httpbin.org/get?name=germey&age=22\'}

但要注意的是如果不是JSON格式便会出现解析错误json.decoder.JSONDecodeError错误

  • 抓取二进制数据

在抓取网页中,我们抓取的是一个页面,也就是一个HTML文件,如果想抓取图片,音频,视频等文件,则需要抓取他们的二进制文件,再将它们解码得到

import requests
r = requests.get("https://github.com/favicon.ico")
print(r.text)
print(r.content)

打开后我们是这样的

 

 可以看出其有两个属性,一个是text属性,其为Unicode类型的文件,也就是符号集类型,其中英文字母其还是为英文,但中文字符就会表示为乱码的形式,一个为content属性,其为二进制形式的类型,开头有一个b表示其文件类型

再添加代码打开文件

with open(\'facicon.ico\',\'wb\') as f:
    f.write(r.content)

其中open函数的第一个参数为图片名称,第二个参数为以二进制方式打开,然后就会发现在当前文件夹下存储了一个名为favicon.ico的图标

不过这里我有一点疑惑,为何不是存储为一个包含这些二进制代码的txt文本文件,我猜测是因为,在读写文件的时候,电脑现将这个二进制编码进行转换,转得到的文件类型为ico则存为ico,为字符串则存为txt,那么应该在这个二进制文件里包含了存储为何种类型文件的信息

有的时候,有些网站可能禁止我们访问,这个时候加上User-agent就可以了,只要在requests.get(\'url\',headers=\'   \')就可以了

2.post请求

import requests
data = {\'name\':\'germy\',\'age\':\'22\'}
r = requests.post("https://httpbin.org/post",data=data)
print(r.text)
print(r.content)

{
"args": {},
"data": "",
"files": {},
"form": {
"age": "22",
"name": "germy"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Connection": "close",
"Content-Length": "17",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.18.4"
},
"json": null,
"origin": "218.64.33.30",
"url": "https://httpbin.org/post"
}

b\'{\\n "args": {}, \\n "data": "", \\n "files": {}, \\n "form": {\\n "age": "22", \\n "name": "germy"\\n }, \\n "headers": {\\n "Accept": "*/*", \\n "Accept-Encoding": "gzip, deflate", \\n "Connection": "close", \\n "Content-Length": "17", \\n "Content-Type": "application/x-www-form-urlencoded", \\n "Host": "httpbin.org", \\n "User-Agent": "python-requests/2.18.4"\\n }, \\n "json": null, \\n "origin": "218.64.33.30", \\n "url": "https://httpbin.org/post"\\n}\\n\'

可以得到返回结果,其中form就是提交的数据,这就证明POST请求提交成功了

可以通过requests.status_code得到状态码,此外还有history,url,cookies,headers等属性

import requests
r = requests.get("http://www.jianshu.com")
exit() if  r.status_code == requests.codes.ok else print("Request Successfully")

显示为Request Successfully

当然requests.codes有ok这个条件码,我们用这个条件码可以得到相应的状态码200,当然我们可不止这一个条件码,还有很多

 

以上是关于python3网络爬虫学习——使用requests的主要内容,如果未能解决你的问题,请参考以下文章

python3网络爬虫学习——基本库的使用

python3网络爬虫系统学习:第一讲 基本库urllib

Python3网络爬虫——Requests库的基本使用

在python3中使用urllib.request编写简单的网络爬虫

python3网络爬虫笔记

爬虫学习requests模块的使用