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模块