Python爬虫理论 | (2) 网络请求与响应

在上一篇博客中,我们已经学习了爬虫的基本流程,我们称之为四步曲。如下图所示:

  • 第一步:模拟浏览器向服务器发送请求
  • 第二步:获取服务器响应
  • 第三步:解析响应内容
  • 第四步:保存解析后的数据

在本篇博客中,我们将学习如何用Python代码模拟浏览器向服务器发送请求,主要包含Python爬虫请求库的一些基本用法和写几个小实例进行实战:

目录

1. urllib库

2. requests库

3. 实战 


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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值