欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python單例模式獲取IP代理的方法詳解

 更新時間:2018年09月13日 08:38:21   作者:vinter_he  
在使用python對網(wǎng)頁進程訪問時,以防被禁止,可用使用代理IP的方法減少被禁的可能,下面這篇文章主要給大家介紹了關(guān)于python單例模式獲取IP代理的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧

引言

最近在學習python,先說一下我學Python得原因,一個是因為它足夠好用,完成同樣的功能,代碼量會比其他語言少很多,有大量的豐富的庫可以使用,基本上前期根本不需要自己造什么輪子。第二個是因為目前他很火,網(wǎng)上各種資料都比較豐富,且質(zhì)量尚可。接下來不如正題

在學習Python爬蟲的時候,經(jīng)常會遇見所要爬取的網(wǎng)站采取了反爬取技術(shù)導致爬取失敗。高強度、高效率地爬取網(wǎng)頁信息常常會給網(wǎng)站服務(wù)器帶來巨大壓力,所以同一個IP反復爬取同一個網(wǎng)頁,就很可能被封,這里講述一個爬蟲技巧,設(shè)置代理IP

為什么需要代理

提到python,雖然他能干的事情很多,但是我們首先想起的一般都是爬蟲。爬蟲的作用是通過抓取網(wǎng)頁,分析并獲得網(wǎng)頁中的內(nèi)容。像php這類語言也是可以用curl來達到爬蟲的效果,不過論爬蟲庫的數(shù)量和易用性就沒辦法和python相比了。

對網(wǎng)絡(luò)知識有了解的朋友應(yīng)該知道,很多網(wǎng)站都有反爬蟲的策略,或者是針對同一ip地址頻繁請求會拒絕服務(wù),我在剛開始寫一些東西的時候就經(jīng)常因為訪問的頻率太頻繁而被禁。所以說僅用自己的ip地址進行爬取是有一定的局限性的。而代理就可以解決這個問題。

代理是什么

作為一個程序員我覺得有必要了解一些基本的網(wǎng)絡(luò)知識,比如說網(wǎng)絡(luò)代理。

我不想從哪里復制粘貼一段介紹過來,因為我覺得那樣很low,我說說我理解的網(wǎng)絡(luò)代理。

如果你不了解代理,你應(yīng)該知道代購吧,比如你想買一個東西,卻不想自己跑去買,可以找一個代理幫你去買。類似的,網(wǎng)絡(luò)代理也是在你和目的網(wǎng)絡(luò)之間的一個中轉(zhuǎn)方。類似如下圖

Alice->agency(代理): I want to get sth from Bob
agency(代理)->Bob: give me sth
Note right of Bob: Bob thinks
Bob-->agency(代理): there is sth!
agency(代理)-->Alice: bob give you sth

這里有一個問題是,普通代理是比較好檢測出來的,有些網(wǎng)站不允許使用代理訪問。這時候可以使用高匿代理可以解決這個問題。關(guān)于代理不多說了,有興趣的可以自己去了解。

從哪里獲取代理

這問題就簡單了,直接百度搜索網(wǎng)絡(luò)代理可以搜索到很多免費的,免費的一般不太穩(wěn)定,應(yīng)付日常需求應(yīng)該沒問題。如果需要穩(wěn)定代理還是老老實實的花錢買付費的好一些,不要因小失大。

比如網(wǎng)上就經(jīng)常推薦的代理

西祠代理:http://www.xicidaili.com/nn/

本文用的快代理:https://www.kuaidaili.com/

西祠我一開始也用了,后來因為頻繁訪問被禁用過一次,幾天后才解禁,在這期間我換成了快代理并去重寫了規(guī)則每小時獲取一次代理。

代碼

本文用的python版本為3.6.5, 如果使用2.7版本的代碼需要微調(diào)

User-Agent

用來模擬不同的瀏覽器,直接復制就可以了,我的文件名為user_agents.py

#!/usr/bin/python
# -*- coding:utf-8 -*-
'''
Created on 2018-04-27

@author: Vinter_he
'''

user_agents = [
 'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11',
 'Opera/9.25 (Windows NT 5.1; U; en)',
 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)',
 'Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.5 (like Gecko) (Kubuntu)',
 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20070731 Ubuntu/dapper-security Firefox/1.5.0.12',
 'Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/1.2.9'
 
 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
 "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
 "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
 "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
 "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
 "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
 "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
 "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
 "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
 "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
 "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
 "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
 "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
]
獲取代理代碼
#!/usr/bin/python
# -*- coding:utf-8 -*-
'''

獲取快代理ip 獲取到的為https://...格式

'''
from lxml import etree
import sys ,user_agents ,random ,requests ,time

class geKuaidailiIp:
 __instance = None
 #使用單例模式
 def __new__(cls):
  if cls.__instance == None:
   cls.__instance = object.__new__(cls)
   cls.init(cls)
  return cls.__instance

 def init(self):
  print('初始化')
  self.proxieList = []
  self.lastTime = time.time() - 3601
  self.agencyUrl = 'https://www.kuaidaili.com/free/'
  self.userAgents = user_agents.user_agents
 # 獲取user-agent
 def getUserAgent(self):
  userAgent = random.choice(self.userAgents)
  return {
   'User-Agent': userAgent
  }

 def getHtml(self,url):
  response = requests.get(url = url ,headers = self.getUserAgent(),timeout = 10).text
  # sys.exit()
  html = etree.HTML(response)
  return html
 #取一頁的分析代理ip
 def parseHtmlToGetIpList(self,url):

  #獲取代理ip地址 只取前五頁
  html = self.getHtml(url)
  ip = html.xpath('//tr/td[@data-title = "IP"]')
  port = html.xpath('//tr/td[@data-title = "PORT"]')
  type = html.xpath('//tr/td[@data-title = "類型"]')
  return type, ip, port
 # 取五頁數(shù)據(jù)并進行拼接成一個list
 def getProxies(self):
  # 1小時獲取一次代理 否則會被禁
  if time.time() - self.lastTime > 60*60:
   self.proxieList =[]
   self.lastTime = time.time()
   #只取前五頁,因為后面的失效的會比較多,看自己需要
   for i in range(5):
    url = self.agencyUrl+'inha/'+str(i+1)+"/"
    type,ip,port = self.parseHtmlToGetIpList(url)
    count = len(port)
    for i in range(count):
     self.proxieList.append(type[i].text+"://"+ip[i].text+":"+port[i].text)
    time.sleep(1)
   print('獲取代理')
  return self.proxieList

 def getRandomAgencyIp(self):
  self.getProxies()
  ip = random.choice(self.proxieList)
  return ip


#初始化代理 用來進行測試用
# agency = geKuaidailiIp()
# while True:
#
#  print(agency.getRandomAgencyIp())
#  time.sleep(random.randint(4,10))

為什么使用單例模式

如果你可以保證自己只創(chuàng)建一個代理對象的話,其實并不是必須使用單例模式。因為很多朋友可能會把創(chuàng)建對象的代碼寫在循環(huán)中,導致頻繁的獲取代理而導致自己的ip被代理方禁了。單例模式保證在一次執(zhí)行腳本過程中只有一個對象。如果對象已經(jīng)創(chuàng)建,則直接返回已經(jīng)創(chuàng)建的對象,從而控制不會頻繁的訪問快代理的頁面。代碼中是一小時一次。

題外話

其實早在七八年前上學期間我就接觸過python,那時候python沒有現(xiàn)在那么火,我還是在查怎么成為一名黑客的時候查到的這是一個必修課。然而當時還是比較貪玩的,學習資料也很匱乏。所以不就久放棄了?,F(xiàn)在在人工智能和大數(shù)據(jù)的帶動下,前幾天看統(tǒng)計,python已經(jīng)成了排名第一的腳本語言(php是世界上最好的語言,哥哥們別噴我),所以我?guī)讉€月前開始每天抽一點業(yè)余時間學習python。幸運的是我有三門語言基礎(chǔ),學習起來還算比較輕松。如果你也是一名程序員,并且有精力也希望你能在業(yè)余時間做點什么學點什么來提高自己,與大家共勉。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • python爬蟲使用正則爬取網(wǎng)站的實現(xiàn)

    python爬蟲使用正則爬取網(wǎng)站的實現(xiàn)

    這篇文章主要介紹了python爬蟲使用正則爬取網(wǎng)站的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • python?matplotlib實現(xiàn)條形圖的填充效果

    python?matplotlib實現(xiàn)條形圖的填充效果

    這篇文章主要為大家詳細介紹了python?matplotlib實現(xiàn)條形圖的填充效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • python切片操作方法的實例總結(jié)

    python切片操作方法的實例總結(jié)

    所謂切片就是在某個數(shù)據(jù)里提取需要的部分,提取到的是某個索引下的值,或者索引區(qū)間的值,下面這篇文章主要給大家介紹了關(guān)于python切片操作方法的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-06-06
  • 通過Folium在地圖上展示數(shù)據(jù)Python地理可視化的入門示例詳解

    通過Folium在地圖上展示數(shù)據(jù)Python地理可視化的入門示例詳解

    這篇文章主要介紹了通過Folium在地圖上展示數(shù)據(jù)Python地理可視化的入門,在本文中,我們介紹了如何使用Python中的Folium庫進行地理可視化,通過Folium,我們可以輕松地創(chuàng)建交互式地圖,并在地圖上展示數(shù)據(jù)、繪制形狀、添加圖例和文本標簽等,需要的朋友可以參考下
    2024-05-05
  • OpenCV-Python實現(xiàn)懷舊濾鏡與連環(huán)畫濾鏡

    OpenCV-Python實現(xiàn)懷舊濾鏡與連環(huán)畫濾鏡

    很多時候通過ps可以做很多效果,今天我們來介紹使用OpenCV-Python實現(xiàn)懷舊濾鏡與連環(huán)畫濾鏡,具有一定的參考價值,感興趣的可以了解一下
    2021-06-06
  • python實現(xiàn)學生通訊錄管理系統(tǒng)

    python實現(xiàn)學生通訊錄管理系統(tǒng)

    這篇文章主要為大家詳細介紹了python實現(xiàn)學生通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • 一篇文章帶你入門python之推導式

    一篇文章帶你入門python之推導式

    這篇文章主要為大家詳細介紹了python的推導式,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • Python實現(xiàn)按特定格式對文件進行讀寫的方法示例

    Python實現(xiàn)按特定格式對文件進行讀寫的方法示例

    這篇文章主要介紹了Python實現(xiàn)按特定格式對文件進行讀寫的方法,可實現(xiàn)文件按原有格式讀取與寫入的功能,涉及文件的讀取、遍歷、轉(zhuǎn)換、寫入等相關(guān)操作技巧,需要的朋友可以參考下
    2017-11-11
  • 利用Python實現(xiàn)外觀數(shù)列求解

    利用Python實現(xiàn)外觀數(shù)列求解

    這篇文章主要介紹了利用Python實現(xiàn)外觀數(shù)列求解,文章利用舉例說明文章的主題內(nèi)容,具有一定的參考價值,需要的小伙伴樂意參考一下
    2022-03-03
  • 解析Pytorch中的torch.gather()函數(shù)

    解析Pytorch中的torch.gather()函數(shù)

    本文給大家介紹了Pytorch中的torch.gather()函數(shù),通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-11-11

最新評論