前言:
互联网就像一张无形的蜘蛛网,网站就相当于在这张网的交叉结点。而网络爬虫就是这张网上的蜘蛛,它是一种程序,能够利用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
转载请注明出处,谢谢!(原文链接:http://blog.csdn.net/bone_ace/article/details/44598527)