在上一篇博客中,我们已经学习了爬虫的基本流程,我们称之为四步曲。如下图所示:
- 第一步:模拟浏览器向服务器发送请求
- 第二步:获取服务器响应
- 第三步:解析响应内容
- 第四步:保存解析后的数据
在本篇博客中,我们将学习如何用Python代码模拟浏览器向服务器发送请求,主要包含Python爬虫请求库的一些基本用法和写几个小实例进行实战:
目录
1. urllib库
- urllib、urllib2、requests库的说明
在python2中,urllib和urllib2都是内置标准库,通过url打开资源,其中urllib只能接受url,无法对请求进行headers的伪装,有时请求会被很多网站阻挡。而urllib2则可以接受一个Request对象,并可设置URL的headers。因此,二者通常配合一起使用。最常用的方法是urllib.urlopen(),用于发送请求。
在python3中,urllib和urllib2已经整合为urllib。发送请求的方法为:urllib.request.urlopen()。
requests是第三方库,功能强大,需要安装导入。
注意:在学习网络上的开源代码时,一定要注意Python的版本。
- urllib库
urllib是python3内置的HTTP请求库,官方文档。
包含以下四个模块:
1. urllib.request :HTTP请求模块,模拟发送请求。(该模块包含urlopen()方法和Request类)
2. urllib.error:异常处理模块,捕获请求错误。(该模块包含URLError类和HTTPError类)
3. urllib.parse:URL解析模块,URL 拆分、解析、合并等。(该模块包含urlparse方法,ParseResult类,parse_qs、parse_qsl、urlunparse、urlsplit、urlunsplit、urljoin、quote、quote_plus、unquote、unquote_plus、urlencode方法)
4. urllib.robotparser:robots.txt解析模块,识别网站的robots.txt 文件。(该模块包含RobotFileParser类)
- urllib.request模块
1. urllib.request中的urlopen()方法
urllib.request模块中的urlopen()提供了最基本的构造HTTP 请求的方法,利用它可以模拟浏览器的一个请求发起过程,同时它还提供处理授权验证,重定向,cookies功能。
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
主要参数说明:
url:待请求的网址
data:请求体内容,请求方式为POST
timeout:超时时间,单位为秒。若超时,就会抛出异常
返回值:
该方法的返回值是一个http.client.HTTPResponse对象,该对象包括以下属性和方法:
1)status属性:响应状态
2)read():获取响应内容
3)getheaders():获取响应头
实例:
import urllib.request
#发送url请求
response = urllib.request.urlopen('https://www.python.org')
#打印页面信息
print(response.read().decode('utf-8'))
print("---------------")
#查看结果类型
print(type(response))
print("---------------")
#状态码
print(response.status)
#头部信息
print("---------------")
print(response.getheaders())
#服务器信息
print("---------------")
print(response.getheaders('Server'))
注意获取头部信息使用方法是getheaders(),而获取头部信息中的某个信息如服务器信息,使用的是getheader().
2. urllib.request中的Request类
如果请求中需要加入Headers 等更详细的信息,就需要利用更强大的Request 类来构建一个请求。
class urllib.request.Request (url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
主要参数说明:
url:待请求的网址
data:请求体的内容
headers:请求头
origin_req_host:请求方的host名称或着IP地址
unverifiable:该请求有无验证,默认值False(表示无法验证)
method:请求的方法
返回值:
返回Request类的一个对象。
注意headers可以在构建Request对象时当作参数传入,也可以使用构建的Request对象调用add_header()方法来进行添加:
req = request.Request(url=url,data=data,method='POST')
req.add_header('User-Agent','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36')
实例:
import urllib.request
#普通方式
req = urllib.request.Request('https://www.baidu.com')
response = urllib.request.urlopen(req)
print(response.read().decode('utf-8'))
from urllib import request,parse
#增强方式
url = 'https://httpbin.org/post'
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36',
'Host':'httpbin.org'
}
dict = {
'name':'CoreJT'
}
data = bytes(parse.u