#!/bin/python3
import urllib.request as request
import urllib.parse as parse
import string
import re
import os
import urllib.error as error
print("""
++++++++++++++++++++++
*++++网站图片捕捉中+++
+++++++++++++++++=++++
""")
def baidu_tieba(url, begin_page, end_page):
count = 1
for i in range(begin_page, end_page + 1):
sName = 'f:/test/'+str(i).zfill(5)+'.html'
print('正在下载第'+str(i)+'个页面, 并保存为'+sName)
m = request.urlopen(url+str(i)).read()
#创建目录保存每个网页上的图片
dirpath = 'f:/test/'
dirname = str(i)
new_path = os.path.join(dirpath, dirname)
if not os.path.isdir(new_path):
os.makedirs(new_path)
page_data = m.decode('UTF-8','ignore')
#关于decode和encode,Python中编码的解码与编码会详细介绍
page_image = re.compile('
for image in page_image.findall(page_data): #在page_date中查找所有含有IMG标签的字符串
pattern = re.compile(r'^http://.*.jpg$')
if pattern.match(image): #如果在含有IMG标签包含图片链接,则下载
try:
image_data = request.urlopen(image).read()
image_path = dirpath + dirname +'/'+str(count)+'.jpg'
count += 1
print(image_path)
with open(image_path, 'wb') as image_file:
image_file.write(image_data)
image_file.close()
except error.URLError as e:
print('Download failed')
with open(sName,'wb') as file:
file.write(m)
file.close()
if __name__ == "__main__":
url = 'http://tieba.baidu.com'
begin_page = 1
end_page = 3
baidu_tieba(url, begin_page, end_page)
其中创建文件夹等部分不赘述,重点讲解下Python中re模块(正则表达式模块的内容),也就是下面两句:
page_image = re.compile('
page_image.findall(page_data):
re.compile()可以把正则表达式编译成一个正则表达式对象。可以把那些经常使用的正则表达式编译成正则表达式对象,这样可以提高一定的效率。下面是一个正则表达式对象的一个例子:
import re
text = " JGood is a handsome boy, he is cool, clever, and so on... " regex = re.compile(r ' \w*oo\w* ' )print regex.findall(text) # 查找所有包含'oo'的单词 print regex.sub( lambda m: ' [ ' + m.group(0) + ' ] ' , text) # 将字符串中含有'oo'的单词用[]括起来。
其中相关到正则表达式,可参考这个教程《正则表达式30分钟入门教程》(网址:http://www.jb51.net/tools/zhengze.html)
这段正则表达式的含义是:
'^http://.*.jpg$'该正则表达式:^表示字符串的开始,$表示字符串的结束,整个式子表示所有图片的链接。
所以,改程序最主要的内容就是在读取的网页中检索图片的链接字符串。具体步骤如下:
----------------------------------------------华丽分割-------------------------------------------------
第一步,抓取网页内容:
m = request.urlopen(url+str(i)).read()
page_data = m.decode('UTF-8','ignore')
第二部,筛选IMG标签:
page_image = re.compile('
page_image.findall(page_data)
第三部,在筛选出的IMG标签中,检索图片链接:
pattern = re.compile(r'^http://.*.jpg$')
if pattern.match(image):
#后面的语句
如果在含有IMG标签包含图片链接,则下载
--------------------------------------------华丽结束---------------------------------------------------
关于图片数据的保存,不赘述。
由此可知,完成网页爬虫需要学习的Python模块,是:
1.urllib.request
2.urllib.parse
3.re
其中Python os模块包含普遍的操作系统功能,其主要作用就是能够使程序与平台无关。(详见《Python 模块学习:os模块》)