黑板客爬虫闯关的第一关

http://www.heibanke.com/lesson/crawler_ex00/
页面显示:你需要在网址后输入数字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()

程序可以运行,爬行出来的结果是http://www.heibanke.com/lesson/crawler_ex00/的源码,没有出现下一关的提示。

2.hint一下,发现思路错误。好吧,改个方式尝试。
根据提示直接在网址后输入62881,页面提示需要输入另一个数字,一直循环。
这里写图片描述
看来是需要爬虫自动以GET方式循环输入了。
正则表达式匹配模式用findall(pattern,string[,flag])
在字符串中string中搜索正则表达式模式pattern的所有(非重复出现;返回一个匹配对象的列表)

#-*-coding:utf-8-*-
import urllib2
import re

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]
    print url
    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模块

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值