黑板课爬虫闯关第一关

时间:2023-02-24 10:32:41

刚开始学习python,看了些语法后就想找些小例子来写写。因为语言这东西光看不写是不行的。知乎上看到大家各种说python写的网络爬虫非常nb的样子,便也想来搞搞。正好又看到黑板课老师在知乎的回答,一不小心点进了黑板课爬虫闯关,于是踏上了闯关的征程。

第一题比较简单,就是根据网页给的数字不断更新网址后的数字,直到提示进入下一关为止。分析一下大概思路:用python获取网页,然后从网页的内容中提取这个数字,再把这个数字加在网址后面继续进行以上操作。

那如何知道是否到了最后一个网页呢?先手动进行几次操作,观察网页内容,找出他们的相同点,用正则表达式判断即可。

思路是清楚,但上面这些我都不会啊,特别是正则表达式这么基础的东西,以前从来没用过。说出来也不怕笑话,本科接触的东西实在太少了,只能现学现卖了。

首先,python获取网页,百度一下,大家差不多都推荐,urllib2requests,后来用之后对比以下,requests更强大,也更简洁,简单一行代码就能获取网页内容,也发现了python的简洁和强大。

import requests

html = requests.get('http://www.baidu.com').content
print html

网页内容已经可以获得了,该分析下里面的内容了。手动输入几次数字后,发现除了第一次的内容是

你需要在网址后输入数字69634

以后都是

下一个你需要输入的数字是*****.

现在已经很清楚了,除了第一次之外,剩下的数字都是在“下一个你输入的数字是”“.”之间。再通过简单了解下正则表达式就能很快写出提取这个数字的正则表达式:

'下一个你需要输入的数字是(\d+)\.'

但是,这还不够,作为一个有强迫症和洁癖的程序员,代码的臃肿是无法忍受的。因为第一次的网页内容和这个并不一样,因此,需要写一个表达式匹配两种情况。再看第一次打开的网页,虽然网页的内容显示数字后面没有任何字符和字母,但通过requests读取的网页是html文件,我们需要查看html代码:

原来后面还跟着个“<”,而且数字前面也少了个”是”字。因此,稍加修改正则表达式,则可匹配两种情况:

'下一个你需要输入的数字[^\d]*(\d+)[\.<]'

现在核心问题已经解决了,接下来的代码自然就可以写出了:

# coding=utf-8

import requests
import re

website = 'http://www.heibanke.com/lesson/crawler_ex00/'
ruler = re.compile(r'数字[^\d]*(\d+)[\.<]')

html = requests.get(website).content
number = ruler.findall(html)
index = 1
while number:
    website2 = website + number[0]
    html = requests.get(website2).content
    number = ruler.findall(html)
    print "访问网页%d: %s" %(index, website2)
    index += 1
else:
    print "\n下一关的入口: %s" % website2

python路漫漫,继续加油吧!