黑板客第二关网址是 http://www.heibanke.com/lesson/crawler_ex01/
第二关的页面如下:
即要求用户输入用户名和密码,然后闯关成功
用户名没有规则,可以任意输入,而密码是一个30以内的数字,并不是真正我们注册的用户名和密码组合
因此,这就需要我们去依次尝试输入30以内的数字作为密码
这种方式需要我们向网站做出一个互动:自动提交表单
通过urllib 提交内容
#!/usr/bin/python# coding:utf-8import urllibimport reimport sysreload(sys)sys.setdefaultencoding('utf-8') data={'username':'qiqiyingse'}url='http://www.heibanke.com/lesson/crawler_ex01/' for num in xrange(1,31): data['passWord']=num post_data=urllib.urlencode(data) PRint post_data response=urllib.urlopen(url,post_data) html=response.read() result=re.findall('密码错误',html) if not result: print '闯关成功,下一关网址是:http://www.heibanke.com'+re.findall(r'<a href="(.*?)" class',html)[0] break所耗时长:
闯关成功,下一关网址是:http://www.heibanke.com/lesson/crawler_ex02/run time is 0:00:12.546250第二种方法
urllib2 的方式,用urllib 打包数据
#!/usr/bin/python# coding:utf-8import urllib2import reimport urllibimport datetimebegin_time=datetime.datetime.now()data={'username':'qiqiyingse'}url='http://www.heibanke.com/lesson/crawler_ex01/' for num in range(1,31): data['password']=num post_data=urllib.urlencode(data) print post_data response=urllib2.urlopen(url,post_data) html=response.read() result=re.findall('密码错误',html) if not result: print '闯关成功,下一关网址是:http://www.heibanke.com'+re.findall(r'<a href="(.*?)" class',html)[0] print 'run time is ',datetime.datetime.now()-begin_time break所耗时长:
闯关成功,下一关网址是:http://www.heibanke.com/lesson/crawler_ex02/run time is 0:00:10.163122这种方法的数据打包也可以用下面这两句代码
post_data=urllib.urlencode(data)request=urllib2.Request(url,post_data)response=urllib2.urlopen(request)只是里面多了一个urllib2里面的Request 方法来进行打包第三种方法
使用request的post方法来提交数据
#!/usr/bin/python# coding:utf-8import requestsimport reimport datetimeimport sysreload(sys)sys.setdefaultencoding('utf-8')begin_time=datetime.datetime.now()url = 'http://www.heibanke.com/lesson/crawler_ex01/'payload = {'username': 'test', 'password': 0}for n in range(30): payload['password'] = n content = requests.post(url, payload).text pattern = r'<h3>(.*)</h3>' result = re.findall(pattern, content) print "try enter ",n,result[0] if u"错误" not in result[0]: print result[0]+'/n下一关网址是:http://www.heibanke.com'+re.findall(r'<a href="(.*?)" class',content)[0] print 'run time is ',datetime.datetime.now()-begin_time break所耗费时长下一关网址是:http://www.heibanke.com/lesson/crawler_ex02/run time is 0:00:09.232878第四种方法
使用webdriver的方式,相当于直接通过页面输入,页面点击的方式
新闻热点
疑难解答