现在全球处于一个大数据爆发的时代,网络数据的获取需要通过计算机自动实现,网络爬虫可实现对网页上的图片的抓取。Python语言的易读、易学、可移植等优点使其成为人工智能大潮下最炙手可热的语言之一。通过Python3实现网络爬虫,并将获取到的图片自动存储到本地,为后续的机器学习、人工智能奠定了数据基础。
近年来,随着信息技术的进步,互联网发展突飞猛进,中国已有接近7亿互联网用户,互联网也已深入到各地区各行业,爆炸式的数据增长使传统的依靠信息管理人员人工获取数据变得不可能。网络爬虫是一种按照特定的规则,对网络信息自动抓取的程序或者脚本,也被称为网络机器人或网页蜘蛛。网络爬虫通过模仿浏览器对网页的URL地址访问的方式进行,用户不需要人工操纵即可自动地获取所需要的数据。Python语 言自1991年诞生,现已发展到3.7.0版本,因其功能强大、开源、语法简洁清晰,几乎在目前所有的操作系统上都能够运行,具有丰富和强大的库,被逐渐广泛应用于系统管理任务的处理和Web编程中,2017年7月20日IEEE发布2017年编程语言排行榜,Python高居首位,超过C语言与Java。
Python爬虫的设计需要了解爬虫的原理,爬虫是抓取糗事百科上的JPG及GIF格式趣图,方便离线观看。爬虫用的是Python3.X版本开发,主要用到了urllib的request和re、 os模块,模块是一个包含变量、函数或类的定义的程序文件,正是Python大量的第三方库支持使得Python开发简单易学,使用模块前只需要通过import导入模块即可。urllib模块提供了从万维网中获取数据的高层接口,当用urlopen()打开一个URL时,就相当于用Python内建的open()打开一个文件。但不同的是,前者接收一个URL作为参数,并且没有办法对打开的文件流进行seek操作,而后者接收的是一个本地文件名。抓取到网页含有包括动画、图片、文档等各种格式元素。这些文件被爬虫抓取下来后,需要将其中的目标信息提取出来。正则表达式是一种在文本中寻找特定字符串的方法,能够准确地提取文档的特定信息。 re模块(regular expression)是Python中支持正则表达式的库。Pattern实例是re处理文本并获得匹配结果的必须步骤,Re库必须先将用户给定的正则表达式字符串编译为Pattern实例, Pattern实例也被称为Match实例,它是程序获得信息并作其他操作的基础。OS模块是一个Python的系统编程的操作模块,提供了丰富的适用于Mac、NT、或Posix的 操 作系统函数,这个模块允许程序独立地与操作系统环境、文件系统、用户数据库以及权限进行交互。
1、爬虫准备如下:
#导入所需的urllib、re、os库
import urllib.request, re, os
#定义抓取到的文件保存路径
My_target Path = "F:\\python3.5学习\\01_spider\\qiubai"
#目标网址
My_url = "http://www.qiushibaike.com/"
2、下一步就是伪装成浏览器,对于一些网站,如果不是从浏览器发出的请求,则得不到响应。所以,需要将爬虫程序发出的请求伪装成浏览器。 User Agent是Http协议中的一部分,中文名叫用户代理,属于头域的一部分。在访问网站时通过用户代理向服务器提供用户使用的操作系统及版本、浏览器版本及类型、浏览器的内核等信息标识。通过改写Us-er-Agent将Python爬虫伪装成浏览器。
My_headers = {
'User -Agent': 'Mozilla/5.0 (Windows NT
10.0; Trident/7.0; rv:11.0; Juzi Browser) like Gecko'
'Chrome/51.0.2704.63 Safari/537.36'
}
3、存储图片函数,通过之前导入的os模块操作图片的存储路径,主要用到os.path.isdir来判断指定对象目录是否存在,如果不是指定文件目录使用os.mkdir来创建目录,最后使用os.path.join将目录与图片的存储名称连接。
def save File(path):
#对保存路径有效性的识别
if not os.path.isdir(My_target Path):
os.mkdir(My_target Path)
#设置抓取到的图片的存储路径
My_pos = path.rindex('/')
t = os.path.join(My_target Path,path[My_pos+1:])
return t
4、爬虫主体函数:首先通过urllib的request和urlopen方法模拟浏览器访问目标页面获取网页数据,然后对数据进行适当的编码操作,其次通过空白符切割网页数据,使用正则表达式获取jpg和gif格式的文件,最后将获取的图片文件存储到本地指定的文件夹。
def spider_qiubai(url):
My_req = urllib.request.Request (url = My_url,
headers=My_headers)
My_res = urllib.request.urlopen(My_req)
My_data = My_res.read()
data = My_data.decode('GBK')
#本网页不适合utf-8编码,只能用GBK编码
#对母网页内容处理,
k = re.split(r'\s+', data)
s = []
si = []
for i in k:
if (re.match(r'.*?jpg"', i) or re.match(r'.*?gif"', i)):
s.append(i)
#获取这些图片链接的内容,并保存成本地图
for it in s:
re_m1 = re.search(r'src="(.*?)"', it)
My_iturl = re_m1.group(1)
print(My_iturl)
try:
urllib.request.urlretrieve(My_iturl, save File(My_iturl))
except:
print('失败')
5、多页面抓取:分析目标页面发现,多个连续的页面只是url的某个值不同,通过设置抓取网页的起始页与终止页的页码范围与
url相同部分进行拼接,模拟浏览器的分页操作,实现对相应的多个页码的所有数据的抓取。
#main
if _name_ == '_main_':
#来判断本py程序是直接运行还是被引用
sta_page=1#网站的起始页
end_page=500#网站的终止页
while sta_page<end_page:
print("现在爬取的是第"+str(sta_page)+"页")
My_url = url+str(sta_page)+'.html'
spider_qiubai(My_url)
sta_page += 1
总结一下,本程序能有效实现相应爬虫功能。而且这种爬虫编程简洁明了,对于初学者有很好的指导作用,对于专注数据分析的小伙伴能够节省编码时间,将更多精力投入数据挖掘中来,请大家继续关注!!!