Python爬虫实战 | (9) 爬取搜狗图片

本篇博客我们将爬取百度图片,输入搜索词,爬取与搜索词相关的图片。

首先打开搜狗图片https://pic.sogou.com/,比如搜索"猫",此时的URL如下:

https://pic.sogou.com/pics?query=%C3%A8&w=05009900&p=&_asf=pic.sogou.com&_ast=1563449302&sc=index&sut=8710&sst0=1563449302189

如果仅凭借URL来爬取的话,URL中需要体现出搜索词信息以及页数信息,所以我们需要使用下面这个URL(至于这个URL是怎么得到的,目前我也不清楚,先照搬):

https://pic.sogou.com/pics?query={}&mode=1&start={}&reqType=ajax&reqFrom=result&tn=0

其中第一个{}替换为搜索词,第二个搜索词替换为页数信息。

首先搭建程序主体框架:

import time
import requests
import os
from requests import RequestException
import json


def get_page(url):
    pass


def parse_page(html, count, word):
    pass


if __name__ == '__main__':
    word = '猫'  # 关键词
    page = 10  # 爬取的页数
    count = 0  #图片计数

    if not os.path.exists(word):
        os.makedirs(word)  # 建目录

    for i in range(page):
        url =  'https://pic.sogou.com/pics?query={}&mode=1&start={}&reqType=ajax&reqFrom=result&tn=0'.format(word,i*48)
        # 发送请求、获取响应
        html = get_page(url)
        # 解析响应 数据存储
        count = parse_page(html, count, word)

        time.sleep(1)

发送请求获取响应,编写get_page(url)函数:

def get_page(url):
    try:
        # 添加User-Agent,放在headers中,伪装成浏览器
        headers = {
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
        }
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            response.encoding = response.apparent_encoding
            return response
        return None
    except RequestException:
        return None

 注意和之前不同,这里指返回response,因为在解析首页时,我们需要的是response.text;当获取图片URL爬取保存图片时,需要的是response.content。返回response,两次请求可以通用这个函数。

打开上面的链接,会发现他返回的是json格式的数据:

所有的图片信息都在items下,上图蓝色阴影代表一张图片的信息,内部都是由一些键值对组成,我们关心的是pic_url字段,他的值是图片真正的链接。所以,我们要先把图片的pic_url解析出来,然后再进行图片爬取,和保存。

解析响应,解析json数据,提取middleURL并保存,然后爬取pic_url,保存图片:


def parse_page(html, count, word):
    html = html.text
    if html:
        p = json.loads(html)['items']  # 转为json格式  提取items字段
        print(len(p))  # 图片数
        for i in p[:-1]:  # [0:5]前5张
            print(i['pic_url'])
            count = count + 1
            # 数据保存
            with open(word + '/' + word + '_url_搜狗.txt', 'a', encoding='utf-8') as f:
                f.write(i['pic_url'] + '\n')
            pic = get_page(i['pic_url'])
            if pic:
                with open(word + '/' + '搜狗_'+str(count) + '.jpg', 'wb') as f:
                    f.write(pic.content)
            time.sleep(1)

        return count

完整代码:

import time
import requests
import os
from requests import RequestException
import json


def get_page(url):
    try:
        # 添加User-Agent,放在headers中,伪装成浏览器
        headers = {
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
        }
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            response.encoding = response.apparent_encoding
            return response
        return None
    except RequestException:
        return None


def parse_page(html, count, word):
    html = html.text
    if html:
        p = json.loads(html)['items']  # 转为json格式  提取items字段
        print(len(p))  # 图片数
        for i in p[:-1]:  # [0:5]前5张
            print(i['pic_url'])
            count = count + 1
            # 数据保存
            with open(word + '/' + word + '_url_搜狗.txt', 'a', encoding='utf-8') as f:
                f.write(i['pic_url'] + '\n')
            pic = get_page(i['pic_url'])
            if pic:
                with open(word + '/' + '搜狗_'+str(count) + '.jpg', 'wb') as f:
                    f.write(pic.content)
            time.sleep(1)

        return count


if __name__ == '__main__':
    word = '猫'  # 关键词
    page = 10  # 爬取的页数
    count = 0  #图片计数

    if not os.path.exists(word):
        os.makedirs(word)  # 建目录

    for i in range(page):
        url =  'https://pic.sogou.com/pics?query={}&mode=1&start={}&reqType=ajax&reqFrom=result&tn=0'.format(word,i*48)
        # 发送请求、获取响应
        html = get_page(url)
        # 解析响应 数据存储
        count = parse_page(html, count, word)

        time.sleep(1)

 

 

 

 

 

 

 

  • 9
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值