zoukankan      html  css  js  c++  java
  • 第一只python小爬虫

    前言:

    互联网就像一张无形的蜘蛛网,网站就相当于在这张网的交叉结点。而网络爬虫就是这张网上的蜘蛛,它是一种程序,能够利用url链接在各网站之间自动穿梭并抓取所需数据。

    学了python的正则表达式之后,我便迫不及待的想要找个应用玩一下,而网络爬虫就是个不二的选择。下面记录一下我写的第一只小爬虫,用来自动下载网页上的图片。

    (操作环境:32位Win8系统,运行工具:python2.7.9+Eclipse.)


    正文:

    1、首先,每个网站都有一个URL地址,通过这个URL可以进入各个相应的网站。我们在浏览网页 点击进入其他网页的时候,其实就是打开其他网页的跳转链接URL。我们所看到的每个网页“背后”都有着很多其他网页的跳转链接,我们只需鼠标右键打开网页源代码即可查看到。

    2、首先,我们用到的是python的urllib模块。其中有几个方法是比较重要的:

    url.urlopen(url,data=None,proxies=None,context=None)  根据URL打开网页,返回一个句柄

    url.urlopen()的对象有个方法:read()  用于读取网页源代码

    url.urlretrieve(url,filename=None,reporthook=None,data=None,context=None)  用于从网页上下载数据到本地


    我们首先用urlopen()打开一个网页,获得一个句柄;然后用句柄.read()获取网页源代码;再用正则表达式从网页源代码中找出各个图片的URL;最后用urlretrieve(URL,'XXX.jpg')下载图片。

    代码如下:

    import re
    import urllib
    
    def getHtml(url):
        page = urllib.urlopen(url)
        html1 = page.read()
        return html1
    
    def getImg(html1):
        reg = 'src="(http://img.{,110}?.jpg)"'
        imglist = re.findall(reg,html1)
        urllib.urlretrieve(imglist[1],'1.jpg')
    
    str2 = raw_input('Please input URL:')
    html1 = getHtml(str2)
    getImg(html1)
    print 'Finish!'
    示例网页:http://mm.taobao.com/689744369.htm

    以上代码只下载了一张图片,但网页上所有图片的URL都已经找到 放在imglist里面,我们只要加上个循环就可以下载全部图片了。


    代码很简单,主要是要获取到图片的URL。而图片URL的获取 是从网页源代码上用正则表达式匹配出来的。

    每一个网页对应的源代码格式都会有点差异,所以我们从不同网页上下载图片,最重要的就是查看网页源代码,分析图片URL的位置,然后编写恰当的正则表达式把图片URL拿下来。


    分享两个视频教程,一个是智普教育的淘女郎图片爬虫(http://pan.baidu.com/s/1ntj2AX7),另一个是中谷教育的小爬虫教学视频(http://pan.baidu.com/s/1nt63lR7)

    我最初看的是中谷教学视频,初识网络小爬虫。后来看到智普的视频,最大的收获就是不小心知道了淘女郎的网址(http://mm.taobao.com/689744369.htm)里面一大片MM的照片,正愁没个好网址来练手呢。然后智普在获取图片URL的时候用的是切片,这也是一种方法,但相对于正则表达式而言就显得太繁杂了。


    总结:

    感觉这个小爬虫挺好玩的,就是现在下载来的图片没什么用,下完了看两眼就都删了。在知乎、博客里面搜了python爬虫的相关资料,其实我这个小爬虫也太小了,根本微不足道,只是下载几张图片而已。爬虫的真正应用是在搜索引擎和爬一些供数据挖掘的源数据,稍微大只一点的爬虫应该是运行在分布式机器上的,而且能够熟练、有效地在各个网页中穿梭、抓取数据。任重道远,继续努力!


    以下是我抓取整一个页面10个淘女郎的图片(将近两千张),首先获取10个淘女郎的主页链接,进入各个淘女郎的主页,然后再获取图片的URL进行下载:

    import re
    import urllib
    global a
    a = 1
    
    def getHtml(url):
        page = urllib.urlopen(url)
        html1 = page.read()
        return html1
         
    def getImg(html1):
        global a
        reg = 'src="(http://img.{,110}?.jpg)"'
        imgre = re.compile(reg)
        imglist = imgre.findall(html1)
        for imgurl in imglist:
            urllib.urlretrieve(imgurl,'%d.jpg'%a)
            print a,imgurl
            a += 1
    
    strMain = raw_input('Please input URL:')
    htmlMain = getHtml(strMain)
    regMain = 'a href="(http://mm.taobao.com/d+?.htm)'
    urlSon = re.compile(regMain)
    htmlList = urlSon.findall(htmlMain)
    for html in htmlList:
        html0 = getHtml(html)
        getImg(html0)
        
    print 'Finish!'
    示例网页:http://mm.taobao.com/json/request_top_list.htm?type=0&page=8

  • 相关阅读:
    angularjs中的指令
    git笔记
    webpack.config.js
    webpack开发react常用插件和依赖
    angularjs中的分页指令
    angularjs中的排序和过滤
    react学习
    gulp学习
    Javascript 判断变量类型的陷阱 与 正确的处理方式
    Fn.bind.apply() 解决 new 操作符不能用与 apply 或 call 同时使用
  • 原文地址:https://www.cnblogs.com/Bone-ACE/p/4531304.html
Copyright © 2011-2022 走看看