Python实现一个简单的图片爬虫
来源:互联网 发布:淘宝互刷信誉平台 编辑:程序博客网 时间:2024/05/16 06:39
前言
提起爬虫,很多人都会感觉很神秘,包括以前的我也是一样的,只要是和爬虫的相关的知识我都感觉很高端,后来渐渐的接触的多了,也就慢慢地明白的了究竟什么是爬虫,说说我理解的吧,爬虫本身是一项技术,很有用的一项技术,但是如果被毫无节制的使用,不仅会侵犯他人的知识产权,同时还会浪费过多的服务器资源。
其实爬虫访问的绝大多数都是正常的网站,只不过它不需要人们正常的打开浏览器输入网址,就可以访问到浏览器中的内容,比如我们可以直接获取到某个网站首页的新闻,或者得到某个数据网站的表格数据,通俗的来说就是通过编写程序来模拟人访问网站的行为,来获取网站页面中的数据。
接下来我来写个小例子来实现一个图片爬虫的功能,本文涉及到的代码只是想说明爬虫的作用,让大家了解一下爬虫并不是那么神秘,所写代码只做学习使用,切记不可用来做获取非法的内容,其实接下来的代码很简单,只能实现很有限的功能,想要做成有实际作用的爬虫真得好好下一番功夫才行。
代码实现
首先我们得引入爬虫实现中经常要使用的库:
import urllib.request, re, os
其中urllib.request
是用来发起去HTTP请求的,re
是使用正则表达是查找的,os
是用来做一些系统级别的操作的。
接下来定义一下变量:
# save file pathtarget_path = "images_crawler_results"# target url that needs to crawlertarget_url = "https://www.csdn.net/"# request data headersreq_headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.63 Safari/537.36' }
前两个变量很容易理解,这里不再赘述,既然是在CSDN上发表的,那就干脆抓一下CSDN首页(https://www.csdn.net/)的图片好了,详细说一下最后一个字典类型的变量,实际上就是为了骗过网站服务器,让它感觉是真正的一个人在访问网站,而不是一段程序,这里不得不提一下HTTP请求的一些参数,HTTP 的请求头是在你每次向网络服务器发送请求时,传递的一组属性和配置信息,HTTP 定义了十几种古怪的请求头类型,不过大多数都不常用,只有几种是很常用的,比如:
这里最重要的参数就是
User-Agent
了,如果使用默认参数,那么这一项的值默认是Python-urllib/3.4
,是不是很尴尬,这样一眼不就看出来是程序自动处理的嘛,所以我们要伪装一下,使用变量req_headers
中的值
接下来定义一个函数,用来获取保存下载图片需要保存的路径,根据图片的名字命名图片,并且同意保存到目录images_crawler_results
中:
def get_file_local_path(file_path): file_name = os.path.split(file_path)[1] return os.path.join(target_path, file_name)
接着我们再定义一个函数start_crawler
来启动我们的爬虫,首先检查一下目录images_crawler_results
是否存在,如果不存在就创建一个:
if not os.path.isdir(target_path): os.mkdir(target_path)
然后发送HTTP请求获得数据,数据以二进制形式保存在变量data
中:
req = urllib.request.Request(url = target_url, headers = req_headers)res = urllib.request.urlopen(req)data = res.read()
最后,在变量data
中利用正则表达式查找出所有图片的链接,然后下载保存在本地:
for link, t in set(re.findall(r'(images.csdn.net[\S]*?(jpg|png|gif))', data.decode('utf8'))): reallink = 'https://' + urllib.request.quote(link) print(reallink) try: urllib.request.urlretrieve(reallink, get_file_local_path(link)) except: print('crawler failed')
这段代码中比较重要是data.decode('utf8')
这一句,就是把HTTTP请求的返回的二进制数据按照utf8编码解析出来,这样通过正则表达式查找出来的图片路径就是正常的,但是有些是中文,如果不做处理就会下载失败,所以后面又加上了urllib.request.quote(link)
就是为了对链接进行URL编码,最后通过函数urllib.request.urlretrieve
就可以保存在本地了啊,是不是很简单呢?
总结
- 网络爬虫本身是一门很有用的技术,但是也是一把双刃剑,用错了害人害己,当然了如果只是为了减轻工作量,避免一些重复性操作,在不影响他人的情况下,我感觉偶尔用用还是不错的。
- 网络爬虫博大精深,需要仔细钻研才能解决实际操作中的文问题,比如这个小例子中,一开始就无法现在中文的图片,后来通过转码和URL编码才解决。
源代码
完整代码传送门,有什么问题,欢迎大家反馈!
- Python实现一个简单的图片爬虫
- 一个简单的python爬虫爬取糗百图片
- python实现一个简单的爬虫
- python一个简单爬虫的实现
- Python 实现简单的爬虫功能: 图片的抓取
- 用python实现的一个抓取图片的爬虫
- 一个简单的Python爬虫
- python实现简单爬虫抓取图片
- Python实现简单的爬虫
- Python实现简单的爬虫
- Python实现简单的爬虫
- Python简单爬虫的实现
- Python简单图片爬虫
- Python简单图片爬虫
- 简单的python爬虫抓取图片实例
- Python 简单爬虫--获得网上的图片
- python爬虫----简单的图片爬取
- 一个python爬图片的小爬虫
- opengl vert frag glUniform 初始代码参考
- MySQL基础教程16-Mysql数据类型-浮点型和定点型
- GLSL,CUDA语言概念以及VisualSFM限制
- 多线程创建同级目录和上下级目录
- ubuntu14.04上网
- Python实现一个简单的图片爬虫
- python中eval()函数官方文档的说明
- GreenDao的使用
- 开通博客
- 异步Socket通信编程的C#实现(2)
- 输入三条边并判断是否为三角形,若能构成三角形,指出其为何种三角形:等边、直角亦或者一般三角形
- 循环数比较
- ERROR: bootstrap checks failed max file descriptors [4096] for elasticsearch process likely too low,
- 存储器(一)