网络爬虫初级攻略
在这里将使用一个非常简单的爬取某网站照片的爬虫作为实例,来归纳一下使用urllib2库进行网络爬虫构建的方法。
首先,下面是这个爬虫的源代码,不过该代码还不能正常运行,因为没有给网址,也没有对应的爬取照片的正则表达式。
#coding=utf-8
import urllib2
import re
import os
class findMM:
def __init__(self):
self.addr=''
self.number=1
def getPage(self,page):
url=self.addr+'page/'+str(page)
try:
request=urllib2.Request(url)
response=urllib2.urlopen(request)
except urllib2.URLError,e:
if hasattr(e,'reason'):
print u"连接网站失败,原因",e.reason
return response.read()
def getImages(self,response):
pattern=re.compile('<li class="post-attachment.*?<img.*?src="(.*?)"',re.S)
results=re.findall(pattern,response)
contents=[]
for result in results:
contents.append(result)
return contents
def saveImage(self,imageURL,filename):
try:
u=urllib2.urlopen(imageURL)
except urllib2.URLError,e:
if hasattr(e,'reason'):
print u"图片获取失败,原因:",e.reason
else:
data=u.read()
f=open(filename,'wb')
f.write(data)
f.close()
def saveImages(self,images):
print u"共有",len(images),u"张照片"
for imageURL in images:
print u'正在保存第'+str(self.number)+u'张照片'
#首先构造保存的图片名称
splitPath=imageURL.split('.')
ftail=splitPath.pop()
if len(ftail)>3:
ftail='jpg'
filename='image/'+str(self.number)+"."+ftail
self.saveImage(imageURL,filename)
self.number+=1
def mkdir(self,path):
path=path.strip()
isExists=os.path.exists(path)
if not isExists:
os.makedirs(path)
print u"偷偷的新建了名字叫做",path,u"的文件夹"
return True
else:
print u"名字为",path,u"的文件夹已经创建成功"
return False
def start(self,start=2,end=68):
self.mkdir('image')
for i in range(start,end+1):
print u'正在获取第'+str(i-1)+u'页的图片...'
response=self.getPage(i)
images=self.getImages(response)
self.saveImages(images)
print 'done!'
findmm=findMM()
findmm.start()
首先网络爬取不论什么它的步骤都是这样的:
- 首先构建url,格式是http://www.baidu.com这种的
- 接下来构建request,使用
request=urllib2.Request(url)
,当然如果只发送url的话可以直接使用response=urllib2.urlopen(url)
,使用request是一种比较标准的模式,因为在发送构建request的时候,可以加上POST数据,还有网页有可能需要的headers数据。比如这样:request = urllib2.Request(PostUrl, data, headers)
- 接下来是构造opener来获取到网页的源代码。可以选择urlopen构建默认的opener,
response=urllib2.urlopen(url)
。如果还包含比较复杂的数据则使用response = opener.open(request)
。 - 最后获取到的数据使用read方法解析并且返回,在这里要注意的是网站代码的编码方式,选择是否解码和合适的解码方式。比如return response.read().decode('gbk')
- 最后就是try-except语句的使用来处理可能会发生的URLError。
- 读取到的网页源代码此时就可以使用正则表达式进行匹配了,首先构造正则表达式,
pattern=re.compile('正则表达式',re.S)
,re.S是使.可以匹配任意字符包括换行符。 - 然后使用re模块的search,findall等方法获取要匹配的内容。
其他的内容比如类的使用,文件的读取,os库的使用,可以根据上面给的实例好好琢磨,学习吸收。