歡迎加入QQ討論群258996829
麥子學(xué)院 頭像
蘋果6袋
6
麥子學(xué)院

Python的單例模式如何獲取IP代理?

發(fā)布時(shí)間:2018-05-04 23:36  回復(fù):0  查看:3411   最后回復(fù):2018-05-04 23:36  
本文和大家分享的主要是python單例模式獲取ip代理相關(guān)內(nèi)容,一起來看看吧,希望對(duì)大家 學(xué)習(xí)python 有所幫助。
  為什么需要代理
  提到python,雖然他能干的事情很多,但是我們首先想起的一般都是爬蟲。爬蟲的作用是通過抓取網(wǎng)頁,分析并獲得網(wǎng)頁中的內(nèi)容。像php這類語言也是可以用curl來達(dá)到爬蟲的效果,不過論爬蟲庫(kù)的數(shù)量和易用性就沒辦法和python相比了。
  對(duì)網(wǎng)絡(luò)知識(shí)有了解的朋友應(yīng)該知道,很多網(wǎng)站都有反爬蟲的策略,或者是針對(duì)同一ip地址頻繁請(qǐng)求會(huì)拒絕服務(wù),我在剛開始寫一些東西的時(shí)候就經(jīng)常因?yàn)樵L問的頻率太頻繁而被禁。所以說僅用自己的ip地址進(jìn)行爬取是有一定的局限性的。而代理就可以解決這個(gè)問題。
  代理是什么
  作為一個(gè)程序員我覺得有必要了解一些基本的網(wǎng)絡(luò)知識(shí),比如說網(wǎng)絡(luò)代理。
  我不想從哪里復(fù)制粘貼一段介紹過來,因?yàn)槲矣X得那樣很low,我說說我理解的網(wǎng)絡(luò)代理。
  如果你不了解代理,你應(yīng)該知道代購(gòu)吧,比如你想買一個(gè)東西,卻不想自己跑去買,可以找一個(gè)代理幫你去買。類似的,網(wǎng)絡(luò)代理也是在你和目的網(wǎng)絡(luò)之間的一個(gè) 中轉(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
  這里有一個(gè)問題是,普通代理是比較好檢測(cè)出來的,有些網(wǎng)站不允許使用代理訪問。這時(shí)候可以使用高匿代理可以解決這個(gè)問題。關(guān)于代理不多說了,有興趣的可以自己去了解。
  從哪里獲取代理
  這問題就簡(jiǎn)單了,直接百度搜索網(wǎng)絡(luò)代理可以搜索到很多免費(fèi)的,免費(fèi)的一般不太穩(wěn)定,應(yīng)付日常需求應(yīng)該沒問題。如果需要穩(wěn)定代理還是老老實(shí)實(shí)的花錢買付費(fèi)的好一些,不要因小失大。
  比如網(wǎng)上就經(jīng)常推薦的代理
  西祠代理:  http://www.xicidaili.com/nn/
  本文用的快代理:  https://www.kuaidaili.com/
  西祠我一開始也用了,后來因?yàn)轭l繁訪問被禁用過一次,幾天后才解禁,在這期間我換成了快代理并去重寫了規(guī)則每小時(shí)獲取一次代理。
  代碼
  本文用的python版本為3.6.5, 如果使用2.7版本的代碼需要微調(diào)
  User-Agent
  用來模擬不同的瀏覽器,直接復(fù)制就可以了,我的文件名為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 etreeimport 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ù)并進(jìn)行拼接成一個(gè)list
  def getProxies(self):
  # 1小時(shí)獲取一次代理 否則會(huì)被禁
  if time.time() - self.lastTime > 60*60:
  self.proxieList =[]
  self.lastTime = time.time()
  #只取前五頁,因?yàn)楹竺娴氖У臅?huì)比較多,看自己需要
  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 .text+"://"+ip.text+":"+port.text)
  time.sleep(1)
  print('獲取代理')
  return self.proxieList
  def getRandomAgencyIp(self):
  self.getProxies()
  ip = random.choice(self.proxieList)
  return ip
  #初始化代理 用來進(jìn)行測(cè)試用# agency = geKuaidailiIp()# while True:##     print(agency.getRandomAgencyIp())#     time.sleep(random.randint(4,10))
  為什么使用單例模式
  如果你可以保證自己只創(chuàng)建一個(gè)代理對(duì)象的話,其實(shí)并不是必須使用單例模式。因?yàn)楹芏嗯笥芽赡軙?huì)把創(chuàng)建對(duì)象的代碼寫在循環(huán)中,導(dǎo)致頻繁的獲取代理而導(dǎo)致自己的ip被代理方禁了。單例模式保證在一次執(zhí)行腳本過程中只有一個(gè)對(duì)象。如果對(duì)象已經(jīng)創(chuàng)建,則直接返回已經(jīng)創(chuàng)建的對(duì)象,從而控制不會(huì)頻繁的訪問快代理的頁面。代碼中是一小時(shí)一次。


來源:網(wǎng)絡(luò)
您還未登錄,請(qǐng)先登錄

熱門帖子

最新帖子

?