菜鸟python入门爬虫手记

问题描述:

写一个具体的程序,完成以下功能:假设老师想注册一个很酷的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地址获得的;

以我找到的资料看:第二种只要找到url地址即可,而第一种就需要学习新的包了。
4、深度分析网页的数据传输过程
首先我更换了工具,换成了ie的F12,原因是中文(毕竟是菜鸟)、功能更丰富。接下来开始打仗了;

通过查看响应时间、类型的排除、查看post data,我在第二个POST里发现了问题(当然其中走了不少弯路,废了不少时间):它提交的表单正是查询的域名!

原来,我们在查询页面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>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值