心血来潮,想要了解一下爬虫的基本原理,本着目的驱动的原则,想要把某美剧下载网站上的聚集下载链接都爬下来,个人收藏;  第一次写, 不是什么教程,只是记录一下自己的思路和一些留着以后深入的点, 写的太乱,还请轻喷..

既然是目的驱动,因此每个涉及到的点在本文中都点到为止,接下来我自己也会逐步更深入的了解,文章只是一个备忘录,以免稍后遗忘;

一个最简单的爬虫,通常有着相似的设计思路:从一个页面开始,分析得到所有感兴趣的内容(保存)和链接,再依次访问这些链接进行同样的操作,直到不能继续为止:

1.记住已经访问过的链接,再次遇到时不会访问,避免陷入循环(x)

2.以合适的结构和方式存储获取到的数据(x)

因为本文的目的和对应的网站的链接及富有规律性,且要爬取得内容也很明确(而不是像搜索引擎一样几乎要保存所有内容),因此以上两点均不涉及,最后只是简单的使用XML保存拿到的数据;

一.分析对应的站点:

版权问题, 这里掩码了目标网站;

本文要爬取的网站,首先有一个分页的目录,每页展示一部分美剧的简介和详情页面的链接,这个页面的地址是:http://www.xxxxx.net/ddc1/page/x末尾的x是从1开始的自然数;

详情页面的地址是 http://xxxxx.net/archives/xxxxx/ 末尾的xxxxx是随机的1-5位数,无规律,并非每个数字都有页面,因此详情页面的链接,需要从目录页面提取,以免做很多无用的工作;

目录页面,每一部剧都在一个class为thumbnail的div中:



     



因此可以很方便的使用下面的正则表达式取出我们需要的内容:



同理,分析详情页面,我们得到了下面的正则表达式,取出所有的下载链接:

.*? 这个问号,表示着我们需要最小匹配, 因为页面中有着很多循环的内容;

二. http请求

使用urllib2来进行http请求;

首先使用urllib2.Request来封装一次请求,其中第二个参数,设置了一个header,其中模拟了User-Agent为IE,简单的以免部分网站拦截我们的爬虫;

最后,对获取到的page,做utf-8解码,成为unicode(python内部的字符串都是unicode的)

self.header = {
'User-Agent': 'Mozilla/4.0 (compatible; MSIE 9.0; Windows NT)'
}
url = self.DIC_LINK + str(page_no)
req = Request(url, headers=self.header)
response = urlopen(req)
cur_page = response.read()
unicode_page = cur_page.decode("utf-8")

urlopen方法可能会抛出异常(HTTPError, URLError), HTTPError继承自URLError,因此应优先捕获HTTPError; HTTPError的code,是一个整形数,也就是我们常见的404, 500等http返回码,经过测试,目录列表的地址,当页数超过了已有的最大页数的时候,网站会返回404,所以可以把这个当作一个结束的标识;

三.正则表达式

python的正则表达式用起来很顺手,引入re模块就可以愉快的使用了;

首先使用compile方法获得模式对象,注意第二个参数re.S ,使得.可以匹配换行符

然后调用findall方法,就能获得所有的匹配了;

正则表达式中,括号()围起来的,会成为一个分组,从左到又,每遇到一个(,则分组加1,因此我们得到的items数组中,每一个元素,又是一个数组,这个数组的第一个元素为链接,第二个元素为title的值;

reg_str = r'