前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python网络爬虫02---urllib方式

Python网络爬虫02---urllib方式

原创
作者头像
软件架构师Michael
发布2022-03-01 17:20:09
3410
发布2022-03-01 17:20:09
举报
文章被收录于专栏:软件工程师Michael

本小节我们来了解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库的代码,就能够获得我们想要的网页内容。

  • 请求的URL是什么
  • 传递的参数是什么
  • 如何设置可选的请求头

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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档