记录自己的学习过程
看了各大佬的方法自己练一下
技能要求
1.首先要有python语言基础
2.要知道接口是怎么回事儿,对一个接口发起请求需要些什么东西
3.会使用浏览器开发这工具或者是抓包工具
4.对html,json等接口返回的数据能看懂,能从里面找到你需要的东西
基本思路
1.获取百度图片搜索的url
2.获取搜索时需要提交的参数
3.获取图片的url
4.将图片保存到本地
话不多说,上个代码 。
# -*- coding:utf-8 -*-
# 作者:Panzer
# 创建:2020-10-16
# 更新:
# 用意:爬虫基础学习
"""
思路:
1.获取百度图片搜索的url
2.获取搜索时需要要提交的参数
3.获取图片的url
4.将图片保存到本地
"""
import re #正则表达式匹配
import requests #
from urllib import error #这个没用
from bs4 import BeautifulSoup #编译返回html 没用到
import os #创建保存文件的目录
import time #没用到
class GetPicture():
def __init__(self):
# 需要携带的请求头
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36'
}
self.url = 'https://image.baidu.com/search/acjson?'
self.params = {
'tn': 'resultjson_com',
'logid': '11193192615760192101',
'ipn': 'rj',
'ct': '201326592',
'is': '',
'fp': 'result',
'queryWord': '小姐姐',
'cl': '2',
'lm': '-1',
'ie': 'utf-8',
'oe': 'utf-8',
'adpicid': '',
'st': '',
'z': '',
'ic': '',
'hd': '',
'latest': '',
'copyright': '',
'word': '小姐姐', # 搜索关键词
's': '',
'se': '',
'tab': '',
'width': '',
'height': '',
'face': '',
'istype': '',
'qc': '',
'nc': '',
'fr': '',
'expermode': '',
'force': '',
'pn': '30', # 每页显示多少张
'rn': '30',
'gsm': '1e',
'1602810681929': ''
}#get请求用params,post使用data
def get_thumbURL(self,word):
"""
获取到图片地址,用于下载
:param word: 搜索的关键字
:return: 图片地址列表
"""
#self.word = input('请输入搜索关键字:')
self.word = word
self.params['word'] = self.word
pic_url_list = []
t = 30
i = 0
while t<180: # 这里根据自己需要的图片数量设置,这里是150张
try:
response = requests.get(self.url,headers=self.headers,params=self.params) #获取到搜索的返回数据
#print(response.text)
responseList = re.findall('"thumbURL":"(.*?)"',response.text,re.S) # 利用正则表达式从返回数据中获取到图片的地址
except Exception as e:
print("获取图片地址失败:%s"%e)
else:
if len(responseList) ==0:
print('未获取到图片地址链接')
else:
pic_url_list +=responseList #将获取到的数据追加到pic_url_list
t += 30
self.params['pn'] = t
i +=1
print("获取第{}页url成功".format(i))
print('图片地址获取成功,请调用保存方法保存到本地')
print('获取到%d张图片链接'%len(pic_url_list))
return pic_url_list
def get_picture(self,url,file,):
"""
通过get_thumbURL函数获得的图片地址,下载并保存到本地
:param url: get_thumbURL的返回值
:param file: 保存图片的本地地址
:return: NONE
"""
a = 1
try:
if os.path.exists(file): # 判断目录是否存在 返回布尔值
print('目录已存在准备下载。。。。')
else:
print('正在创建文件保存目录')
os.mkdir(file)
except Exception as e:
print('未获取到图片,错误信息:%s'%e)
else:
for i in url:
#print(i)
picture = requests.get(i,headers = self.headers) #遍历图片地址获得图片
if i[-3:] in ['jpg', 'png', 'gif', 'bmp']:
with open(file + r'/' + self.word + r'{}.{}'.format(a, i[-3:]), 'wb') as f:
f.write(picture.content) #将图片以二进制流形式保存到本地
print('正在下载第{}张图片'.format(a))
elif i[-4:] in ['jpeg']:
with open(file + r'/' + self.word + r'{}.{}'.format(a, i[-4]), 'wb') as f:
f.write(picture.content)
print('正在下载第{}张图片...'.format(a))
else:
print('发现未知格式图片,请联系管理员')
a += 1
if __name__ == '__main__':
word = '小姐姐'
file = 'F:/image/百度图片'
gp = GetPicture()
picurl = gp.get_thumbURL(word)
gp.get_picture(picurl,file)
1.获取百度图片搜索的url
来看图:
首先我们来到这个页面,打开浏览器的开发者工具(F12)
1.选择network选项
2.选择XRH(异步请求),之前看很多大佬写都是选择有分页显示的所以没有动态加载这个东西直接在all里面就可以拿到参数,这个后面说
3.这里我们不滑动页面的情况下只会显示30~60张
4.选择一个链接,查看详情在Genearl中可以看到拿到url
只需要拿到红色框内的就可以了
5.在request header中可以拿到user-agent:
6.在query string parameters中可以拿到需要的参数,其中‘pn’:30就是一页显示30张图片,通过修改这个值可以获取到更多的图片,查看第二个链接可以看到‘’pn‘:60依次类推循环改变pn的值;word:xxx为搜索的关键词,修改值就可以改变要爬取图片。
好啦,拿到这些就可以开始撸代码了。
PS:我也是个菜鸟,有写的不好的地方或则看不懂的地方欢迎大家讨论