爬取静态网页数据

01什么是urllib库

urllib库是Python内置的HTTP请求库,他可以看作处理URL的组件集合。

urllib库包含的四大模块:

  1. urllib.request:请求模块
  2. urllib.error:异常处理模块
  3. urllib.parse:URL解析模块
  4. urllib.robotparser:robots.txt解析模块

02快速使用urllib爬取网页

import urllib.request
# 调用urllib.request库的URLopen()方法,并传入一个url
response=urllib.request.urlopen('http://www.baidu.com')
# 使用read()方法读取获取到的网页内容
html=response.read().decode('UTF-8')
# 打印网页内容
print(html)

上述案例就是一个简单的爬取网页的案例,爬取网页结果如下:

实际上,在浏览器打开百度首页,右击选择“查看页面源代码”命令,和刚刚打印出来的内容是一样的。

分析urlopen方法

上一小节有个核心代码:

response=urllib.request.urlopen('http://www.baidu.com')

改代码调用的是urllib.request模块中的urlopen()方法,他传入了一个百度首页的URL,使用的协议是HTTP,这是urlopen方法最简单的用法。

urlopen()方法可以接受多个参数,格式为:

urllib.requset.urlopen(url,data=None,[timeout,]*,cafile=None,
capath=None,cadefault=False,context=None)

使用HTTPResponse对象

使用urllib.request模块中的URLopen()方法发送HTTP请求后,服务器返回的响应内容封装在一个HTTPResponse类型的对象中。

import urllib.request
response=urllib.request.urlopen('http://www.itcast.cn')
print(type(response))

结果为:

<class'http.client.HTTPResponse'>

从输出结果来看,HTTPResponse类属于http.client模块,该类提供了获取URL,状态码,响应内容等一系列的方法。常见如下:

使用一段代码演示这些方法的使用,如下:

构造Request对象

如果希望对请求执行复杂操作,则需要创建一个Request对象来作为urlopen方法的参数

import urllib.request
# 将url作为Request()方法的参数,构造并返回一个Request对象
request = urllib.request.Request('http://www.baidu.com')
# 将Request对象作为urlopen方法的参数,发送给服务器并接收响应
response = urllib.request.urlopen(request)
# 使用read()方法读取获取到的网页内容
html=response.read().decode('UTF-8')
# 打印网页内容
print(html)

在构建请求时,除了必须设置的url参数外,还可以加入其他内容,例如:

03使用urllib实现数据传输

url编码转换:

当传递的url包含中文或者其他特殊符号时,需要使用urllib.parse库中的urlencode方法将url进行编码。他可以将“key:value”这样的键值对转换成“key=value”这样的字符串。

import urllib.parse
data = {
    'a':'传智播客',
    'b':'黑马程序员'
}
result = urllib.parse.urlencode(data)
print(result)

结果:

反之,解码使用的是url.parse库的unquote()方法:

添加特定Headers--请求伪装:

对于一些需要登入的网站,如果不是从浏览器发出的请求,是不能获得响应内容的。伪装浏览器需要自定义请求报头,也就是在发送Request请求时,加入特定的Headers

04代理服务器

简单的自定义opener

opener是urllib.request.OpenerDirector类的对象,我们之前一直都在使用的urlopen,就是模块帮我们构建好的一个opener

自定义opener需要执行下列三个步骤:

设置代理服务器:

我们可以使用urllib.request中的ProxyHandler方法来设置代理服务器。

免费开放代理的获取基本没有成本,可以在一些代理网站上收集这些免费代理

05常见的网络异常

当使用urlopen()方法发送HTTP请求时,如果urlopen()不能返回的响应内容,就会产生错误。

URLError产生错误的原因主要有以下几种:

  1. 没有连接网络
  2. 服务器连接失败
  3. 找不到指定的服务器

可以使用try...except语句捕获相应的异常。例如:

import urllib.request
import urllib.error
request = urllib.request.Request("https://www.baidu.com")
try:
    urllib.request.urlopen(request,timeout = 5)
except urllib.error.URLError as err:
    print(err)

运行程序后,输出结果为:

<urlopen error [Error 11001] getaddrinfo failed>

实训:

requests库--以中国气象局天气预报为例:

	import pprint
import requests
 
url = "https://aqiapp.daqi110.com/report/cityinfo?city=%E6%9F%B3%E5%B7%9E&place=1"
response = requests.get(url)  # get到网址
response.encoding = "utf-8"
result_html = response.text
result_data = response.json()  # 获取网址对应的json数据
pprint.pprint(result_data)
 
print("城市:" + result_data['city'])
print("PM2.5:" + str(result_data['pm25']))

小结:

简单的介绍了什么是urllib库,让读者更加快速上手urllib案例,以及一些使用技巧,包括:urllib传输数据,添加Headers,简单自定义opener,这些都是常使用的技巧多加练习,就能熟练掌握了

  • 21
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值