必威体育Betway必威体育官网
当前位置:首页 > IT技术

百度图片爬虫

时间:2019-10-17 16:42:17来源:IT技术作者:seo实验室小编阅读:50次「手机版」
 

百度爬虫

使用技术

Python3 + requests模块

安装requests模板

pip install requests

实现目标

  • 可以通过控制台输入爬取图片类型
  • 指定爬取图片数量
  • 保存本地

页面分析

  • 由于不存在翻页,但是可以通过向下滑动加载更多的图片,所以可以猜测为ajax请求

  • 通过Chrome的开发工具(F12)查看浏览器发出的ajax请求

    查看请求

    http://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryword=美女&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&word=美女&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&cg=girl&pn=30&rn=30&gsm=1e&1532507052956=

由此可以发现请求链接,浏览器单独访问得到对应的json数据如下图:

json

都是乱码看的还是非常头疼,不过没关系,爬虫的神器www.json.cn进行json数据的解析

格式化

这样数据格式就很清晰了,可以发现有一个数据中包含了几个相同的url,这并不妨碍提取数据,选取thumbURL 的url数据进行提取

url规则提取

上面获取的url地址太过复杂,不方便我们使用,我们可以通过不断删减已达到简化url的目的,最后得到如下url地址,返回的数据和原链接返回的数据相同

https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&rn=60&word=%E7%89%B9%E6%96%AF%E6%8B%89&pn=0

根据不断尝试,可以发现,rn代表传输多少数据,最大为60,pn代表从第几个数据显示

word表示搜索的图片类型

开始编程

首先导入模块, requests用户发送请求,re用于提取图片url, hashlib模板使用md5进行设置唯一文件名

温馨提示: 由于多线程,请求非常迅速容易被封ip,建议加上睡眠时间, 线程虽好不要太放纵

import requests
from threading import Thread
import re
import time
import hashlib

class BaiDu:
    """
    爬取百度图片
    """
    def __init__(self, name, page):
        self.start_time = time.time()
        self.name = name
        self.page = page
        #self.url = 'https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&rn=60&'
        self.url = 'https://image.baidu.com/search/acjson'
        self.header = {}# 添加为自己的
        self.num = 0

    def queryset(self):
        """
        将字符串转换为查询字符串形式
        """
        pn = 0
        for i in range(int(self.page)):
            pn += 60 * i
            name = {'word': self.name, 'pn': pn, 'tn':'resultjson_com', 'ipn':'rj', 'rn':60}
            url = self.url
            self.getrequest(url, name)

    def getrequest(self, url, data):
        """
        发送请求
        """
        print('[INFO]: 开始发送请求:' + url)
        ret = requests.get(url, headers=self.header, params=data)

        if str(ret.status_code) == '200':
            print('[INFO]: request 200 ok :' + ret.url)
        else:
            print('[INFO]: request {}, {}'.format(ret.status_code, ret.url))

        response = ret.content.decode()
        img_links = re.findall(r'thumbURL.*?\.jpg', response)
        links = []
        # 提取url
        for link in img_links:

            links.APPend(link[11:])

        self.thread(links)

    def saveimage(self, link):
        """
        保存图片
        """
        print('[INFO]:正在保存图片:' + link)
        m = hashlib.md5()
        m.update(link.encode())
        name = m.hexdigest()
        ret = requests.get(link, headers = self.header)
        image_content = ret.content
        filename = './image/' + name + '.jpg'

        with open(filename, 'wb') as f:
            f.write(image_content)

        print('[INFO]:保存成功,图片名为:{}.jpg'.format(name))

    def thread(self, links):
        """多线程"""
        self.num +=1
        for i, link in enumerate(links):
            print('*'*50)
            print(link)
            print('*' * 50)
            if link:
                # time.sleep(0.5)
                t = Thread(target=self.saveimage, args=(link,))
                t.start()
                # t.join()
            self.num += 1
        print('一共进行了{}次请求'.format(self.num))

    def __del__(self):

        end_time = time.time()
        print('一共花费时间:{}(单位秒)'.format(end_time - self.start_time))

def main():
    name = input('请输入你要爬取的图片类型: ')
    page = input('请输入你要爬取图片的页数(60张一页):')
    baidu = BaiDu(name, page)
    baidu.queryset()


if __name__ == '__main__':


    main()

爬取的数据

数据

相关阅读

新网站如何提交链接让百度更快速的收录

对SEOer来说,新做好的网站如何让百度更快的收录,这是大家普遍关心的问题。做优化的最终目的是实现网站盈利,而要实现盈利就必须把网

前台使用ajax上传图片,后台 node.js 使用 formidable

相信现在很多小伙伴在使用node来搭建后台,那么前后台对接少不了的就是图片的上传,下面我将通过这篇文章来对图片上传问题进行详细的

关于Lazyload加载图片几种方法的介绍

Lazyload长页面图片的延迟加载: 一,jquery.lazyload.js 注意事项:jquery.js务必先引进,然后才加载lazyload;img长宽一定要有,每幅长宽

PanDownload网页版全平台百度网盘资源免费高速下载解

声明:PanDownload!!! 注意:不需要登录百度网盘账号,不用担心账号、IP限速。 方式一(通过PanDownload网页版进行下载) 通过PanDownload网

百度云音视频直播服务(LSS)的使用流程

音视频直播LSS(Live Streaming Service)是一个直播PaaS服务平台,旨在帮助企业及个人开发者快速搭建自己的直播平台及应用,关于LSS的相

分享到:

栏目导航

推荐阅读

热门阅读