问题描述:
写一个具体的程序,完成以下功能:假设老师想注册一个很酷的6位以内英文字母并以.com结尾的域名(如expert.com、fox.com),那么请你设计一个程序,从这个网站(http://www.zgsj.com/domain_reg/ 自动测试所有可能的这样的6位以内英文字母的域名,记录未被其他用户注册的域名(已经被注册的自然是忽略掉了)
1、爬取网页的源代码
了解了网上的包,用urllib,urllib2就能实现,代码不长,四五行就,这里就不贴出了。
2、模拟进行人工输入
下载了火狐浏览器的httlfire工具,可以监视提交的信息、url、cookie等信息,方便我们进行模拟输入。
通过监视,发现网页提交的信息如下:
有了这个,再参照网上的教程,编写了如下代码:
import re
import urllib
import urllib2
import cookielib
data = {"searchType":"common","searchedDomainName":"ass","suffix":".com"}
post_data = urllib.urlencode(data)
cj = cookielib.CookieJar
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
headers = {"User-agent":"Mozilla/5.0 (Windows NT 6.1; rv:32.0) Gecko/20100101 Firefox/32.0"}
req = urllib2.Request("http://www.zgsj.com/domain_reg",post_data,headers)
content = urllib2.urlopen(req)
print content.read()
跑了下,看结果和右击浏览器所看到的源代码一样。基本上这段程序是可用的。
3、那么问题来了:怎么区分可注册与不可注册的域名呢?
分别输入一个可注册和一个不可注册的域名,打开源代码一看,来找找这两种的区别。。。千行的源代码让我顿感无力,看了十分钟愣是没找出区别。
在网上找了 找两个文件不同的程序,做了些修改(顺别了解了下set()),程序如下(把两种网页源代码分别放在两个文件里):
__author__ = 'Administrator'
s1 = set(open('C:\\Users\\Administrator\\Desktop\\a.txt','r').readlines())
s2 = set(open('C:\\Users\\Administrator\\Desktop\\b.txt','r').readlines())
print s1-s2
print s2-s1
跑完,竟然发现两个文件除了输入的查询网址的几个字符,其他都一样!
这怎么玩?难道源代码不能包含所有网页内容?
再次询问度娘,谷歌娘,发现这就关系到了动态网页的爬取,而动态网页内容有下面两个来源:
(1)本地的Javascript脚本所生成的;
(2)通过访问另外一个url地址获得的;
原来,我们在查询页面http://www.zgsj.com提交了查询信息后,跳转至新的页面http://www.zgsj.com/domain_reg
后才把我们的信息进行检测。
5、完成程序
剩下的就简单了。
接下来,找到相应正文里的可注册与不可注册的区别,在使用正则表达式判断,这样一个判断的函数就完成了;
再写好生成五位以内的所有字符串,反复检测即可。
<span style="font-size:14px;">import re
import urllib
import urllib2
import cookielib
class First_Spider:
def getpage(self,name,suffix='.com'):
data = {"d_name":"","dtype":"common","drand":".1416113688132"}
data["d_name"] = name+suffix
post_data = urllib.urlencode(data)
cj = cookielib.CookieJar
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
headers = {"User-agent":"Mozilla/5.0 (Windows NT 6.1; rv:32.0) Gecko/20100101 Firefox/32.0"}
req = urllib2.Request("http://www.zgsj.com/domain_reg/domaintrans.asp",post_data,headers)
content = urllib2.urlopen(req)
c=content.read()
pattern = re.compile('color:green;')
p = pattern.findall(c)
if p:
print name
def addname(self):
for n1 in range(97,123):
self.getpage(chr(n1))
for n2 in range(97,123):
self.getpage(chr(n1)+chr(n2))
for n3 in range(97,123):
print "I am texting domain name starting with",chr(n1),chr(n2),chr(n3)
self.getpage(chr(n1)+chr(n2)+chr(n3))
for n4 in range(97,123):
self.getpage(chr(n1)+chr(n2)+chr(n3)+chr(n4))
for n5 in range(97,123):
self.getpage(chr(n1)+chr(n2)+chr(n3)+chr(n4)+chr(n5))
myspider = First_Spider()
myspider.addname()</span>