这是一个百度爬虫的练习 博主也是个爬虫小白 这是一个学习成果分享 如果有哪里出现问题的望大家及时反馈哦
码字不易 走过路过 给个赞吧xdm
这里是整段的源码 百度图片爬虫完整代码https://blog.csdn.net/weixin_56198196/article/details/120472183
下面我们一步步来看过程哈 一共分为4大步
目录
1.抓数据包 存放图片信息的包 获取URL
2.采用正则表达式得到图片链接
3.网址获取 含解密
4.将图片保存到本地
注意 我把百度图片中以堆糖为源网页的图片保留了下来 其他的图片都过滤了 我在下面的代码中会说明如果不想滤掉其他的内容怎么做
爬虫的过程就是模拟我们人浏览网页的过程 我们在写代码之前 首先要搞明白网站结构 找出数据储存在哪里 是什么格式。我们下载图片需要的是图片的下载网址 所以明确的目标就是找到图片网址存在了什么地方。
我们可以先随便输入一个词 进入页面 了解一下网站情况。这里我以输入关键词“史努比”为例。
1.抓数据包 存放图片信息的包 获取URL进入到搜索结果页面 先刷新一下→鼠标右键点击检查 选择检查中的网络(Network)选项卡→点击上方的“XHR” 出现情况如下图所示 这里的以acjson开头的东西就是存放图片下载链接的数据包 可以点击数据包 点击“响应”来查看 可以看到我们需要的图片下载网址
点击数据包后 点击上方的标头 找到这个数据包的URL
2.采用正则表达式得到图片链接在“响应”这里可以看到数据格式为json 采用正则表达式 这里可能会遇到这样几个问题
①Forbid spider access
解决方法 在headers请求头那里多加一下请求标头里的东西
②要不要使用 “from urllib.parse import quote”对输入的中文主题转码
解决方法 不使用 我这里是没有用的。具体原因我也不太清楚。我一开始是用的 后来发现出错 就把这个删掉就好了。
③翻页怎么看
解决方法 我们打开网络选项卡后 点击XHR 然后下滑页面 发现会加载出更多文件 以acjson开头的 然后注意到url参数里的pn在变 而且是以30为幅度在变化 这里就使控制翻页的参数 可以构造for循环进行翻页
④关于params里面有个参数logid那里可以填成自己网页搜到的 目前我还不确定这个id是不是有时效的 因为我已经看到了很多个id
import requests
import re
import PySimpleGUI as sg
import os
layout [ #弹窗设计 让用户进行主题输入
[sg.Text( 请输入你要寻找的图片主题 )],
[sg.Input()],
[sg.Text( 请输入你需要的图片数(请填写阿拉伯数字 例如 1) )],
[sg.Input()],
[sg.Button( 确认 )]
window sg.Window( 百度图片下载 ,layout)
event,values window.read()
window.close()
url https://image.baidu.com/search/acjson
for i in range(0,180,30):
params {
tn : resultjson_com ,
logid : 5280191307193676757 , #不知道这里的logid有没有时效
ipn : rj ,
ct : 201326592 ,
fp : result ,
queryWord : values[0], #你要查询的主题词
cl : 2 ,
lm : -1 ,
ie : utf-8 ,
oe : utf-8 ,
st : -1 ,
ic : 0 ,
word : values[0], #你要查询的主题词
face : 0 ,
istype : 2 ,
nc : 1 ,
pn : i, #这里可以构造翻页
rn : 30 ,
gsm : b4
headers { #遇到Forbid spider access就在请求头多加一些东西 试了一下 Accept-Encoding 是关键
# Accept : text/plain, */*; q 0.01 ,
Accept-Encoding : gzip, deflate, br ,
# Accept-Language : zh-CN,zh;q 0.9,en;q 0.8,en-GB;q 0.7,en-US;q 0.6 ,
# Connection : keep-alive ,
cookie : BDqhfp %E5%8F%B2%E5%8A%AA%E6%AF%94%26%260-10-1undefined%26%263746%26%264; BIDUPSID 5A04241009FD166564DACF4050551F2D; PSTM 1611376447; __yjs_duid 1_2de46e288096c13a7edea3d05a5204421620544039468; BAIDUID F163DBC1DF098AF604AE753E72659BAA:FG BDUSS Tczc3RnamRhaUhicm5rfm83V3pkMTBySUd1Z0V4Q25mbXhYdElRemJHdVktVnRoRVFBQUFBJCQAAAAAAQAAAAEAAACR090iR3JpZmZleTUxMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJhsNGGYbDRhN; BDUSS_BFESS Tczc3RnamRhaUhicm5rfm83V3pkMTBySUd1Z0V4Q25mbXhYdElRemJHdVktVnRoRVFBQUFBJCQAAAAAAQAAAAEAAACR090iR3JpZmZleTUxMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJhsNGGYbDRhN; BAIDUID_BFESS F163DBC1DF098AF604AE753E72659BAA:FG BDORZ AE84CDB3A529C0F8A2B9DCDD1D18B695; userFrom cn.bing.com; IMG_WH 573_756; H_WISE_SIDS 110085_178384_179349_181588_182531_183327_183611_183750_184578_185029_185517_185653_185750_186317_186411_187020_187195_187206_187292_187450_187663_187670_187928_8000097_8000100_8000126_8000140_8000150_8000169_8000177_8000185; BDRCVFR[X_XKQks0S63] mk3SLVN4HKm; firstShowTip cleanHistoryStatus indexPageSugList %5B%22%E5%8F%B2%E5%8A%AA%E6%AF%94%22%2C%22%E6%B5%B7%E8%B4%BC%E7%8E%8B%22%2C%22%E8%8A%B1%E6%9C%B5%22%2C%22undertale%22%2C%22python%22%2C%22%E8%8A%B1%E7%AE%80%E7%AC%94%E7%94%BB%22%2C%22%E5%90%8C%E5%9E%8B%E4%B8%96%E4%BB%A3%E4%BA%A4%E6%9B%BF%22%2C%22%E6%A8%9F%E7%A7%91%E8%8A%B1%22%2C%22%E6%A8%9F%E7%A7%91%E8%8A%B1%E7%9A%84%E8%A7%A3%E5%89%96%22%5D; BDRCVFR[dG2JNJb_ajR] mk3SLVN4HKm; ab_sr 1.0.1_MTY1OTI2YjEyMzViNzQyYWVhZjdhZWQxNzc0YjE1NzA2NGEyZmMwZGEwNzRmMWVjZGM3N2IzMDlkYjViZWVlOGYyNTllZDMzZjgwZGMxZWZhOWFiMmEyYjg0NjgyYzgwYjk0Y2QxYWVmM2E1ZTFiZjkyYTNlOGYzMDg1MWVjNjUyODViYzMyZjc2Mjk2OGFmZmZjZTkwNjg3OWI4NjhjZjdiNzJmNTY3NTIyZjg2ODVjMzUzNTExYjhiMjkxZjEx; BDRCVFR[-pGxjrCMryR] mk3SLVN4HKm ,
Referer : https://image.baidu.com/search/index?tn baiduimage ipn r ct 201326592 cl 2 lm -1 st -1 fm index fr hs 0 xthttps 111110 sf 1 fmq pv ic 0 nc 1 z se 1 showtab 0 fb 0 width height face 0 istype 2 ie utf-8 word %E5%8F%B2%E5%8A%AA%E6%AF%94 oq %E5%8F%B2%E5%8A%AA%E6%AF%94 rsp -1 ,
User-Agent : Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Mobile Safari/537.36 Edg/93.0.961.52
html requests.get(url,params params,headers headers)
fin re.compile( objURL : (.*?) , re.I|re.S) #利用正则表达式进行文本匹配
filter ssl.duitang.com
results fin.findall(html.text)
3.网址获取 含解密
这里最大的问题就是网址的筛选 我们会得到好多的url 如图 我汇总了一下
选用哪一个呢 我查看了很多博主的文然后发现大家都选择了objURL 说这个是原图 emm
但是我们发现 这不是常规的网址 这是被加密的 所以 不要高兴太早 要解密...
解密代码如下 参考 百度图片爬虫解密万分感谢这位博主
在选择objURL的基础上 我有筛选了一下图片都的原网页来源 我发现如果不过滤的话会有一些广告图片插进来 再加上我个人平常搜图会用堆糖 所以这里就设计了一下。
不想要过滤的 直接删掉filter和if条件判断
def baidtu_uncomplie(url): #因为要获取的是objURL所以这里找了一个百度解密
res
c [ _z2C$q , _z e3B , AzdH3F ]
d { w : a , k : b , v : c , 1 : d , j : e , u : f , 2 : g , i : h , t : i , 3 : j , h : k , s : l , 4 : m , g : n , 5 : o , r : p , q : q , 6 : r , f : s , p : t , 7 : u , e : v , o : w , 8 : 1 , d : 2 , n : 3 , 9 : 4 , c : 5 , m : 6 , 0 : 7 , b : 8 , l : 9 , a : 0 , _z2C$q : : , _z e3B : . , AzdH3F : / }
if(url None or http in url):
return url
else:
j url
for m in c:
j j.replace(m,d[m])
for char in j:
if re.match( ^[a-wd] $ ,char):
char d[char]
res res char
return res
4.将图片保存到本地
具体保存路径大家可以自行修改
results fin.findall(html.text)
num 1
for r in results:
if filter in baidtu_uncomplie(r) and num int(values[1]):
pic_url baidtu_uncomplie(r)
filename f C:{values[0]}
if not os.path.exists(filename): #创建文件夹来保存图片 文件夹路径大家可以自行修改哈
os.mkdir(filename)
with open(f {filename}/{num}.jpg , wb ) as f: #二进制文件的保存方法
f.write(requests.get(pic_url).content)
num 1
sg.popup( 已完成 图片文件夹已经放入C盘 )
感谢所有看到这里的uu们



