首頁  >  文章  >  後端開發  >  一篇文章帶你去搞定Python中urllib函式庫(操作網址)

一篇文章帶你去搞定Python中urllib函式庫(操作網址)

Go语言进阶学习
Go语言进阶学习轉載
2023-07-25 14:08:04801瀏覽

一、操作URL

urllib提供了一系列用於操作URL的功能。分類講解相關內容。


二、Get()

urllib的request 模組可以非常方便地抓取URL內容,也就是發送一個GET請求到指定的頁面,然後回傳HTTP的回應:

例如,對豆瓣的URLhttps://api.growingio.com/v2/22c937bbd8ebd703f2d8e9445f7dfd03/web/pv?stm=1593747087078進行抓取,並返迴響應:

一篇文章帶你去搞定Python中urllib函式庫(操作網址)

from urllib import request


with request.urlopen('https://api.growingio.com/v2/22c937bbd8ebd703f2d8e9445f7dfd03/web/pv?stm=1593747087078') as f:
    data = f.read()
    print('Status:', f.status, f.reason)
    for k, v in f.getheaders():
        print('%s: %s' % (k, v))
    print('Data:', data.decode('utf-8'))

可以看到HTTP回應的頭和JSON資料:

一篇文章帶你去搞定Python中urllib函式庫(操作網址)

如果要想模擬瀏覽器發送GET請求,就需要使用Request對象,透過往Request物件加入HTTP頭,就可以把請求偽裝成瀏覽器。例如,模擬iPhone 6去請求豆瓣首頁:

from urllib import request


req = request.Request('http://www.douban.com/')
req.add_header('User-Agent', 'Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25')
with request.urlopen(req) as f:
    print('Status:', f.status, f.reason)
    for k, v in f.getheaders():
        print('%s: %s' % (k, v))
    print('Data:', f.read().decode('utf-8'))

這樣豆瓣會回傳適合iPhone的行動版網頁:

一篇文章帶你去搞定Python中urllib函式庫(操作網址)


三、Post()

一篇文章帶你去搞定Python中urllib函式庫(操作網址)

如果要以POST傳送一個請求,只需要把參數data#以bytes形式傳入。

#

模拟一个微博登录,先读取登录的邮箱和口令,然后按照weibo.cn的登录页的格式以username=xxx&password=xxx的编码传入:

一篇文章帶你去搞定Python中urllib函式庫(操作網址)

from urllib import request, parse


print('Login to weibo.cn...')
#电子邮件
email = input('Email: ')
#密码
passwd = input('Password: ')
#相关的参数
login_data = parse.urlencode([
    ('username', email),
    ('password', passwd),
    ('entry', 'mweibo'),
    ('client_id', ''),
    ('savestate', '1'),
    ('ec', ''),
    ('pagerefer', 'https://passport.weibo.cn/signin/welcome?entry=mweibo&r=http%3A%2F%2Fm.weibo.cn%2F')
])
#网址请求
req = request.Request('https://passport.weibo.cn/sso/login')
req.add_header('Origin', 'https://passport.weibo.cn')
#构造User-Agent
req.add_header('User-Agent', 'Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25')
req.add_header('Referer', 'https://passport.weibo.cn/signin/login?entry=mweibo&res=wel&wm=3349&r=http%3A%2F%2Fm.weibo.cn%2F')


with request.urlopen(req, data=login_data.encode('utf-8')) as f:
    print('Status:', f.status, f.reason)
    for k, v in f.getheaders():
        print('%s: %s' % (k, v))
    print('Data:', f.read().decode('utf-8'))

如果登录成功,获得的响应如下:

一篇文章帶你去搞定Python中urllib函式庫(操作網址)

如果登录失败,获得的响应如下:

一篇文章帶你去搞定Python中urllib函式庫(操作網址)


四、Handler

如果还需要更复杂的控制,比如通过一个Proxy去访问网站,需要利用ProxyHandler来处理,示例代码如下:

import urllib.request


# 构建了两个代理Handler,一个有代理IP,一个没有代理IP


httpproxy_handler = urllib.request.ProxyHandler({"https": "27.191.234.69:9999"})


nullproxy_handler = urllib.request.ProxyHandler({})


# 定义一个代理开关


proxySwitch = True 


# 通过 urllib.request.build_opener()方法使用这些代理Handler对象,创建自定义opener对象


# 根据代理开关是否打开,使用不同的代理模式


if proxySwitch:


    opener = urllib.request.build_opener(httpproxy_handler)
else:
    opener = urllib.request.build_opener(nullproxy_handler)




request = urllib.request.Request("http://www.baidu.com/") 


# 1. 如果这么写,只有使用opener.open()方法发送请求才使用自定义的代理,而urlopen()则不使用自定义代理。


response = opener.open(request)


# 2. 如果这么写,就是将opener应用到全局,之后所有的,不管是opener.open()还是urlopen() 发送请求,都将使用自定义代理。


# urllib.request.install_opener(opener)


# response = urllib.request.urlopen(request)




# 获取服务器响应内容


html = response.read().decode("utf-8")
  
# 打印结果


print(html)

如果代理成功返回网址的信息。

一篇文章帶你去搞定Python中urllib函式庫(操作網址)

如果網址出錯或代理位址有誤,回傳下面介面。

一篇文章帶你去搞定Python中urllib函式庫(操作網址)


#五、總結

        使用Python語言,能夠幫助大家有更好的學習Python。 urllib提供的功能就是利用程式去執行各種HTTP請求。如果要模擬瀏覽器完成特定功能,需要把請求偽裝成瀏覽器。偽裝的方法是先監控瀏j覽器發出的請求,再根據瀏覽器的請求頭來偽裝,User-Agent頭就是用來識別瀏覽器的。

#

以上是一篇文章帶你去搞定Python中urllib函式庫(操作網址)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:Go语言进阶学习。如有侵權,請聯絡admin@php.cn刪除