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的主要内容,如果未能解决你的问题,请参考以下文章