python爬虫(4)四种方法通过黑板客第二关

黑板客第二关网址是 http://www.heibanke.com/lesson/crawler_ex01/ 

第二关的页面如下:


即要求用户输入用户名和密码,然后闯关成功

用户名没有规则,可以任意输入,而密码是一个30以内的数字,并不是真正我们注册的用户名和密码组合

因此,这就需要我们去依次尝试输入30以内的数字作为密码


这种方式需要我们向网站做出一个互动:自动提交表单

第一种方法

通过urllib 提交内容

#!/usr/bin/python
# coding:utf-8

import urllib
import re
import sys
reload(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-8

import urllib2
import re
import urllib
import datetime

begin_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-8

import requests
import re
import datetime
import sys
reload(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的方式,相当于直接通过页面输入,页面点击的方式

#!/usr/bin/python
#coding=utf-8 

'''
通过webdriverde 凡是,利用PhantomJS来登录
电脑上需要安装Selenium
'''


import time,sys
from selenium import webdriver

reload(sys)
sys.setdefaultencoding('utf-8')

#计算时间函数
def print_run_time(func):
    def wrapper(self, *args, **kw):
        local_time = time.time()
        func(self)
        print 'run time is {:.2f}:'.format(time.time() - local_time)
    return wrapper

class heibanke:
	@print_run_time
	
	
	def heibank_ex02(self):
		testurl="http://www.heibanke.com/lesson/crawler_ex01/"
		cap = webdriver.DesiredCapabilities.PHANTOMJS
		driver = webdriver.PhantomJS()
	
		for i in xrange(31):
			driver.get(testurl)
			#print driver.current_url
			driver.find_element_by_name("username").send_keys("Jimy")
			driver.find_element_by_name("password").send_keys(i)
			driver.find_element_by_id("id_submit").click()
			print "当前输入的密码是:",i,
			if "错误" not in driver.find_element_by_tag_name('h3').text:
				print driver.find_element_by_tag_name('h3').text
				break
			print driver.find_element_by_tag_name('h3').text
		print 'end'
		driver.quit()
		return

if __name__ == '__main__':
	h2=heibanke()
	h2.heibank_ex02()
运行结果如下:

当前输入的密码是: 0 您输入的密码错误, 请重新输入
当前输入的密码是: 1 您输入的密码错误, 请重新输入
当前输入的密码是: 2 您输入的密码错误, 请重新输入
当前输入的密码是: 3 您输入的密码错误, 请重新输入
当前输入的密码是: 4 您输入的密码错误, 请重新输入
当前输入的密码是: 5 您输入的密码错误, 请重新输入
当前输入的密码是: 6 您输入的密码错误, 请重新输入
当前输入的密码是: 7 您输入的密码错误, 请重新输入
当前输入的密码是: 8 您输入的密码错误, 请重新输入
当前输入的密码是: 9 您输入的密码错误, 请重新输入
当前输入的密码是: 10 您输入的密码错误, 请重新输入
当前输入的密码是: 11 您输入的密码错误, 请重新输入
当前输入的密码是: 12 恭喜! 用户Jimy成功闯关, 继续你的爬虫之旅吧
end
run time is 30.44:

小结

其实还有其他多种方法,接触多了自然就知晓了。
我们最终的目的是练习,目的达到就好。
大家还有其他什么方法,欢迎留言




posted @ 2017-03-06 11:31  枫奇丶宛南  阅读(29)  评论(0编辑  收藏  举报