Python学习笔记:常用内建模块6 (urllib)
前言
最近在學習深度學習,已經跑出了幾個模型,但Pyhton的基礎不夠扎實,因此,開始補習Python了,大家都推薦廖雪峰的課程,因此,開始了學習,但光學有沒有用,還要和大家討論一下,因此,寫下這些帖子,廖雪峰的課程連接在這里:廖雪峰
Python的相關介紹,以及它的歷史故事和運行機制,可以參見這篇:python介紹
Python的安裝可以參見這篇:Python安裝
Python的運行模式以及輸入輸出可以參見這篇:Python IO
Python的基礎概念介紹,可以參見這篇:Python 基礎
Python字符串和編碼的介紹,可以參見這篇:Python字符串與編碼
Python基本數據結構:list和tuple介紹,可以參見這篇:Python list和tuple
Python控制語句介紹:ifelse,可以參見這篇:Python 條件判斷
Python控制語句介紹:循環實現,可以參見這篇:Python循環語句
Python數據結構:dict和set介紹Python數據結構dict和set
Python函數相關:Python函數
Python高階特性:Python高級特性
Python高階函數:Python高階函數
Python匿名函數:Python匿名函數
Python裝飾器:Python裝飾器
Python偏函數:Python偏函數
Python模塊:Python模塊
Python面向對象編程(1):Python面向對象
Python面向對象編程(2):Python面向對象(2)
Python面向對象編程(3):Python面向對象(3)
Python面向對象編程(4):Pyhton面向對象(4)
Python面向對象高級編程(上):Python面向對象高級編程(上)
Python面向對象高級編程(中上):Python面向對象高級編程(中上)
Python面向對象高級編程(中下):Python面向對象高級編程(中下)
Python面向對象高級編程(完):Python面向對象高級編程(完)
Python錯誤調試(起):Python調試:起
Python錯誤調試(承):Python調試:承
Python錯誤調試(轉):Python調試:轉
Python錯誤調試(合):python調試:合
Python文件IO編程:Python文件IO
Python文件IO編程2:Python文件IO2
Python文件IO編程3:PYthon文件IO3
Python進程和線程(起):Python進程和線程起
Python進程和線程(承):Python進程和線程承
Python進程和線程(轉):Python進程和線程轉
Python進程和線程(合):Python進程和線程合
Python正則表達式:Python正則表達式
Python學習筆記:常用內建模塊1:Python學習筆記:常用內建模塊1
Python學習筆記:常用內建模塊2:Python學習筆記:常用內建模塊2
Python學習筆記:常用內建模塊3:Python學習筆記:常用內建模塊3
Python學習筆記:常用內建模塊4:Python學習筆記: 常用內建模塊4
Python學習筆記:常用內建模塊5:Python學習筆記: 常用內建模塊5
目錄
- 前言
- 目錄
- Urllib
- Get
- Post
- Handler
- 小結
Urllib
urllib提供了一系列用于操作URL的功能。
Get
urllib的request模塊可以非常方便地抓取URL內容,也就是發送一個GET請求到指定的頁面,然后返回HTTP的響應:
例如,對豆瓣的一個URLhttps://api.douban.com/v2/book/2129650進行抓取,并返回響應:
from urllib import requestwith request.urlopen('https://api.douban.com/v2/book/2129650') 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數據:
Status: 200 OK Date: Sun, 17 Jun 2018 02:08:13 GMT Content-Type: application/json; charset=utf-8 Content-Length: 2138 Connection: close Vary: Accept-Encoding X-Ratelimit-Remaining2: 99 X-Ratelimit-Limit2: 100 Expires: Sun, 1 Jan 2006 01:00:00 GMT Pragma: no-cache Cache-Control: must-revalidate, no-cache, private Set-Cookie: bid=C1Dc6M4Gal4; Expires=Mon, 17-Jun-19 02:08:13 GMT; Domain=.douban.com; Path=/ X-DOUBAN-NEWBID: C1Dc6M4Gal4 X-DAE-Node: brand66 X-DAE-App: book Server: dae Data: {"rating":{"max":10,"numRaters":16,"average":"7.4","min":0},"subtitle":"","author":["廖雪峰"],"pubdate":"2007","tags":[{"count":21,"name":"spring","title":"spring"},{"count":13,"name":"Java","title":"Java"},{"count":6,"name":"javaee","title":"javaee"},{"count":5,"name":"j2ee","title":"j2ee"},{"count":4,"name":"計算機","title":"計算機"},{"count":4,"name":"編程","title":"編程"},{"count":3,"name":"藏書","title":"藏書"},{"count":3,"name":"POJO","title":"POJO"}],"origin_title":"","image":"https://img3.doubanio.com\/view\/subject\/m\/public\/s2552283.jpg","binding":"平裝","translator":[],"catalog":"","pages":"509","images":{"small":"https://img3.doubanio.com\/view\/subject\/s\/public\/s2552283.jpg","large":"https://img3.doubanio.com\/view\/subject\/l\/public\/s2552283.jpg","medium":"https://img3.doubanio.com\/view\/subject\/m\/public\/s2552283.jpg"},"alt":"https:\/\/book.douban.com\/subject\/2129650\/","id":"2129650","publisher":"電子工業出版社","isbn10":"7121042622","isbn13":"9787121042621","title":"Spring 2.0核心技術與最佳實踐","url":"https:\/\/api.douban.com\/v2\/book\/2129650","alt_title":"","author_intro":"","summary":"本書注重實踐而又深入理論,由淺入深且詳細介紹了Spring 2.0框架的幾乎全部的內容,并重點突出2.0版本的新特性。本書將為讀者展示如何應用Spring 2.0框架創建靈活高效的JavaEE應用,并提供了一個真正可直接部署的完整的Web應用程序——Live在線書店(http:\/\/www.livebookstore.net)。\n在介紹Spring框架的同時,本書還介紹了與Spring相關的大量第三方框架,涉及領域全面,實用性強。本書另一大特色是實用性強,易于上手,以實際項目為出發點,介紹項目開發中應遵循的最佳開發模式。\n本書還介紹了大量實踐性極強的例子,并給出了完整的配置步驟,幾乎覆蓋了Spring 2.0版本的新特性。\n本書適合有一定Java基礎的讀者,對JavaEE開發人員特別有幫助。本書既可以作為Spring 2.0的學習指南,也可以作為實際項目開發的參考手冊。","price":"59.8"}如果我們要想模擬瀏覽器發送GET請求,就需要使用Request對象,通過往Request對象添加HTTP頭,我們就可以把請求偽裝成瀏覽器。例如,模擬iPhone 6去請求豆瓣首頁:
from urllib import requestreq = 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的移動版網頁:
...<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0"><meta name="format-detection" content="telephone=no"><link rel="apple-touch-icon" sizes="57x57" href="http://img4.douban.com/pics/cardkit/launcher/57.png" /> ...Post
如果要以POST發送一個請求,只需要把參數data以bytes形式傳入。
我們模擬一個微博登錄,先讀取登錄的郵箱和口令,然后按照weibo.cn的登錄頁的格式以username=xxx&password=xxx的編碼傳入:
from urllib import request, parseprint('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') 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'))如果登錄成功,我們獲得的響應如下:
Status: 200 OK Server: nginx/1.2.0 ... Set-Cookie: SSOLoginState=1432620126; path=/; domain=weibo.cn ... Data: {"retcode":20000000,"msg":"","data":{...,"uid":"1658384301"}}如果登錄失敗,我們獲得的響應如下:
... Data: {"retcode":50011015,"msg":"\u7528\u6237\u540d\u6216\u5bc6\u7801\u9519\u8bef","data":{"username":"example@python.org","errline":536}}Handler
如果還需要更復雜的控制,比如通過一個Proxy去訪問網站,我們需要利用ProxyHandler來處理,示例代碼如下:
proxy_handler = urllib.request.ProxyHandler({'http': 'http://www.example.com:3128/'}) proxy_auth_handler = urllib.request.ProxyBasicAuthHandler() proxy_auth_handler.add_password('realm', 'host', 'username', 'password') opener = urllib.request.build_opener(proxy_handler, proxy_auth_handler) with opener.open('http://www.example.com/login.html') as f:pass小結
urllib提供的功能就是利用程序去執行各種HTTP請求。如果要模擬瀏覽器完成特定功能,需要把請求偽裝成瀏覽器。偽裝的方法是先監控瀏覽器發出的請求,再根據瀏覽器的請求頭來偽裝,User-Agent頭就是用來標識瀏覽器的。
總結
以上是生活随笔為你收集整理的Python学习笔记:常用内建模块6 (urllib)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 用户线程如何修改界面内容_ja
- 下一篇: php cgi模块,PHP5模块和CGI