制作搜狗图片的爬虫

本文介绍了如何解析搜狗图片,写出自己的爬虫小程序,并打包成exe文件

目录

前言

一、解析搜狗图片的网址

二、使用多线程进行爬取图片

1.对所请求的所有的URl进行拼接

2.开启多线程

3.使用pyinstaller打包

4.版权声明

5.完整代码



前言

暑假到了,闲着没事干就学了学爬虫,对搜狗图片进行批量爬取。


一、解析搜狗图片的网址

         1.在搜狗图片网址右键审查元素:

        2.在网页中使用开发者工具

         3.使用鼠标滑轮对网页进行翻页:

        翻页后可以看出多出了矩形框所框住的东西,在矩形框中找到横线那个进行点击,右侧Request URL即为浏览器动态加载图片所发的请求

       4.网址解析

        https://pic.sogou.com/napi/pc/searchList?mode=1&start=48&xml_len=48&query=%E7%8C%AB%E7%8C%AB

       由这个网址可知start=48,xml_len=48分别为起始位置和网页加载图片的长度,而query这个参数是搜所的关键词。

二、使用多线程进行爬取图片

        由于对一些图片发送下载请求后会有大量的时间一直等待响应,因此发送时可以使用多线程来提高爬取速度。

1.对所请求的所有的URl进行拼接

       在获取到用户所输入的保存路径,图片搜索关键词,下载数量后就可以进行对url的拼接了。

#拼接出所有要请求的获取数据所有的url
    def make_url(self):
        if not os.path.exists(self.path):
            os.makedirs(self.path)
            
        b = 0
        
        while(self.number>=48):
            self.list_url.append('https://pic.sogou.com/napi/pc/searchList?mode=1&start={}&xml_len=48&query={}'.format(b,self.key))
            self.number -= 48
            b+=48
        self.list_url.append('https://pic.sogou.com/napi/pc/searchList?mode=1&start={}&xml_len=48&query={}'.format(b,self.key))

2.开启多线程

        代码如下(示例):

#多线程线程开启函数
def make_threadings(self):
    print("开始使用多线程下载/n/n/n")
    a = 0
    for j in self.list_url:
        threading.Thread(target=self.download,args=(j,a+1)).start()
        a += 1
        print("第{}个线程已开启".format(a))

3.使用pyinstaller打包

        1.在虚拟环境中安装pyinstaller

         安装指令为:pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple

        2.将程序打包为exe

        pyinstaller -F -w -i 你的ico文件的地址 你的py文件所在地址

        

4.版权声明

        此篇代码仅供各人参考学习,禁止商用。文章转载请标明出处。重要的事情说三遍:侵权必究,侵权必究,侵权必究。

5.完整代码

import requests
import os
import threading

class more_threading_spider():
    def __init__(self):
        #关键词搜索
        self.key = input("请输入要搜索的关键词:   ")


        #下载的数量
        self.number = int(input("请输入要下载图片的数量:   "))

        #文件保存的路径
        self.path = input("请输入保存图片的路径:  ")

        #保存要爬取的土图片的列表
        self.list_url = []

        #保存图片url的列表
        self.pic_url = []

        #伪装头
        self.headers = {
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36 SE 2.X MetaSr 1.0'}

        self.index = 0
        self.make_url()

        self.make_threadings()

    #拼接出所有要请求的获取数据所有的url
    def make_url(self):
        if not os.path.exists(self.path):
            os.makedirs(self.path)

        b = 0

        while(self.number>=48):
            self.list_url.append('https://pic.sogou.com/napi/pc/searchList?mode=1&start={}&xml_len=48&query={}'.format(b,self.key))
            self.number -= 48
            b+=48


        self.list_url.append('https://pic.sogou.com/napi/pc/searchList?mode=1&start={}&xml_len=48&query={}'.format(b,self.key))

    #下载函数
    def download(self,url,thead_num):
        resp = requests.get(url=url,headers=self.headers).json()
        inf_pic = resp['data']['items']

        for j,k in enumerate(inf_pic):
            a = self.index

            try:
                if k.get('picUrl') not in self.pic_url:
                    self.pic_url.append(k.get('picUrl'))
                else:
                    continue
                print("\n标题为:  {}\n图片名字为:{}\n图片地址为:{}\n***已加入下载队列***".format(k.get('title'), str(a) + '.jpg', k.get('picUrl')))
                picture = requests.get(url=k.get('picUrl'),headers=self.headers).content
                print(self.path+'/{}.jpg'.format(a))

                with open(self.path+'/{}.jpg'.format(a),'wb') as f:
                    self.index += 1
                    print("图片:  {}.jpg 下载完成\n\n".format(a+1))
                    f.write(picture)
            except:
                print('图片{}.jpg下载时发生错误\n\n'.format(self.index))
                self.index += 1

    #多线程线程开启函数
    def make_threadings(self):
        print("开始使用多线程下载/n/n/n")
        a = 0
        for j in self.list_url:
            threading.Thread(target=self.download,args=(j,a+1)).start()
            a += 1
            print("第{}个线程已开启".format(a))





if __name__ == "__main__":
   more_threading_spider()

       

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Rosen。

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值