requests.get和urlopen的比较
urlopen
详解见:https://blog.csdn.net/qq_41845823/article/details/119465293
requests.get
详解见:https://blog.csdn.net/qq_41845823/article/details/119516178
urlopen简介
urlopen
是urllib
库中的一个方法,简单用法为urllib.request.urlopen(url)
,返回的是一个http.client.HTTPResponse
对象。其实不了解这个对象没关系,一般我们是想用这个方法来爬取一些静态页面上的数据,这个是完全没问题的,直接用该对象的
read()
方法读出即可,不过可能涉及到转码,具体如下操作:import urllib.request # 看清楚是http协议,不是https协议,现在去用该方法获取百度的源码,https是拿不到的 response = urllib.request.urlopen('http://www.baidu.com') print(response.read().decode('utf-8'))
该方法可以满足我们大部分的需求,这就是
python
的强大。
requests.get简介
requests
库是比urllib
库更加方便地爬虫库,简单用法为requests.get(url)
,返回是一个requests.models.Response
对象同样地,我们可以不了解这个对象,只需要会用就行。
对返回对象取
text
即可获得网页内容,取content
即可获得二进制流来获取图片,视频,音频等文件。
区别
在简单地获取响应用法上两者没有区别,没有什么谁比谁好之说
但是网络协议并不是这么简单
比如请求包含四部分(有的地方还有请求空行):
- 请求行
- 请求头
- 请求体
每一部分都包含有网络请求协议中的一些重要信息,比较常见的就是请求头部的user-agent
、cookies
等信息,或者post
请求中添加的键值,或者代理、认证等功能,在这方面两者的差异就显现出来了。
- 发起不同请求时,比如
post
请求:在urlopen中要在方法内部添加设置好的参数data
详见urlopen
详解见,data
需要转码;而requests
库中只需要放到data
参数中使用request.post()
方法即可 - 设置代理:在
urlopen
中需要以proxy_handler
作为参数使用urllib.request.build_opener
获得一个opener
,最后使用opener.open('http://httpbin.org/post')
来设置代理并发送请求;而在requests
中只需要在requests.get()
方法中添加proxies
参数即可 - 还有
cookies
等信息,在requests
库中可以直接获得
总结
urlopen
和requests.get
方法都能满足最基本的爬取数据的需求,在这点上没有什么区别,但是在爬取一些安全性比较高的网站的时候,需要进行代理,用户等信息的设置,只能说requests.get
设置起来更加方便,但是两者爬取的效果是相同的。
注
爬虫大家都听说过scrapy
框架,但是需要注意的是,在进行爬取数据的时候,最常用的还是requests
而并不是scrapy
框架,只有一些非常大的数据才会使用到框架,比如需要爬取GB,TB
大小的数据,而requests
并不是为scrapy
做基础,requests
能满足我们大部分的需求。