用Python写一个简单的爬虫功能

首页,我们要爬虫的网页是百度图片的首页,把首页显示的10张图片地址爬下来,然后下载至本地。

在Safari浏览器打开地址:http://image.baidu.com,右键点击其中一张图片,点击“检查元素”,我们就可以定位至img标签,找到属性class=”img_pic_layer horizontal”,在本页面搜索匹配img_pic_layer horizontal,刚好有10项匹配上,说明我们要找的图片url就是img标签的src地址。

我们需要两个库,一个叫做urllib2,一个叫做Beautifulsoup.

urllib2是干什么的呢?它的作用就是把网页down下来,然后你就可以分析网页了.

Beautifulsoup干什么的呢?你用urllib2把网页down下来了之后,里面都是html+css什么的,你想要从乱七八糟的一堆html里面找到正确的图片链接那可不是件简单的事,据我这几天的学习,做法无非两个,一个是自己写正则表达式然后用一个叫re的python库,另一个是使用lxml解析xpath.这两个说实话都不太好用,一个正则就够你吃一壶的.后来我搜索了很久,发现了一个库叫做Beautifulsoup,用这个库解析html超级好用.

BeautifulSoup这个库是需要pip下载安装的.urllib2因为是自带的,所以不用你下载了.

然后看代码.

#!/usr/bin/python
#-*- coding: utf-8 -*-
#encoding=utf-8
import urllib2
import urllib
import os
from BeautifulSoup import BeautifulSoup
def getAllImageLink():

    html = urllib2.urlopen('http://image.baidu.com').read()
    soup = BeautifulSoup(html)
    liResult = soup.findAll('img',attrs={"class":"img_pic_layer"})
    #print liResult 方便调试

    count = 0;
    for image in liResult:
        count += 1
        link = image.get('src')
        imageName = count
        filesavepath = '/Users/liyan781/Documents/TestPython/%s.jpg' % imageName
        urllib.urlretrieve(link,filesavepath)
        print filesavepath 
if __name__ == '__main__':
    getAllImageLink()

  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

我们来一句一句分析下.其实python的语法超级简单.

凡是#打头的就是python里面的注释语句类似于oc里的//.

分别说明我们的环境是python,编码是utf-8

然后import了四个库,分别是urllib2,urllib,os,和Beautifulsoup库.

导入Beautifulsoup库的方式和其他三个不太一样.我暂时也不清楚为什么python用这种导入方式,不过照猫画虎就行了.

然后def打头的就是定义一个函数,python里面是不用分号做句与句的分隔符的.他用缩进来表示.与def缩进一个tab的都是函数体.

 html = urllib2.urlopen('http://image.baidu.com').read()
  
  
  • 1
  • 1

这句很简单,就是读取网页的html.然后把值赋给html这个变量.python里声明变量前面不用加任何东西,不用加声明语句和变量类型,就连javascript声明变量还要加个var呢.

我们获取了网页的html之后呢,声明了一个Beautifulsoup变量soup,用来准备解析html.

liResult = soup.findAll('img',attrs={"class":"img_pic_layer"})
  
  
  • 1
  • 1

这句话的意思就是,寻找html中所有img标签,并且这个img标签有个属性class,值是img_pic_layer.

注意这个findAll函数,有点常识的话你应该清楚,凡是带all的函数基本上返回的都是一个数组,所以我们liResult这个变量实际上是一个数组.

其实在Safari浏览器里打开百度图片首页的地址,然后查看图片的img标签的class属性,值其实是img_pic_layer horizontal。但为什么代码里的值是img_pic_layer呢?

因为如果你直接把百度图片首页的页面html的img标签打印出来,它的class属性值就是img_pic_layer,所以代码里用的就是这个值。至于为什么,可能这个页面做了些什么吧,我们就不追究了。

for image in liResult:
  
  
  • 1
  • 1

这句话基本和oc里的遍历数组语法完全一样.就是遍历liResult里的每一个变量.那么每一个变量就是一个标签.

link = image.get('src')
  
  
  • 1
  • 1

这句的意思就是,获取img标签里的src属性,src就是我们最想要的图片链接了.

这里定义了一个变量count = 0,然后在 for 循环里面做递加 count += 1,最终把这个值

赋给我们的变量imageName = count,以便后面使用。

filesavepath = '/Users/liyan781/Documents/TestPython/%s.jpg' % imageName

urllib.urlretrieve(link,filesavepath)
  
  
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

这两句,第一句是设置一个文件存放地址,第二句用urllib这个库的urlretrieve这个方法下载我们的图片,并且把图片放到刚才的路径里.

好了,万事具备了,我们现在跑一下我们的脚本

python downloadImage.py
  
  
  • 1
  • 1

好了,我们的图片就下载完了.

然后在看看下载的内容:

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值