Python编程(一)--爬虫爬取图片

前言

我认为为了更好的进行渗透测试,提高效率,必须掌握一项编程语言,可以化繁为简,减少人为的操作影响。于是琢磨了一下Python编程,爬去乐乎上面徐娇妹纸的图片。以下我是自己编写的一个小脚本,虽然很小,但觉得有记录一下的意义。初次学习,大神勿喷~~

安装 Requests

Requests模块 :Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。Requests 的哲学是以 PEP 20 的习语为中心开发的,所以它比 urllib 更加 Pythoner。

re模块 :正则表达式(可以称为REs,regex,regex pattens)是一个小巧的,高度专业化的编程语言,它内嵌于Python开发语言中,可通过re模块使用。正则表达式的pattern可以被编译成一系列的字节码,然后用C编写的引擎执行。

网络爬虫用到的做多的http请求处理模块是requests。 requests模块比 urllib 更加方便,可以节约我们大量的工作,其开发宗旨是:

  • Beautiful is better than ugly.(美丽优于丑陋)
  • Explicit is better than implicit.(清楚优于含糊)
  • Simple is better than complex.(简单优于复杂)
  • Complex is better than complicated.(复杂优于繁琐)
  • Readability counts.(重要的是可读性)

如果你的环境里有pip,可以直接通过pip安装:

pip install requests

或者,你可以下载github代码后安装:

$ git clone git://github.com/kennethreitz/requests.git
$ cd requests
$ python setup.py install

我这里使用了一个图片处理模块:PIL;这个模块仍然需要安装;可以使用pip进行安装:

pip install PIL
pip search PIL //如果安装失败,可以使用这个命令进行查找到Pillow;更换名字
pip install Pillow 
//如果还是不能安装就只有去下载了,根据自己环境的情况到如下链接中下载了:
[Python Imaging Library (PIL)](http://www.pythonware.com/products/pil/)

接下来是我自己编写的一个python脚本:爬去徐娇妹纸的图片!

# coding:utf-8
import requests, re
import cStringIO, urllib
from PIL import Image
import time
from time import ctime

url = 'http://jieyinjy.lofter.com/post/74fa8_10cdcb7e'
u = requests.get(url)
text = u.text
xujiaolist = re.findall(r"http://[^\s]*\.jpg", text)
print ("all:" + str(len(xujiaolist)))
tempsize = 0
x = 1
start = time.time()
for i in xujiaolist:
    image = urllib.urlopen(i)
    tempimage = cStringIO.StringIO(image.read())
    sizeimage = Image.open(tempimage)
    if (sizeimage.size[0] < 2000) or (sizeimage.size[0] == tempsize):
        tempsize = sizeimage.size[0]
        continue
    else:
        #print (sizeimage.size)
        tempsize = sizeimage.size[0]
        urllib.urlretrieve(i, 'E:\\zhaopian\\xujiao_%s.jpg' % x)
        print ('%s' % x + ',success %s' % ctime())
        x += 1
end = time.time()
time = (end - start)/60
print ("all time %s" % time)
print("%s end" % ctime())

代码分解

定义一个url,爬去目标网站的url,使用requests进行get请求;请求道的内容赋值给变量u

url = 'http://jieyinjy.lofter.com/post/74fa8_10cdcb7e'
u = requests.get(url)
text = u.text

我们请求的URL后,返回了页面的源代码,但是我们只需要其中徐娇妹纸图片的连接,所以这里使用正则表达式匹配所需要获取的URL连接,同时输出我们一共获取了多少个图片连接;

xujiaolist = re.findall(r"http://[^\s]*\.jpg", text)
print ("all:" + str(len(xujiaolist)))

这里我们虽然获取了图片连接,但是有一部分是我们不需要的图片,这又该怎么做呢?通过分析网站图片,发现我们所需要的图片的像素很高,而不需要的图片都只是小图片,所以我们可以使用一个比较像素大小的方法来排除我们不需要的图片!所以这里PIL模块在这里就有用武之地了!使用for循环,依次访问图片URL,远程读取图片,再获取图片信息,图片类型、格式、大小!

for i in xujiaolist:
    image = urllib.urlopen(i)
    tempimage = cStringIO.StringIO(image.read())
    sizeimage = Image.open(tempimage)

接下里获取了图片的大小后,开始比较大小!我们只取大于2000的图片;但是我们所需要获得的图片连接被重复提取了两次,所以我们还需要判断一下,是否图片大小相等。如果图片小于2000或者图片大小与前一张图片大小一致,就执行continue;否则将图片下载到指定文件夹中,并输出success!

 if (sizeimage.size[0] < 2000) or (sizeimage.size[0] == tempsize):
        tempsize = sizeimage.size[0]
        continue
    else:
        #print (sizeimage.size)
        tempsize = sizeimage.size[0]
        urllib.urlretrieve(i, 'E:\\zhaopian\\xujiao_%s.jpg' % x)
        print ('%s' % x + ',success %s' % ctime())
        x += 1

最后就是统计下载所花费的时间是多少了;使用了time模块,获取当前时间。

end = time.time()
time = (end - start)/60
print ("all time %s" % time)
print("%s end" % ctime())

后记

编写这个脚本不难,对我来说难的是编写正则表达式,写表达式的时候纠结了很久,这也反映出自己的正则表达式学的不怎么样!需要好好研究研究,还有这次所下载的很大,所以下载的很慢,这里需要提高一下运行效率,下次希望能够把线程运用上。还需要构造一个请求头,模仿正常访问网页模式操作。

猜你喜欢

转载自blog.csdn.net/u011215939/article/details/79038824