本文介绍了如何解析搜狗图片,写出自己的爬虫小程序,并打包成exe文件
目录
前言
暑假到了,闲着没事干就学了学爬虫,对搜狗图片进行批量爬取。
一、解析搜狗图片的网址
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()