网页爬虫抓取百度图片(什么是爬虫网络爬虫(又被称为网页蜘蛛,网络机器人))
优采云 发布时间: 2021-09-16 06:14网页爬虫抓取百度图片(什么是爬虫网络爬虫(又被称为网页蜘蛛,网络机器人))
什么是爬行动物
网络爬虫(也称为网络蜘蛛、网络机器人,在FOAF社区中更常被称为网络追踪器)是一种程序或脚本,根据特定规则自动获取万维网信息。其他不常用的名称包括蚂蚁、自动索引、模拟器或蠕虫。(来源:百度百科全书)
爬虫协议
robots协议(也称为crawler协议、robot协议等)的全称为“robots exclusion protocol”,网站通过该协议,robots协议告诉搜索引擎哪些页面可以爬网,哪些页面不能爬网
robots.txt文件是一个文本文件。您可以使用任何通用文本编辑器(如Windows系统附带的记事本)创建和编辑它。Robots.txt是一个协议,不是命令。Robots.txt是在搜索引擎中访问网站时查看的第一个文件。txt文件告诉爬行器可以在服务器上查看哪些文件。(来源:百度百科全书)
爬虫百度图片
目标:抓取百度图片并保存在电脑上
首先,数据是公开的吗?我可以下载吗
从图中可以看出,百度图片完全可以下载,说明图片可以爬网
首先,了解图片是什么
我们看到的正式事物统称为图片、照片、拓片等。图形是技术制图中的一个基本术语,指用点、线、符号、文字和数字来描述事物的几何特征、形状、位置和大小的一种形式。随着数字采集技术和信号处理理论的发展,越来越多的图像以数字形式存储
那照片在哪里
映像保存在ECS数据库中
每张图片都有一个对应的URL。请求通过请求模块启动,并以文件的WB+模式保存
import requests
r = requests.get('http://pic37.nipic.com/20140113/8800276_184927469000_2.png')
with open('demo.jpg','wb+') as f:
f.write(r.content)
但是任何编写代码来爬升图片的人都可以直接下载。爬虫的目的是实现批量下载的目的,这才是真正的爬虫
首先,了解JSON
JSON(JavaScript对象表示法)是一种轻量级数据交换格式。它基于ECMAScript(由欧洲计算机协会制定的JS规范)的子集,并使用完全独立于编程语言的文本格式来存储和表示数据。简洁清晰的层次结构使JSON成为理想的数据交换语言
JSON是JS的对象,用于访问数据
JSON字符串
{
“name”: “毛利”,
“age”: 18,
“ feature “ : [‘高’, ‘富’, ‘帅’]
}
Python字典
{
‘name’: ‘毛利’,
‘age’: 18
‘feature’ : [‘高’, ‘富’, ‘帅’]
}
但是在Python中,不能通过键值对直接获取值,因此我必须讨论Python中的字典
在Python中导入JSON,并通过JSON将JSON数据转换为Python数据(字典)。装载量-->
Ajax,即“异步JavaScript和XML”,是指一种用于创建交互式网页应用程序的网页开发技术
图片是通过Ajax方法加载的,也就是说,当我下拉时,图片会自动加载,因为网站会自动启动请求
构造Ajax的URL请求,将JSON转换成字典,通过字典的键值对得到图片对应的URL
import requests
import json
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'}
r = requests.get('https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E5%9B%BE%E7%89%87&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=©right=&word=%E5%9B%BE%E7%89%87&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&force=&pn=30&rn=30&gsm=1e&1561022599290=',headers = headers).text
res = json.loads(r)['data']
for index,i in enumerate(res):
url = i['hoverURL']
print(url)
with open( '{}.jpg'.format(index),'wb+') as f:
f.write(requests.get(url).content)
一个JSON中有30张图片,因此我们可以通过启动JSON请求来提升多达30张图片,但这还不够
首先,分析在不同JSON中启动的请求
https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E5%9B%BE%E7%89%87&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=©right=&word=%E5%9B%BE%E7%89%87&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&force=&pn=60&rn=30&gsm=3c&1561022599355=
https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E5%9B%BE%E7%89%87&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=©right=&word=%E5%9B%BE%E7%89%87&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&force=&pn=30&rn=30&gsm=1e&1561022599290=
事实上,可以发现,当请求再次启动时,关键是PN不断变化
最后,封装代码。一个列表定义生产者来存储不断生成的图片的URL,另一个列表定义消费者来保存图片
# -*- coding:utf-8 -*-
# time :2019/6/20 17:07
# author: 毛利
import requests
import json
import os
def get_pic_url(num):
pic_url= []
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'}
for i in range(num):
page_url = 'https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E5%9B%BE%E7%89%87&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=©right=&word=%E5%9B%BE%E7%89%87&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&force=&pn={}&rn=30&gsm=1e&1561022599290='.format(30*i)
r = requests.get(page_url, headers=headers).text
res = json.loads(r)['data']
if res:
print(res)
for j in res:
try:
url = j['hoverURL']
pic_url.append(url)
except:
print('该图片的url不存在')
print(len(pic_url))
return pic_url
def down_img(num):
pic_url =get_pic_url(num)
if os.path.exists('D:\图片'):
pass
else:
os.makedirs('D:\图片')
path = 'D:\图片\\'
for index,i in enumerate(pic_url):
filename = path + str(index) + '.jpg'
print(filename)
with open(filename, 'wb+') as f:
f.write(requests.get(i).content)
if __name__ == '__main__':
num = int(input('爬取几次图片:一次30张'))
down_img(num)
爬行过程
爬网结果
文章开始于: