环境:
Mac OS X Yosemite 10.10.4
Python2.7.6
哎,其实早就迫不及待的想动手了,今天下午终于抽时间写了个很简单的爬虫的小例子。
例子的目标是
下载 豆瓣妹子 从n1页到n2页的照片(n1, n2自定义)
打开豆瓣妹子主页 http://www.dbmeinv.com/?pager_offset=1 右键审查元素,查找图片对应的代码
那么,我们的思路就是获取网页内容之后,通过正则表达式匹配到所有图片的src,然后将图片保存为本地文件。
ok,每张图片对应一个
<img >
中,为确保图片使我们想下载的图片,可以在向外匹配到<span> </span>
,该正则表达式的匹配模式是 <span>.*?img.*?alt="(.*?)".*?src="(.*?)".*?>.*?</span>
(关于正则表达式可参考正则表达式学习笔记(一)),看到两个()
是引用分组,可通过num获取对应的分组文本,这里分别获取 src 和 alt,src 是获取图片的资源链接,alt可以用来给保存本地的图片命名。好,下一步是获取该网页的文本内容,新建文件dbmeizi.py代码:
# -*- coding:utf-8 -*-
import urllib
import urllib2
url = 'http://www.dbmeinv.com/?pager_offset=1'
response = urllib2.urlopen(url)
text = response.read()
print text
在终端执行 python dbmeizi.py
恩,顺利得到网页文本没有问题
然后通过正则表达式获取图片的url
# -*- coding:utf-8 -*-
import urllib
import urllib2
import re
url = 'http://www.dbmeinv.com/?pager_offset=1'
response = urllib2.urlopen(url)
text = response.read()
pattern = re.compile(r'<span>.*?img.*?alt="(.*?)".*?src="(.*?)".*?>.*?</span>', re.S)
imgs = re.findall(pattern, text)
for img in imgs:
print img[0], img[1]
终端执行
然后,将图片保存在本地,并通过同时获取的alt给图片命名。
# -*- coding:utf-8 -*-
import urllib
import urllib2
import re
import os
url = 'http://www.dbmeinv.com/?pager_offset=1'
response = urllib2.urlopen(url)
text = response.read()
pattern = re.compile(r'<span>.*?img.*?alt="(.*?)".*?src="(.*?)".*?>.*?</span>', re.S)
imgs = re.findall(pattern, text)
i = 0
os.system("mkdir images") #通过命令行的方式创建图片保存目录
for img in imgs:
imagePath = "images/%d_%s.png" % (i, img[0])
imageUrl = img[1]
imageData = urllib.urlopen(imageUrl).read()
f = open(imagePath, 'w')
f.write(imageData)
print '正在保存图片:', imagePath
f.close()
i += 1
需要注意的是,我们引入了 模块 os
为了执行命令行命令创建图片保存目录。还声明了一个全局变量i,给图片编号。
终端执行
到现在,已经完成了主要工作,要下载n1页到n2页的所有图片,只需要对url中的p进行修改。还可以对代码进行必要的封装,比如将下载图片和保存图片单独封装成一个类方法。下载n1到n2封装成一个类方法,统一调用。
最后代码如下:
# -*- coding:utf-8 -*-
import urllib
import urllib2
import re
import os
class ImageSpider(object):
"""docstring for ClassName"""
num = 0;
def __init__(self):
pass
def saveImage(self, imageUrl, imageName):
imageData = urllib.urlopen(imageUrl).read()
f = open(imageName, 'w')
f.write(imageData)
print '正在保存图片:', imageName
f.close()
def getImageFormUrl(self, url):
response = urllib2.urlopen(url)
text = response.read()
pattern = re.compile(r'<span>.*?img.*?alt="(.*?)".*?src="(.*?)".*?>.*?</span>', re.S)
imgs = re.findall(pattern, text)
for img in imgs:
imageName = "images/%d_%s.png" % (ImageSpider.num, img[0])
imageUrl = img[1]
self.saveImage(imageUrl, imageName)
ImageSpider.num += 1
def getImagePageRange(self, fromPage, toPage):
os.system('mkdir images') #创建保存图片的目录
i = int(fromPage)
while i <= int(toPage):
url = "http://www.dbmeinv.com/?pager_offset=" + str(i)
print "\n第%d页" % i
self.getImageFormUrl(url)
i += 1
imageSpider = ImageSpider()
beginPage = raw_input("输入开始页:")
endPage = raw_input("输入结束页:")
imageSpider.getImagePageRange(beginPage, endPage)
网友评论