|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 柠檬树宝宝 于 2018-2-27 20:56 编辑
第一次学写程序,请高手帮我找解决bug, 希望能告诉我到底错在哪里,而不是重写,学习阶段过程比结果重要。
谢谢了。
- import urllib.request
- from bs4 import BeautifulSoup
- import time
- import re
- import random
- #将可重复使用的功能放到一起。
- class Getweb:
- # 统一定义user_Agent. 可复用
- def __init__(self):
- self.header={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.94 Safari/537.36'}
- # 统一定义网页获取,将反复使用。
- def getrep(self, url):
- req = urllib.request.Request(url,headers=self.header)
- resp = urllib.request.urlopen(req, timeout=5)
- content = resp.read()
- return content
- # 定义一个查询当前ip的方法,用于验证当前访问的ip
- def getip(self,url):
- print(url)
- #发现第二个错误,类里面的函数,如果需要调用,需要增加对象指针,此处,调用getrep()时,需要增加一个self.
- #发现第四个错误,获取的数据进行解码。
- content = self.getrep(url).decode('utf-8')
- r = r'<h2>(.*?)</h2>'
- ipdz = re.findall(r,content)
- return ipdz
- #获代理网站的免费IP数据,放到代理IP池
- class Xiciip:
-
- #使用西祠ip代理. 抓取后的放到pool里面
- def __init__(self, url):
- self.pool = []
- self.url = url
- self.gethtml = Getweb() #由于要复用公共类里面打开网页的方法,所以实例化一个对象处理。
- # 获取ip代理,放到pool里面, 其中复用了公共类里面打开网页的方法 getrep()
- def find(self):
- for i in range(1, 2):
- content = self.gethtml.getrep(self.url + str(i))
- soup = BeautifulSoup(content,'html.parser')
- ips = soup.findAll('tr')
- for x in range(2, len(ips)):
- ip = ips[x]
- tds = ip.findAll("td")
- if tds == []:
- continue
- ip_temp = tds[1].contents[0] + ":" + tds[2].contents[0]
- self.pool.append(ip_temp)
- time.sleep(1)
- return self.pool
- #提供一个清洗IP数据方法,剔除不能使用的代理IP
- class Iptest:
- # 初始化,用whatismyip网站,查询当前访问ip. 要使用了公共类Getweb里面的getip()方法 和 getrep()方法
- def __init__(self):
- #发现第三个错误,地址写错了,打一下耳光。
- self.testurl ='http://www.whatismyip.com.tw'
- #发现一个错误,实例化类对象时候,无论类是否有参数,都需要加括号。即使定义类的时候没有括号。切记,切记!!
- self.gethtml = Getweb()
- print(self.testurl)
- # 测试ip的方法。要传入一个ip, 分别直接ip访问,获得本机ip, 然后用传入的ip访问,获得传入的ip. 如果能够访问,而且得到两个ip不同,则说明传入的代理ip可用。返回ture
- def testip(self,ip):
- myip = self.gethtml.getip(self.testurl)
- try:
- for i in range(2):
- proxy_support = urllib.request.ProxyHandler({"http": ip})
- opener = urllib.request.build_opener(proxy_support)
- urllib.request.install_opener(opener)
- dlip = self.gethtml.getip(self.testurl)
- if dlip != myip:
- return True
- except:#
- return False
- #对得到代理IP数据进行清洗后,分别提供单个IP输出、批量输出、按文件持久化存储
- class IPpool:
- # 初始化,需要传入一个ip pool (代理ip列表),由于要测试,所以实例化一个Iptest类的对象。
- def __init__(self,pool):
- self.pool = pool
- self.test = Iptest()
- # 将传入的列表pool中的ip 分别拿到Iptest类的testip()方法进行测试. 不通过的剔除,得到一个新的 pool.
- def get_ips(self):
- for ip in self.pool:
- if self.test.testip(ip):
- continue
- else:
- self.pool.remove(ip)
- return self.pool
- # 从pool 中随机拿一个ip来用。
- def getoneip(self):
- return random.choice(self.pool)
- #将pool 通过文件持久化存起来。 此方法暂时不用。
- def writeToTxt(self,file_path):
- try:
- fp = open(file_path, "w+")
- for item in self.pool:
- fp.write(str(item) + "\n")
- fp.close()
- except IOError:
- print("fail to open file")
- ——————————————————————————————————————————————————————————————————————————
- import ipproxy as proxy
- #导入上面的模块
- import urllib.parse
- import urllib.request
- import json
- # 定义爬取有道词典网站的在线翻译服务,需要使用代理IP
- class Fanyi:
-
- #初始化一下翻译的类
- def __init__(self,ipurl):
- #接受代理ip网站的url传入
- self.ipurl = ipurl
- #复用公共类的方法,先实例一个对象出来。
- self.header = proxy.Getweb()
- #调用实例化西祠类对象。
- self.getdl = proxy.Xiciip(self.ipurl)
- #实例化一个Ippool类对象,通过将西祠类对象执行find()方法,得到pool,并作为参数传递进去
- self.getip = proxy.IPpool(self.getdl.find())
- #再次实例化一个Ippool类对象,但是是将上一个Ippool类对象self.getip,再执行get_ips()方法后,得到的新pool传进去。后面代码从这个对象中执行getoneip()方法,拿ip用。
- self.iproxy = proxy.IPpool(self.getip.get_ips())
- #抓起翻译网站服务的方法
- def fanyi(self,yourtext):
- youdao = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
- data = {'from': 'AUTO', 'to': 'AUTO', 'client': 'fanyideskweb', 'smartresult': 'dict', 'doctype': 'json',
- 'version': '2.1', 'keyfrom': 'fanyi.web', 'action': 'FY_BY_REALTIME', 'typoResult': 'false',
- 'i': yourtext}
- data = urllib.parse.urlencode(data).encode('utf-8')
- #这里使用代理ip, self.iproxy.getoneip()
- proxy_support = urllib.request.ProxyHandler({"http": self.iproxy.getoneip()})
- opener = urllib.request.build_opener(proxy_support)
- urllib.request.install_opener(opener)
- # 这里使用了公共类的header. self.header已经申明是Getweb()类一个实例。它取该类的header属性。
- req = urllib.request.Request(youdao, data,headers=self.header.header )
- resp = urllib.request.urlopen(req, timeout=5)
- fankui = resp.read().decode('utf-8')
- target = json.loads(fankui)
- translateResult = target["translateResult"][0][0]['tgt']
- return translateResult
- #生成本地化的实时翻译应用
- xici='http://www.xicidaili.com/wn/'
- #实例化 Fanyi 类,传入代理ip网站地址
- lemon = Fanyi(ipurl = xici)
- a = ''
- #定义程序结束命令
- c = ['退出', 'exit', 'Exit', 'EXIT']
- while a not in (c):
- a = input('爸爸说:')
- if a in (c):
- break
- #执行Fanyi 类的方法,传入值,得到翻译值。
- b = lemon.fanyi(yourtext = a)
- print('柠檬宝宝翻译:' + b)
- print('谢谢使用!')
复制代码
这里要解码,不然不能用正则表达式搜索
|
|