背景
学会了正则表达式的同学是不是已经摩拳擦掌迫不及待想要爬取一些数据了。那么咱们今天就以百度贴吧的图片为例,展示一下我们真正的技术。
实战
第一步 进入贴吧点击图片输入任意一个贴吧的主题例如"海贼王"
我们选择一套图片点击进去。下图这就是我们要爬取的目标图片
第二步 打开开发者工具分析页面结构
这样我们就可以找到这张图片的链接了。
为了保险,我们可以去网页源码中在次确认一下
我们发现网页源码中并没有。那就证明这个页面的数据不是静态页面。那么我们只能通过开发者工具找一下真正的数据包。
功夫不负有心人,我们找到了一个看似靠谱的一个数据包,究竟是不是呢?我们可以通过json.cn这个网站验证一下
所以下面我们只需要去请求这个数据包获取响应结果,解析数据,爬取数据就可以搞定了 但是需要注意的是,如果我们只是请求这个数据包,图片的数据只会爬取一部分。那么我们继续往下拖动拖动条。我们发现又刷新出来了一个差不多的数据包
然后对比二者之间的规律
规律找到了,只需要把请求的目标url动态的取替换这些参数就可以了
第三步 代码编写
import requests
import re
import time
name = 1
for i in range(1,80,39):
url = 'https://tieba.baidu.com/photo/g/bw/picture/list?kw=%E6%B5%B7%E8%B4%BC%E7%8E%8B&alt=jview&rn=200&tid=1934517161&pn=1' + '&ps=' + str(i) + '&pe=' + str(39 + i) + '&wall_type=h&_=1612447312679'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36'
}
res = requests.get(url,headers=headers)
# print(res.text)
img_urls = re.findall('"murl":"(.*?)"',res.text)
for img_url in img_urls:
img_response = requests.get(img_url)
# 保存数据
with open('img/%d.jpg'%name,'wb') as file_obj:
time.sleep(0.5)
file_obj.write(img_response.content)
print('正在下载第%d张图片'%name)
name += 1
执行效果