本小节我们来了解Python实现爬虫的另一种方式:urllib
1.urllib概述
我们先来了解一下urllib库~
在Python 3以后的版本中,urllib2这个模块已经不单独存在(也就是说当你import urllib2时,系统提示你没这个模
块),urllib2被合并到了urllib中,叫做urllib.request 和 urllib.error
urllib整个模块分为urllib.request, urllib.parse, urllib.error。
urllib是一个包含几个模块来处理请求的库。
分别是:
urllib.request 发送http请求
urllib.error 处理请求过程中,出现的异常。
urllib.parse 解析url
urllib.robotparser 解析robots.txt 文件
在爬虫的基本原理中,我们已经讲过,爬虫的第一个步骤是获取网页,urllib库就是用来实现这个功能:向服务器发送请求,得到服务器响应,获取网页的内容。
Python的强大就在于提供了功能齐全的类库,来帮助我们完成这个请求,通过调用urllib库,我们不需要了解请求的数据结构,HTTP、TCP、IP层的网络传输通信,以及服务器应答原理等等。
我们只需要关心以下三点,然后通过几行调用urllib库的代码,就能够获得我们想要的网页内容。
2.urllib爬取网页的实例
import urllib.request
import json
# 接收一个字符串作为参数
r = urllib.request.urlopen('http://httpbin.org/get')
# 读取response的内容
text = r.read()
print(text)
# http返回状态码和msg
print(r.status, r.reason)
r.close()
# 返回的内容是json格式,直接用Load函数加载
obj = json.loads(text)
print(obj)
# r.headers是一个HTTPMessage对象
# print(r.headers)
for k, v in r.headers._headers:
print('%s: %s' % (k, v))
ua = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) ' \
'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77' \
' Safari/537.36'
# 添加自定义的头信息
req = urllib.request.Request('http://httpbin.org/user-agent')
req.add_header('User-Agent', ua)
# 接收一个urllib.request.Request对象作为参数
r = urllib.request.urlopen(req)
resp = json.load(r)
# 打印出httpbin网站返回信息里的user-agent
print("user-agent: ", resp["user-agent"])
# 发起带basic auth的请求
auth_handler = urllib.request.HTTPBasicAuthHandler()
auth_handler.add_password(realm='Fake Realm',
uri='http://httpbin.org',
user='guye',
passwd='123456')
opener = urllib.request.build_opener(auth_handler)
urllib.request.install_opener(opener)
r = urllib.request.urlopen('http://httpbin.org/basic-auth/guye/123456')
print(r.read().decode('utf-8'))
# 使用GET参数
params = urllib.parse.urlencode({'spam': 1, 'eggs':2, 'bacon': 2})
url = 'http://httpbin.org/get?%s' % params
with urllib.request.urlopen(url) as f:
print(json.load(f))
# 使用POST方法传递参数
data = urllib.parse.urlencode({'name': '小明', 'age': 2})
data = data.encode()
with urllib.request.urlopen('http://httpbin.org/post', data) as f:
print(json.load(f))
===============================================================================================
【执行结果】:
b'{\n "args": {}, \n "headers": {\n "Accept-Encoding": "identity", \n "Host": "httpbin.org", \n "User-Agent": "Python-urllib/3.6", \n "X-Amzn-Trace-Id": "Root=1-621de4c4-30e4b1d4625f4b696d8326e9"\n }, \n "origin": "221.224.46.34", \n "url": "http://httpbin.org/get"\n}\n'
200 OK
{'args': {}, 'headers': {'Accept-Encoding': 'identity', 'Host': 'httpbin.org', 'User-Agent': 'Python-urllib/3.6', 'X-Amzn-Trace-Id': 'Root=1-621de4c4-30e4b1d4625f4b696d8326e9'}, 'origin': '221.224.46.34', 'url': 'http://httpbin.org/get'}
Date: Tue, 01 Mar 2022 09:17:56 GMT
Content-Type: application/json
Content-Length: 274
Connection: close
Server: gunicorn/19.9.0
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36
{
"authenticated": true,
"user": "guye"
}
{'args': {'bacon': '2', 'eggs': '2', 'spam': '1'}, 'headers': {'Accept-Encoding': 'identity', 'Host': 'httpbin.org', 'User-Agent': 'Python-urllib/3.6', 'X-Amzn-Trace-Id': 'Root=1-621de4c6-3d868bf573d064db3189869f'}, 'origin': '221.224.46.34', 'url': 'http://httpbin.org/get?spam=1&eggs=2&bacon=2'}
{'args': {}, 'data': '', 'files': {}, 'form': {'age': '2', 'name': '小明'}, 'headers': {'Accept-Encoding': 'identity', 'Content-Length': '29', 'Content-Type': 'application/x-www-form-urlencoded', 'Host': 'httpbin.org', 'User-Agent': 'Python-urllib/3.6', 'X-Amzn-Trace-Id': 'Root=1-621de4c7-68c9542d761dd73601531ab8'}, 'json': None, 'origin': '221.224.46.34', 'url': 'http://httpbin.org/post'}
Process finished with exit code 0
3.小结
urllib提供的功能就是利用程序去执行各种HTTP请求。如果要模拟浏览器完成特定功能,需要把请求伪装成浏览器。伪装的方法是先监控浏览器发出的请求,再根据浏览器的请求头来伪装,User-Agent头就是用来标识浏览器的。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。