最近研究了一下Python爬虫程序,发现挺简单的。果然不去接触的东西,总是最难的,有时间还是要多去研究一下自己喜欢的感兴趣的东西。下面我们来看一下,Python爬虫是怎么实现的。
废话不多说,先来看一下成果图
下面是爬取的网页保存成TXT文件
下面是爬取保存的图片
看完效果是不是有一种跃跃欲试的感觉。下面我们说一下具体的环境和代码。
什么是爬虫
1.网络爬虫:是一种按照一定的规则,自动地抓取网上信息的程序或者脚本。
2.爬虫:为了获取网上大量的我们能看的到或看不到的数据
运行环境
Python版本: Python3.x
运行平台: Windows
基本步骤
(1)定位要爬的网页地址
urllib中有 urllib.urlopen(str) 方法用于打开网页并返回一个对象。
page = urlopen(url)
(2)获取网址的html文档
调用这个对象的read()方法后能直接获得网页的源代码,内容与浏览器右键查看源码的内容一样。
htmlcode = page.read()
(3)解析网址的html文档
首先我们要一个正则表达式 (如果不懂可以提前看一下菜鸟入门教程-->Go)。
下面正则表达式(src="(\http\S+?\.jpg)),匹配以src="后接http(保留在匹配字符中)开头,然后接一个或多个任何非空白字符,以.jpg" width结尾的字符串。
这样就能获取到图片链接。
reg = r'src="(\http\S+?\.jpg)'#正则表达式
reg_img = re.compile(reg)#编译一下,运行更快
imglist = reg_img.findall(htmlcode.decode('utf-8'))#进行匹配
(4)搜寻要下载的数据并保存到本地;
urllib库中有一个 urllib.urlretrieve(链接,名字) 方法,它的作用是以第二个参数为名字下载链接中的内容
urllib.urlretrieve(img, 'tieba.jpg')
(5)循环上面四步
我们来试用一下在上面代码循环中加上 urllib.urlretrieve(img, 'tieba.jpg')
for img in imglist:
urllib.urlretrieve(img, 'tieba.jpg')
发现只有一个图片文件tieba.jpg,这是因为后面下载的图片也命名为tieba.jpg覆盖了前面现在的图片,修改成 './%s/%s.jpg' %(savepath, x) ,并在其中添加保存路径为当前路径src。
x=0
for img in imglist:
print('img :',img)
urlretrieve(img, './src/%s.jpg' %x)
x += 1
添加交互提示
最后我优化了下小程序的交互,封装程序就如下图这样。
报错问题
具体可以查看我的文章:【Python】学习Python爬虫遇到几个小问题!
其他阅读
推荐阅读:
【Python】揭秘知乎最受欢迎的 98 本书!唯有阅读来报之!
结束语
是不是很简单,大家也赶紧动手来写一个你爬虫小程序吧。下面是源码,欢迎留言指正不足的地方。
# -- coding: UTF-8 --
from urllib.request import urlopen
from urllib.request import urlretrieve
#写文件
def write_file(file, filename='test.txt'):
pageFile = open(filename,'wb')#以写的方式打开pageCode.txt
pageFile.write(file)#写入
pageFile.close()#开了记得关
#获取到网页内容
def get_html(url):
page = urlopen(url)
htmlcode = page.read()
return htmlcode
#创建新目录
def mkdir(path):
# 引入模块
import os
# 去除首位空格
path=path.strip()
# 去除尾部 \ 符号
path=path.rstrip("\\")
# 判断路径是否存在
# 存在 True
# 不存在 False
isExists=os.path.exists(path)
# 判断结果
if not isExists:
# 如果不存在则创建目录
# 创建目录操作函数
os.makedirs(path)
print (' 创建成功',path)
return True
else:
# 如果目录存在则不创建,并提示目录已存在
print (' 目录已存在',path)
return False
#获取到网页图片并保存到src目录
def get_image(htmlcode, savepath='src1'):
import re
reg = r'src="(\http\S+?\.jpg)'#正则表达式
reg_img = re.compile(reg)#编译一下,运行更快
imglist = reg_img.findall(htmlcode.decode('utf-8'))#进行匹配
x=0
mkdir(savepath)
#os.makedirs('%s' %savepath)
for img in imglist:
print('img :',img)
urlretrieve(img, './%s/%s.jpg' %(savepath, x))
x += 1
print ("-------Python网页图片抓取-------")
path = input('请输入 url:')
if path:
print ("-------输入了网址:%s-------" %path)
pass
else:
path='http://tieba.baidu.com/p/6127945649'
print ("-------使用默认网址:%s-------" %path)
print ("-------开始获取网页-------")
htmlfile = get_html(path)
#write_file(htmlfile)
print ("-------开始下载图片-------")
get_image(htmlfile)
print ("-------下载图片完成-------")
input("按任意键退出")
也欢迎大家关注我们的公众号,每天学一点技术。也欢迎大家踊跃留言跟我交流交流。
- END -