[Python][爬虫01]从零环境搭建到第一个实例

>Python环境

    首先,我们需要下载一定版本的Python。

    Python版本主要分2.7和3.x两种选择,由于Python3中的部分语法和特性对比Python发生了改变,因此一些原有的库对3的支持不是那么好。

    考虑到日后的某些方便,这里采用Python 2.7(64bit)。(64位的Python相比,没有32位Python内存上限为2G的局限。)当然,一般来说,我会同时安装Python3和Python2.7。

    接着,我们需要一款IDE。选择主要如下:EclipseIDEAPyCharm

  • Eclipse是完全免费的,而后两款是收费的(但都有免费的社区版和教育版)。
  • 而Eclipse和IDEA其实严格来说是JAVA的编译器,但是都有相应的Plugins用于对其他语言进行扩展;PyCharm则是IDEA的制作公司JetBrains为python专门打造的集成开发环境。
  • 从总的使用体验来说,IDEA和PyCharm的使用体验远好过Eclipse,Eclipse的pyhon环境搭建可>参考此处<;IDEA的python环境搭建可以>参考此处<

>Spider的抽象级别

    在Python中,一个完整的爬虫(互联网蜘蛛)的实现方式多种多样,但主要过程还是两步:

  1. 伪装HTTP Request并获取相应的HTML文件(包括且不限于CSS、JS等内容);
  2. 解析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())

    输出如下(视频标题+视频作者+视频播放量):


    * 关于正则表达式,需要>另外去学习<,这里只对如何“分析网页”并配以“正则表达式提取”做出了解释和演示。


    第一个完整的简单爬虫脚本就这样写完了。

猜你喜欢

转载自blog.csdn.net/shenpibaipao/article/details/80213996