鱼C论坛

 找回密码
 立即注册
查看: 1586|回复: 3

[已解决]求助,写了一个自动查询IP的代码,但是遇到一些无法解决的问题。

[复制链接]
发表于 2017-7-16 09:12:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
代码如附件,原理是从138IP网站获取IP地址信息,帮助搜索大量IP地址。但是遇到一些问题:
1、每次都只能查一部分IP,不是被屏蔽的原因,是整个程序每次都只能跑一部分IP(例如这个ipsearch.txt文件中9条数据每次只能跑5条数据)。不知道是哪个函数用的不对。
2、遇到NULL值会返回错误,有什么办法解决吗?
谢谢各位
最佳答案
2017-7-16 09:30:08
本帖最后由 ba21 于 2017-7-16 09:43 编辑


判断一下IP的合法性。代码如下:
后面又调试了一下,发现还是有问题,问题如下:还是只能打印部分。检查代码发现多余代码;下面已注释。
下面代码调式正常通过:
  1. import socket

  2. def is_valid_ip(ip):  
  3.     """Returns true if the given string is a well-formed IP address.

  4.     Supports IPv4 and IPv6.
  5.     """  
  6.     if not ip or '\x00' in ip:  
  7.         # getaddrinfo resolves empty strings to localhost, and truncates  
  8.         # on zero bytes.  
  9.         return False  
  10.     try:  
  11.         res = socket.getaddrinfo(ip, 0, socket.AF_UNSPEC,  
  12.                                  socket.SOCK_STREAM,  
  13.                                  0, socket.AI_NUMERICHOST)  
  14.         return bool(res)  
  15.     except socket.gaierror as e:  
  16.         if e.args[0] == socket.EAI_NONAME:  
  17.             return False  
  18.         raise  
  19.     return True

  20. f = open("ipsearch.txt","r")
  21. w = open("查询结果.txt","w")
  22. ipsearch = f.read()
  23. ip_list = ipsearch.split()
  24. try:
  25.         for ip1 in ip_list :
  26.                 #ip1 = ip_list.pop()
  27.                 if is_valid_ip(ip1):
  28.                         import urllib.request
  29.                         import random
  30.                         proxy_ip = ('111.11.83.243','183.222.102.100')
  31.                         proxy_handler = urllib.request.ProxyHandler({'http':random.choice(proxy_ip)})
  32.                         opener = urllib.request.build_opener(proxy_handler)
  33.                         opener.addheaders = [('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0')]
  34.                         urllib.request.install_opener(opener)
  35.                         url = "http://www.ip138.com/ips1388.asp?ip="+ip1+"&action=2"
  36.                         File1 = urllib.request.urlopen(url)
  37.                         File2 = File1.read().decode('gbk')
  38.                         x = File2.index("本站数据",6000)
  39.                         File3 = ip1 + File2[x+4:x+20] +"\n"
  40.                         print(w.write(File3))
  41. except ITimeoutError:
  42.         print("被屏蔽咯TAT")
  43. finally:
  44.         w.close()
  45.         f.close()
复制代码

ipsearch.zip

862 Bytes, 下载次数: 2

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-7-16 09:30:08 | 显示全部楼层    本楼为最佳答案   
本帖最后由 ba21 于 2017-7-16 09:43 编辑


判断一下IP的合法性。代码如下:
后面又调试了一下,发现还是有问题,问题如下:还是只能打印部分。检查代码发现多余代码;下面已注释。
下面代码调式正常通过:
  1. import socket

  2. def is_valid_ip(ip):  
  3.     """Returns true if the given string is a well-formed IP address.

  4.     Supports IPv4 and IPv6.
  5.     """  
  6.     if not ip or '\x00' in ip:  
  7.         # getaddrinfo resolves empty strings to localhost, and truncates  
  8.         # on zero bytes.  
  9.         return False  
  10.     try:  
  11.         res = socket.getaddrinfo(ip, 0, socket.AF_UNSPEC,  
  12.                                  socket.SOCK_STREAM,  
  13.                                  0, socket.AI_NUMERICHOST)  
  14.         return bool(res)  
  15.     except socket.gaierror as e:  
  16.         if e.args[0] == socket.EAI_NONAME:  
  17.             return False  
  18.         raise  
  19.     return True

  20. f = open("ipsearch.txt","r")
  21. w = open("查询结果.txt","w")
  22. ipsearch = f.read()
  23. ip_list = ipsearch.split()
  24. try:
  25.         for ip1 in ip_list :
  26.                 #ip1 = ip_list.pop()
  27.                 if is_valid_ip(ip1):
  28.                         import urllib.request
  29.                         import random
  30.                         proxy_ip = ('111.11.83.243','183.222.102.100')
  31.                         proxy_handler = urllib.request.ProxyHandler({'http':random.choice(proxy_ip)})
  32.                         opener = urllib.request.build_opener(proxy_handler)
  33.                         opener.addheaders = [('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0')]
  34.                         urllib.request.install_opener(opener)
  35.                         url = "http://www.ip138.com/ips1388.asp?ip="+ip1+"&action=2"
  36.                         File1 = urllib.request.urlopen(url)
  37.                         File2 = File1.read().decode('gbk')
  38.                         x = File2.index("本站数据",6000)
  39.                         File3 = ip1 + File2[x+4:x+20] +"\n"
  40.                         print(w.write(File3))
  41. except ITimeoutError:
  42.         print("被屏蔽咯TAT")
  43. finally:
  44.         w.close()
  45.         f.close()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-16 23:23:36 | 显示全部楼层
ba21 发表于 2017-7-16 09:30
判断一下IP的合法性。代码如下:
后面又调试了一下,发现还是有问题,问题如下:还是只能打印部分。检查 ...

万分感谢, 初学者还不知道怎么判断IP有效性。感谢指点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-17 00:22:07 | 显示全部楼层
经过指点是for循环和里面的调用重复,所以一直无法跑全部数据,现在改装代码如下,主要代理IP不够好,速度很慢,能满足三位数的IP抓取。需要将IP放在ipsearch.txt的文档里面。



  1. import socket
  2. import urllib.request
  3. import random

  4. f = open("ipsearch.txt","r")
  5. w = open("查询结果.txt","w")
  6. ipsearch = f.read()
  7. ip_list = ipsearch.split()

  8. def is_valid_ip(ip):  
  9.     """Returns true if the given string is a well-formed IP address.

  10.     Supports IPv4 and IPv6.
  11.     """  
  12.     if not ip or '\x00' in ip:  
  13.         # getaddrinfo resolves empty strings to localhost, and truncates  
  14.         # on zero bytes.  
  15.         return False  
  16.     try:  
  17.         res = socket.getaddrinfo(ip, 0, socket.AF_UNSPEC,  
  18.                                  socket.SOCK_STREAM,  
  19.                                  0, socket.AI_NUMERICHOST)  
  20.         return bool(res)  
  21.     except socket.gaierror as e:  
  22.         if e.args[0] == socket.EAI_NONAME:  
  23.             return False  
  24.         raise  
  25.     return True

  26. def ipsearch(ip1):
  27.     if is_valid_ip(ip1):
  28.         proxy_ip = ('111.11.83.243','183.222.102.100','119.36.92.41','122.72.32.72')
  29.         proxy_handler = urllib.request.ProxyHandler({'http':random.choice(proxy_ip)})
  30.         opener = urllib.request.build_opener(proxy_handler)
  31.         opener.addheaders = [('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0')]
  32.         urllib.request.install_opener(opener)
  33.         url = "http://www.ip138.com/ips1388.asp?ip="+ip1+"&action=2"
  34.         File1 = urllib.request.urlopen(url)
  35.         File2 = File1.read().decode('gbk')
  36.         x = File2.index("本站数据",6000)
  37.         y = File2.index("参考数据1",6000)
  38.         File3 = ip1 + File2[x+4:y-9] +"\n"
  39.         print(w.write(File3))
  40.     else:
  41.         print(w.write("错误值\n"))
  42. def ipsearch_while():
  43.     while len(ip_list) > 0 :
  44.         ip1 = ip_list.pop()
  45.         ipsearch(ip1)

  46. try:
  47.     ipsearch_while()
  48. except TimeoutError:
  49.     ipsearch_while()
  50. finally:
  51.         w.close()
  52.         f.close()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 00:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表