Python实现一个简单的图片爬虫

前言

提起爬虫,很多人都会感觉很神秘,包括以前的我也是一样的,只要是和爬虫的相关的知识我都感觉很高端,后来渐渐的接触的多了,也就慢慢地明白的了究竟什么是爬虫,说说我理解的吧,爬虫本身是一项技术,很有用的一项技术,但是如果被毫无节制的使用,不仅会侵犯他人的知识产权,同时还会浪费过多的服务器资源。

其实爬虫访问的绝大多数都是正常的网站,只不过它不需要人们正常的打开浏览器输入网址,就可以访问到浏览器中的内容,比如我们可以直接获取到某个网站首页的新闻,或者得到某个数据网站的表格数据,通俗的来说就是通过编写程序来模拟人访问网站的行为,来获取网站页面中的数据。

接下来我来写个小例子来实现一个图片爬虫的功能,本文涉及到的代码只是想说明爬虫的作用,让大家了解一下爬虫并不是那么神秘,所写代码只做学习使用,切记不可用来做获取非法的内容,其实接下来的代码很简单,只能实现很有限的功能,想要做成有实际作用的爬虫真得好好下一番功夫才行。

代码实现

首先我们得引入爬虫实现中经常要使用的库:

import urllib.request, re, os

其中urllib.request是用来发起去HTTP请求的,re是使用正则表达是查找的,os是用来做一些系统级别的操作的。

接下来定义一下变量:

# save file path
target_path = "images_crawler_results"
# target url that needs to crawler
target_url = "https://www.csdn.net/"
# request data headers
req_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 定义了十几种古怪的请求头类型,不过大多数都不常用,只有几种是很常用的,比如:

属性示例
Hosthttps://www.csdn.net/
Connectionkeep-alive
User-AgentMozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.63 Safari/537.36
Accept-Languageen-US,en;q=0.8

这里最重要的参数就是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就可以保存在本地了啊,是不是很简单呢?

总结

  1. 网络爬虫本身是一门很有用的技术,但是也是一把双刃剑,用错了害人害己,当然了如果只是为了减轻工作量,避免一些重复性操作,在不影响他人的情况下,我感觉偶尔用用还是不错的。
  2. 网络爬虫博大精深,需要仔细钻研才能解决实际操作中的文问题,比如这个小例子中,一开始就无法现在中文的图片,后来通过转码和URL编码才解决。

源代码

完整代码传送门,有什么问题,欢迎大家反馈!

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
### 回答1: 可以使用Python的requests和BeautifulSoup库来编写一个图片爬虫。首先,使用requests库发送HTTP请求获取网页内容,然后使用BeautifulSoup库解析网页内容,找到图片的URL地址,最后使用requests库下载图片并保存到本地。具体实现细节可以参考相关的Python教程和文档。 ### 回答2: 图片爬虫是指通过网络爬取各种图片资源的程序,而Python是一种非常适合网络爬虫开发的高级编程语言。下面我将以300字中文回答,如何用Python编写一个简单图片爬虫程序。 首先,我们需要使用Python中的第三方库requests来发送HTTP请求获取网页内容。然后,使用正则表达式或者BeautifulSoup等工具提取网页中的图片链接。 以下是一个简单的实例代码: import requests import re import os def download_images(url, save_dir): # 请求网页 response = requests.get(url) # 提取图片链接 img_urls = re.findall(r'<img.*?src="(.*?)"', response.text) # 保存图片 for img_url in img_urls: img_response = requests.get(img_url) img_name = img_url.split('/')[-1] # 获取图片的文件名 save_path = os.path.join(save_dir, img_name) with open(save_path, 'wb') as f: f.write(img_response.content) print('保存图片:', save_path) if __name__ == "__main__": url = 'http://example.com' # 网址 save_dir = 'images' # 图片保存目录 if not os.path.exists(save_dir): os.mkdir(save_dir) download_images(url, save_dir) 在代码中,我们首先定义了一个download_images函数,它接收一个url参数和一个save_dir参数,分别表示爬取的网址和图片保存的目录。函数首先发送GET请求获取网页内容,然后使用正则表达式提取图片链接。最后,将图片下载保存到指定的目录中。 在主程序中,我们调用download_images函数来爬取指定网址的图片,并指定保存的目录。如果目录不存在,我们使用os.mkdir函数创建该目录。 当然,这只是一个简单图片爬虫示例,实际的爬虫可能需要更复杂的处理逻辑和数据存储方式。但是通过这个例子你可以了解到如何利用Python编写一个简单图片爬虫程序。 ### 回答3: 爬取图片爬虫中常见的任务之一。Python作为一门功能强大且易于学习的编程语言,也可以很容易地编写一个图片爬虫。 下面是一个示例,使用Python的requests、beautifulsoup和urllib库来实现一个简单图片爬虫: ```python import requests from bs4 import BeautifulSoup import urllib # 定义目标网站的URL url = 'http://www.example.com' # 发送HTTP GET请求,获取网页内容 response = requests.get(url) # 使用BeautifulSoup解析网页内容 soup = BeautifulSoup(response.content, 'html.parser') # 找到所有的图片标签 img_tags = soup.find_all('img') # 遍历图片标签,提取图片URL并保存到本地 for img in img_tags: img_url = img['src'] # 如果图片URL是相对路径,需要拼接完整的URL if not img_url.startswith('http'): img_url = url + '/' + img_url # 使用urllib库下载图片到本地 urllib.request.urlretrieve(img_url, img_url.split('/')[-1]) ``` 以上代码使用requests库发送HTTP GET请求,获取网页内容。然后,使用BeautifulSoup库解析网页内容,找到所有的图片标签。接下来,遍历图片标签,提取图片的URL。如果图片URL是相对路径,使用urllib库拼接完整的URL。最后,使用urllib库下载图片到本地。 请注意,上述代码只是一个示例,具体的图片爬虫逻辑可能因网站结构的不同而有所变化。此外,爬取网站的图片可能涉及法律或伦理问题,请遵守相关规定并尊重他人的权益。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AlbertS

常来“玩”啊~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值