亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

深入解析Python中的urllib2模塊

2020-01-04 17:57:36
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了Python中的urllib2模塊,包括一個利用其抓取網站生成RSS的小例子,需要的朋友可以參考下

Python 標準庫中有很多實用的工具類,但是在具體使用時,標準庫文檔上對使用細節描述的并不清楚,比如 urllib2 這個 HTTP 客戶端庫。這里總結了一些 urllib2 的使用細節。

Proxy 的設置

Timeout 設置

在 HTTP Request 中加入特定的 Header

Redirect

Cookie

使用 HTTP 的 PUT 和 DELETE 方法

得到 HTTP 的返回碼

Debug Log

Proxy 的設置

urllib2 默認會使用環境變量 http_proxy 來設置 HTTP Proxy。如果想在程序中明確控制 Proxy 而不受環境變量的影響,可以使用下面的方式

 

 
  1. import urllib2 
  2. enable_proxy = True 
  3. proxy_handler = urllib2.ProxyHandler({"http" : 'http://some-proxy.com:8080'}) 
  4. null_proxy_handler = urllib2.ProxyHandler({}) 
  5.  
  6. if enable_proxy: 
  7. opener = urllib2.build_opener(proxy_handler) 
  8. else
  9. opener = urllib2.build_opener(null_proxy_handler) 
  10.  
  11. urllib2.install_opener(opener) 

這里要注意的一個細節,使用 urllib2.install_opener() 會設置 urllib2 的全局 opener 。這樣后面的使用會很方便,但不能做更細粒度的控制,比如想在程序中使用兩個不同的 Proxy 設置等。比較好的做法是不使用 install_opener 去更改全局的設置,而只是直接調用 opener 的 open 方法代替全局的 urlopen 方法。

Timeout 設置

在老版 Python 中,urllib2 的 API 并沒有暴露 Timeout 的設置,要設置 Timeout 值,只能更改 Socket 的全局 Timeout 值。

 

 
  1. import urllib2 
  2.  
  3.  
  4. import socket 
  5. socket.setdefaulttimeout(10) # 10 秒鐘后超時 
  6. urllib2.socket.setdefaulttimeout(10) # 另一種方式 

在 Python 2.6 以后,超時可以通過 urllib2.urlopen() 的 timeout 參數直接設置。

 

 
  1. import urllib2 
  2. response = urllib2.urlopen('http://www.google.com', timeout=10) 

在 HTTP Request 中加入特定的 Header

要加入 header,需要使用 Request 對象:

 

 
  1. import urllib2 
  2. request = urllib2.Request(uri) 
  3. request.add_header('User-Agent''fake-client'
  4. response = urllib2.urlopen(request) 

對有些 header 要特別留意,服務器會針對這些 header 做檢查

User-Agent : 有些服務器或 Proxy 會通過該值來判斷是否是瀏覽器發出的請求

Content-Type : 在使用 REST 接口時,服務器會檢查該值,用來確定 HTTP Body 中的內容該怎樣解析。常見的取值有:

application/xml : 在 XML RPC,如 RESTful/SOAP 調用時使用

application/json : 在 JSON RPC 調用時使用

application/x-www-form-urlencoded : 瀏覽器提交 Web 表單時使用

在使用服務器提供的 RESTful 或 SOAP 服務時, Content-Type 設置錯誤會導致服務器拒絕服務

Redirect

urllib2 默認情況下會針對 HTTP 3XX 返回碼自動進行 redirect 動作,無需人工配置。要檢測是否發生了 redirect 動作,只要檢查一下 Response 的 URL 和 Request 的 URL 是否一致就可以了。

 

 
  1. import urllib2 
  2. response = urllib2.urlopen('http://www.google.cn'
  3. redirected = response.geturl() == 'http://www.google.cn' 

如果不想自動 redirect,除了使用更低層次的 httplib 庫之外,還可以自定義 HTTPRedirectHandler 類。

 

 
  1. import urllib2 
  2.  
  3. class RedirectHandler(urllib2.HTTPRedirectHandler): 
  4. def http_error_301(self, req, fp, code, msg, headers): 
  5. pass 
  6. def http_error_302(self, req, fp, code, msg, headers): 
  7. pass 
  8.  
  9. opener = urllib2.build_opener(RedirectHandler) 
  10. opener.open('http://www.google.cn'

Cookie

urllib2 對 Cookie 的處理也是自動的。如果需要得到某個 Cookie 項的值,可以這么做:

 

  1. import urllib2 
  2. import cookielib 
  3.  
  4. cookie = cookielib.CookieJar() 
  5. opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie)) 
  6. response = opener.open('http://www.google.com'
  7. for item in cookie: 
  8. if item.name == 'some_cookie_item_name'
  9. print item.value 

使用 HTTP 的 PUT 和 DELETE 方法

urllib2 只支持 HTTP 的 GET 和 POST 方法,如果要使用 HTTP PUT 和 DELETE ,只能使用比較低層的 httplib 庫。雖然如此,我們還是能通過下面的方式,使 urllib2 能夠發出 PUT 或 DELETE 的請求:

 

 
  1. import urllib2 
  2.  
  3. request = urllib2.Request(uri, data=data) 
  4. request.get_method = lambda: 'PUT' # or 'DELETE' 
  5. response = urllib2.urlopen(request) 

得到 HTTP 的返回碼

對于 200 OK 來說,只要使用 urlopen 返回的 response 對象的 getcode() 方法就可以得到 HTTP 的返回碼。但對其它返回碼來說,urlopen 會拋出異常。這時候,就要檢查異常對象的 code 屬性了:

 

 
  1. import urllib2 
  2. try
  3. response = urllib2.urlopen('http://restrict.web.com'
  4. except urllib2.HTTPError, e: 
  5. print e.code 
  6. Debug Log 

使用 urllib2 時,可以通過下面的方法把 debug Log 打開,這樣收發包的內容就會在屏幕上打印出來,方便調試,有時可以省去抓包的工作

 

 
  1. import urllib2 
  2.  
  3. httpHandler = urllib2.HTTPHandler(debuglevel=1) 
  4. httpsHandler = urllib2.HTTPSHandler(debuglevel=1) 
  5. opener = urllib2.build_opener(httpHandler, httpsHandler) 
  6.  
  7. urllib2.install_opener(opener) 
  8. response = urllib2.urlopen('http://www.google.com'

PS: 借助urllib2抓取網站生成RSS

看了看OsChina的博客頁面,發現可以使用python來抓取.記得前段時間看到有人使用python的RSS模塊PyRSS2Gen生成了RSS.于是忍不住手癢自己試著實現了下,幸好還是成功了,下面代碼共享給大家.

首先需要安裝PyRSS2Gen模塊和BeautifulSoup模塊,pip安裝下就好了,我就不再贅述了.

下面貼出代碼

 

 
  1. # -*- coding: utf-8 -*- 
  2.  
  3.  
  4. from bs4 import BeautifulSoup 
  5. import urllib2 
  6.  
  7. import datetime 
  8. import time 
  9. import PyRSS2Gen 
  10. from email.Utils import formatdate 
  11. import re 
  12. import sys 
  13. import os 
  14. reload(sys) 
  15. sys.setdefaultencoding('utf-8'
  16.  
  17.  
  18.  
  19.  
  20. class RssSpider(): 
  21. def __init__(self): 
  22. self.myrss = PyRSS2Gen.RSS2(title='OSChina'
  23. link='http://my.oschina.net'
  24. description=str(datetime.date.today()), 
  25. pubDate=datetime.datetime.now(), 
  26. lastBuildDate = datetime.datetime.now(), 
  27. items=[] 
  28. self.xmlpath=r'/var/www/myrss/oschina.xml' 
  29.  
  30. self.baseurl="http://www.oschina.net/blog" 
  31. #if os.path.isfile(self.xmlpath): 
  32. #os.remove(self.xmlpath) 
  33. def useragent(self,url): 
  34. i_headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) / 
  35. AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36", / 
  36. "Referer"'http://baidu.com/'
  37. req = urllib2.Request(url, headers=i_headers) 
  38. html = urllib2.urlopen(req).read() 
  39. return html 
  40. def enterpage(self,url): 
  41. pattern = re.compile(r'/d{4}/S/d{2}/S/d{2}/s/d{2}/S/d{2}'
  42. rsp=self.useragent(url) 
  43. soup=BeautifulSoup(rsp) 
  44. timespan=soup.find('div',{'class':'BlogStat'}) 
  45. timespan=str(timespan).strip().replace('/n','').decode('utf-8'
  46. match=re.search(r'/d{4}/S/d{2}/S/d{2}/s/d{2}/S/d{2}',timespan) 
  47. timestr=str(datetime.date.today()) 
  48. if match: 
  49. timestr=match.group() 
  50. #print timestr 
  51. ititle=soup.title.string 
  52. div=soup.find('div',{'class':'BlogContent'}) 
  53. rss=PyRSS2Gen.RSSItem( 
  54. title=ititle, 
  55. link=url, 
  56. description = str(div), 
  57. pubDate = timestr 
  58.  
  59. return rss 
  60. def getcontent(self): 
  61. rsp=self.useragent(self.baseurl) 
  62. soup=BeautifulSoup(rsp) 
  63. ul=soup.find('div',{'id':'RecentBlogs'}) 
  64. for li in ul.findAll('li'): 
  65. div=li.find('div'
  66. if div is not None: 
  67. alink=div.find('a'
  68. if alink is not None: 
  69. link=alink.get('href'
  70. print link 
  71. html=self.enterpage(link) 
  72. self.myrss.items.append(html) 
  73. def SaveRssFile(self,filename): 
  74. finallxml=self.myrss.to_xml(encoding='utf-8'
  75. file=open(self.xmlpath,'w'
  76. file.writelines(finallxml) 
  77. file.close() 
  78.  
  79.  
  80.  
  81. if __name__=='__main__'
  82. rssSpider=RssSpider() 
  83. rssSpider.getcontent() 
  84. rssSpider.SaveRssFile('oschina.xml')  

可以看到,主要是使用BeautifulSoup來抓取站點然后使用PyRSS2Gen來生成RSS并保存為xml格式文件.

順便共享下我生成的RSS地址

 

 
  1. http://104.224.129.109/myrss/oschina.xml 

大家如果不想折騰的話直接使用feedly訂閱就行了.

腳本我會每10分鐘執行一次的.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品国产老师黑色丝袜高跟鞋| 在线国产精品视频| 久久久久国产一区二区三区| 亚洲香蕉av在线一区二区三区| 国产精品日本精品| 国产精品亚洲欧美导航| 中文字幕在线日韩| 中文字幕亚洲在线| 一本一本久久a久久精品综合小说| 中文亚洲视频在线| 国产日韩在线亚洲字幕中文| 中日韩美女免费视频网站在线观看| 国产精品吊钟奶在线| 久久综合久久美利坚合众国| 亚洲国产美女精品久久久久∴| 91精品视频播放| 日韩大陆欧美高清视频区| 成人国产精品日本在线| 国产精品v片在线观看不卡| 欧美大尺度激情区在线播放| 亚洲激情成人网| 97av在线影院| 欧美国产欧美亚洲国产日韩mv天天看完整| 91麻豆国产精品| 亚洲国产日韩欧美在线动漫| 夜色77av精品影院| 欧美福利视频在线观看| 亚洲三级 欧美三级| 国产精品嫩草影院久久久| 日av在线播放中文不卡| 日韩最新免费不卡| 欧美大片在线影院| 国产亚洲精品综合一区91| 精品欧美国产一区二区三区| 亚洲综合中文字幕在线观看| 日韩成人在线网站| 久久人人爽人人爽爽久久| 日韩av大片免费看| 91久久久久久久久久| 日韩欧美高清在线视频| 国产精品偷伦一区二区| 欧美国产日韩中文字幕在线| 91最新在线免费观看| 色伦专区97中文字幕| 久久韩国免费视频| 亚洲欧美日韩爽爽影院| 国产精品久久久久免费a∨大胸| 国产999在线观看| 中文字幕在线观看日韩| 91视频8mav| 国产视频综合在线| 亚洲一区二区久久久| 国产成人精品久久| 91久久精品美女高潮| 欧美激情精品在线| 国产91色在线|| 青青精品视频播放| 精品久久久久久中文字幕大豆网| 欧美在线观看日本一区| 欧美丰满片xxx777| 亚洲国产精品一区二区三区| 欧美日韩ab片| 成人黄色中文字幕| 久久亚洲成人精品| 狠狠久久亚洲欧美专区| 91在线视频导航| 国产精品久久久久久久久久久久| 亚洲jizzjizz日本少妇| 久久91精品国产91久久久| 亚洲第一区在线观看| 欧美天堂在线观看| 成人羞羞国产免费| 欧美激情国产日韩精品一区18| 91精品视频大全| 日韩高清免费在线| 久久精品国产久精国产思思| 57pao成人永久免费视频| 992tv在线成人免费观看| 成人免费视频在线观看超级碰| 中文字幕亚洲自拍| 欧美大片免费观看在线观看网站推荐| www.欧美三级电影.com| 色偷偷噜噜噜亚洲男人| 国产精品吹潮在线观看| 高清视频欧美一级| 中文字幕亚洲专区| 国产97在线亚洲| 91精品视频大全| 亚洲精品在线看| 中文字幕欧美精品日韩中文字幕| 久久精品人人做人人爽| 日韩av一区二区在线观看| 日本老师69xxx| 欧美日本亚洲视频| 91日韩在线视频| 日韩在线国产精品| 国产小视频国产精品| 欧美第一黄网免费网站| 韩国精品美女www爽爽爽视频| 日韩免费在线看| 亚洲视频视频在线| 狠狠久久亚洲欧美专区| 欧美成年人在线观看| 久久精品福利视频| 国产69精品久久久久久| 精品国产自在精品国产浪潮| 日韩专区中文字幕| 亚洲网站在线观看| 精品国产欧美一区二区五十路| 久久久久久尹人网香蕉| 日韩福利伦理影院免费| 亚洲美女在线观看| 性色av香蕉一区二区| 青草成人免费视频| 国模私拍一区二区三区| 欧美电影电视剧在线观看| 国产一区二区日韩| 7m精品福利视频导航| 国内成人精品一区| 国产在线精品一区免费香蕉| 精品久久久久国产| 欧美裸身视频免费观看| 国产精品成熟老女人| 95av在线视频| 欧美福利小视频| 91av在线不卡| 欧美激情一二三| 亚洲精品网址在线观看| 欲色天天网综合久久| 久久99久久亚洲国产| 国产一区二区三区网站| 97久久精品在线| 国产精品69久久久久| 91精品国产色综合久久不卡98| 伊人成人开心激情综合网| 欧美成人全部免费| 欧美丰满少妇xxxxx做受| 久久伊人91精品综合网站| 欧美性猛交xxxx乱大交蜜桃| 久久国产一区二区三区| 97av在线播放| 精品国产一区二区三区在线观看| 精品国产鲁一鲁一区二区张丽| 国产精品流白浆视频| 亚洲图中文字幕| 国内精品久久久久伊人av| 亚洲天堂影视av| 久久久久久免费精品| 国内精品久久影院| 日韩中文字幕精品| 庆余年2免费日韩剧观看大牛| 成人动漫网站在线观看| 日韩欧美极品在线观看| 日韩欧美精品网址| 久久中文字幕一区| 久久久免费高清电视剧观看| 欧美一级片久久久久久久| 91精品国产九九九久久久亚洲| 2018中文字幕一区二区三区| 91av在线不卡| 精品久久久一区二区| 日韩成人高清在线| 欧洲亚洲免费视频| 91精品国产网站|