爬虫 爬取百度图片

什么是爬虫

网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。(来源:百度百科)

爬虫协议

Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。

robots.txt文件是一个文本文件,使用任何一个常见的文本编辑器,比如Windows系统自带的Notepad,就可以创建和编辑它。robots.txt是一个协议,而不是一个命令。robots.txt是搜索引擎中访问网站的时候要查看的第一个文件。robots.txt文件告诉蜘蛛程序在服务器上什么文件是可以被查看的。(来源:百度百科)

爬虫百度图片

目标:爬取百度的图片,并保存电脑中

  • 能不能爬?

首先数据是否公开?能不能下载?

从图中可以看出,百度的图片是完全可以下载,说明了图片可以爬取

  • 先爬取一张图片

首先,明白图片是什么?

有形式的事物,我们看到的,是图画、照片、拓片等的统称。图是技术制图中的基础术语,指用点、线、符号、文字和数字等描绘事物几何特征、形态、位置及大小的一种形式。随着数字采集技术和信号处理理论的发展,越来越多的图片以数字形式存储。

然后需要图片在哪里?

图片是在云服务器的数据库中的保存起来的

每张图片都有对应的url,通过requests模块来发起请求,在用文件的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 Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。

json 就是js 的对象,就是来存取数据的东西

JSON字符串
{
    “name”: “毛利”,
    “age”: 18,
    “ feature “ : [‘高’, ‘富’,  ‘帅’]
}
Python字典
{
    ‘name’: ‘毛利’,
    ‘age’: 18
    ‘feature’ : [‘高’, ‘富’,  ‘帅’]
}

但是在python中不可以直接通过键值对来取得值,所以不得不谈谈python中的字典

导入python 中json,通过json.loads(s) -->将json数据转换为python的数据(字典)
  • ajax 的使用

Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建交互式网页应用的网页开发技术。

图片是通过ajax 方法来加载的,也就是当我下拉,图片会自动加载,是因为网站自动发起了请求,

  • 分析图片url链接的位置
  • 同时找到对应ajax的请求的url

构造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=&copyright=&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的url,不断的爬取图片

在一个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=&copyright=&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=&copyright=&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 <span class="token operator">=</span> <span class="token string">'https://image.baidu.com/search/acjson?tn=resultjson_com&amp;ipn=rj&amp;ct=201326592&amp;is=&amp;fp=result&amp;queryWord=%E5%9B%BE%E7%89%87&amp;cl=2&amp;lm=-1&amp;ie=utf-8&amp;oe=utf-8&amp;adpicid=&amp;st=-1&amp;z=&amp;ic=0&amp;hd=&amp;latest=&amp;copyright=&amp;word=%E5%9B%BE%E7%89%87&amp;s=&amp;se=&amp;tab=&amp;width=&amp;height=&amp;face=0&amp;istype=2&amp;qc=&amp;nc=1&amp;fr=&amp;expermode=&amp;force=&amp;pn={}&amp;rn=30&amp;gsm=1e&amp;1561022599290='</span><span class="token punctuation">.</span><span class="token function">format</span><span class="token punctuation">(</span><span class="token number">30</span><span class="token operator">*</span>i<span class="token punctuation">)</span>
    r <span class="token operator">=</span> requests<span class="token punctuation">.</span><span class="token keyword">get</span><span class="token punctuation">(</span>page_url<span class="token punctuation">,</span> headers<span class="token operator">=</span>headers<span class="token punctuation">)</span><span class="token punctuation">.</span>text
    res <span class="token operator">=</span> json<span class="token punctuation">.</span><span class="token function">loads</span><span class="token punctuation">(</span>r<span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token string">'data'</span><span class="token punctuation">]</span>
    <span class="token keyword">if</span> res<span class="token punctuation">:</span>
        <span class="token function">print</span><span class="token punctuation">(</span>res<span class="token punctuation">)</span>
        <span class="token keyword">for</span> j <span class="token keyword">in</span> res<span class="token punctuation">:</span>
            <span class="token keyword">try</span><span class="token punctuation">:</span>
                url <span class="token operator">=</span> j<span class="token punctuation">[</span><span class="token string">'hoverURL'</span><span class="token punctuation">]</span>
                pic_url<span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span>url<span class="token punctuation">)</span>
            except<span class="token punctuation">:</span>
                <span class="token function">print</span><span class="token punctuation">(</span><span class="token string">'该图片的url不存在'</span><span class="token punctuation">)</span>

<span class="token function">print</span><span class="token punctuation">(</span><span class="token function">len</span><span class="token punctuation">(</span>pic_url<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token keyword">return</span> pic_url

def down_img(num):
pic_url =get_pic_url(num)

<span class="token keyword">if</span> os<span class="token punctuation">.</span>path<span class="token punctuation">.</span><span class="token function">exists</span><span class="token punctuation">(</span><span class="token string">'D:\图片'</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
    pass
<span class="token keyword">else</span><span class="token punctuation">:</span>
    os<span class="token punctuation">.</span><span class="token function">makedirs</span><span class="token punctuation">(</span><span class="token string">'D:\图片'</span><span class="token punctuation">)</span>

path <span class="token operator">=</span> <span class="token string">'D:\图片\\'</span>
<span class="token keyword">for</span> index<span class="token punctuation">,</span>i <span class="token keyword">in</span> <span class="token function">enumerate</span><span class="token punctuation">(</span>pic_url<span class="token punctuation">)</span><span class="token punctuation">:</span>
    filename <span class="token operator">=</span> path <span class="token operator">+</span>   <span class="token function">str</span><span class="token punctuation">(</span>index<span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">'.jpg'</span>
    <span class="token function">print</span><span class="token punctuation">(</span>filename<span class="token punctuation">)</span>
    <span class="token keyword">with</span> <span class="token function">open</span><span class="token punctuation">(</span>filename<span class="token punctuation">,</span> <span class="token string">'wb+'</span><span class="token punctuation">)</span> <span class="token keyword">as</span> f<span class="token punctuation">:</span>
        f<span class="token punctuation">.</span><span class="token function">write</span><span class="token punctuation">(</span>requests<span class="token punctuation">.</span><span class="token keyword">get</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">.</span>content<span class="token punctuation">)</span>

if name == main:
num = int(input(‘爬取几次图片:一次30张’))
down_img(num)

爬取过程


爬取结果

文章首发于:

https://blog.youkuaiyun.com/weixin_44510615/article/details/93088867

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值