python 爬虫 页面跳转闯关第三关为什么跳到记账页面

他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)3267人阅读
python爬虫(29)
黑板客第二关网址是&&
第二关的页面如下:
即要求用户输入用户名和密码,然后闯关成功
用户名没有规则,可以任意输入,而密码是一个30以内的数字,并不是真正我们注册的用户名和密码组合
因此,这就需要我们去依次尝试输入30以内的数字作为密码
这种方式需要我们向网站做出一个互动:自动提交表单
第一种方法
通过urllib 提交内容
#!/usr/bin/python
# coding:utf-8
import urllib
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]
所耗时长:
闯关成功,下一关网址是: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 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
所耗时长:
闯关成功,下一关网址是: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 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
print driver.find_element_by_tag_name('h3').text
print 'end'
driver.quit()
if __name__ == '__main__':
h2=heibanke()
h2.heibank_ex02()运行结果如下:
当前输入的密码是: 0 您输入的密码错误, 请重新输入
当前输入的密码是: 1 您输入的密码错误, 请重新输入
当前输入的密码是: 2 您输入的密码错误, 请重新输入
当前输入的密码是: 3 您输入的密码错误, 请重新输入
当前输入的密码是: 4 您输入的密码错误, 请重新输入
当前输入的密码是: 5 您输入的密码错误, 请重新输入
当前输入的密码是: 6 您输入的密码错误, 请重新输入
当前输入的密码是: 7 您输入的密码错误, 请重新输入
当前输入的密码是: 8 您输入的密码错误, 请重新输入
当前输入的密码是: 9 您输入的密码错误, 请重新输入
当前输入的密码是: 10 您输入的密码错误, 请重新输入
当前输入的密码是: 11 您输入的密码错误, 请重新输入
当前输入的密码是: 12 恭喜! 用户Jimy成功闯关, 继续你的爬虫之旅吧
run time is 30.44:
其实还有其他多种方法,接触多了自然就知晓了。
我们最终的目的是练习,目的达到就好。
大家还有其他什么方法,欢迎留言
访问:533000次
积分:6042
排名:第4966名
原创:98篇
转载:31篇
评论:90条
文章:22篇
阅读:80745
文章:24篇
阅读:211728
(1)(2)(5)(3)(5)(43)(24)(36)(3)(3)(4)页面显示:你需要在网址后输入数字62881
(1)错误解题思路,以为这是考查GET传参方式。。。
先得需要传递的参数value=62881,对这个值编码,
(这里是转换为str格式,而不是调用urllib.urlencode())
加载在原网址url后形成完整的传参地址get=url+value
再读出该地址内容,先建立一个请求Request再打开urlopen,进而read()。
import urllib
import urllib2
value=62881
data =str(value)
url = "http://www.heibanke.com/lesson/crawler_ex00/"
geturl = url + "?"+data
request = urllib2.Request(geturl)
response = urllib2.urlopen(request)
print response.read()
程序可以运行,爬行出来的结果是的源码,没有出现下一关的提示。
2.hint一下,发现思路错误。好吧,改个方式尝试。
根据提示直接在网址后输入62881,页面提示需要输入另一个数字,一直循环。
看来是需要爬虫自动以GET方式循环输入了。
正则表达式匹配模式用findall(pattern,string[,flag])
在字符串中string中搜索正则表达式模式pattern的所有(非重复出现;返回一个匹配对象的列表)
import urllib2
url = "http://www.heibanke.com/lesson/crawler_ex00/"
request = urllib2.Request(url)
response = urllib2.urlopen(request)
html= response.read()
number=re.findall(r'输入数字([\d]{5})',html)
while number:
url="http://www.heibanke.com/lesson/crawler_ex00/%s/" % number[0]
req = urllib2.Request(url)
tmp = urllib2.urlopen(req)
html = tmp.read()
number = re.findall(r'数字是([\d]{5})', html)
print html
为了不引起混乱,循环中的变量名做了改变,当然变量名不变也是可以运行的。
爬虫结果最后输出一个页面源码提示下一关的地址。
注意:(1)这里的主代码三行
req = urllib2.Request(url)
tmp = urllib2.urlopen(req)
html = tmp.read()
也可化为两行
直接tmp = urllib2.urlopen(URL)
html = tmp.read()
(2) temp= urllib2.urlopen(req)
这里的urllib2.urlopen(req)不可写成urllib.urlopen(req),会引发错误。
不必再导入urllib模块
访问:26063次
排名:千里之外
原创:24篇
(1)(1)(9)(4)(8)(1)这里是黑板客爬虫闯关的第二关
昵称:(随便输入字符)
密码:(30以内的数字,猜对它就能过关)他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 爬虫闯关第二关 的文章

 

随机推荐