>Python环境
首先,我们需要下载一定版本的Python。
Python版本主要分2.7和3.x两种选择,由于Python3中的部分语法和特性对比Python发生了改变,因此一些原有的库对3的支持不是那么好。
考虑到日后的某些方便,这里采用Python 2.7(64bit)。(64位的Python相比,没有32位Python内存上限为2G的局限。)当然,一般来说,我会同时安装Python3和Python2.7。
接着,我们需要一款IDE。选择主要如下:Eclipse、IDEA、PyCharm
- Eclipse是完全免费的,而后两款是收费的(但都有免费的社区版和教育版)。
- 而Eclipse和IDEA其实严格来说是JAVA的编译器,但是都有相应的Plugins用于对其他语言进行扩展;PyCharm则是IDEA的制作公司JetBrains为python专门打造的集成开发环境。
- 从总的使用体验来说,IDEA和PyCharm的使用体验远好过Eclipse,Eclipse的pyhon环境搭建可>参考此处<;IDEA的python环境搭建可以>参考此处<。
>Spider的抽象级别
在Python中,一个完整的爬虫(互联网蜘蛛)的实现方式多种多样,但主要过程还是两步:
- 伪装HTTP Request并获取相应的HTML文件(包括且不限于CSS、JS等内容);
- 解析HTML(XML或DOM Tree),获取需要的数据;
在第一步中,常用的方法是使用urllib和urllib2(在Python3中这两个包已经合为一个包)来实现对网页资源的获取。当然,官方文档其实更推荐使用第三方库:requests。
- urllib(2)模块是Python标准库中用于处理URL的组件合集;
- requests是在urllib之上的HTTP客户端接口,某种意义上是一层高级的封装。
在第二步中,要解析扒下来的HTML文件(及其他),常用的是正则表达式(regex)和BeautifulSoup两种(lxml暂不做考虑,因为BS实际上可以用lxml来做解析引擎)。
- 正则表达式(regex)的学习难度视情况而定,如果之前有其他语言的正则表达式基础,对于Python中的正则表达式也能很快上手。
- BeautifulSoup上手更快,语言也更加偏自然化,但是有些编写不那么严谨的网页用BS可能很难解析出来,这时候就需要搭配正则表达式来做提取。
但这些方法某种意义上还是不那么方便,于是便有了Scrapy这种高级抽象的爬虫框架。(它不仅仅可以用来抓Web数据)
从学习难度和操作难度上,从urllib+regex、requests+BeautifulSoup到Scrapy,抽象程度依次加大,方便程度越来越好,但对底层的掌握能更好帮你理解一些实际操作时的Eoor和解析失败的原因。第一个爬虫,我们使用urllib+正则表达式的基础方法来实现。
>第一个爬虫
我们试着抓取百度首页的HTML内容:
url = 'http://www.baidu.com/'
response = urllib2.urlopen(url) # import urllib2
result = response.read()
print result
这时候就能在控制台输出了整个页面的HTML内容了(含JS和CSS)。
但这似乎没什么意思,我们直接利用urllib+regex进行一次实战吧——我们的目标是抓取B站首页的TOP推广视频:
首先,第一步,我们先伪造一次request:
def req(url):
response = urllib2.urlopen(url) # import urllib2
return response
接着,第二步,我们准备开始解析获得的数据,并从整个HTML中利用regex提取出所需要的数据。利用审查元素功能,我们可以得到以下内容:
因此,我们可以很容易得到每个card的DOM Tree结构:
<div class="groom-module home-card">
<p class="title">
<p class="author">
<p class="play">
于是解码方法就可以写出来了:
def decode(response):
card_root_div = r'<div class="groom-module home-card">(.*?)</div>'
card_title_p = r'<p class="title">(.*?)</p>'
card_author_p = r'<p class="author">(.*?)</p>'
card_play_p = r'<p class="play">(.*?)</p>'
all_card_root = re.findall(card_root_div, response, re.S|re.M) # import re
for c in all_card_root:
title = re.search(card_title_p, c, re.S|re.M).group(1)
author = re.search(card_author_p, c, re.S|re.M).group(1)
play = re.search(card_play_p, c, re.S|re.M).group(1)
print title, author, play
执行我们的爬虫脚本:
bilibili_url = 'https://www.bilibili.com/'
decode(req(bilibili_url).read())
输出如下(视频标题+视频作者+视频播放量):
* 关于正则表达式,需要>另外去学习<,这里只对如何“分析网页”并配以“正则表达式提取”做出了解释和演示。
第一个完整的简单爬虫脚本就这样写完了。