网页爬虫抓取百度图片(一种全新的方式来获取图片素材,你想要的这里全都有)
优采云 发布时间: 2021-09-30 18:10网页爬虫抓取百度图片(一种全新的方式来获取图片素材,你想要的这里全都有)
你还去网站搜什么图?
你还在寻找百度图片等图片素材网站吗?
今天给大家分享一个全新的图片素材获取方式。你想要的这里都有!
是新浪微博!新一代的超级流量门户,甚至现在很多人都用它作为替代百度搜索的工具。以前是找杜娘找东西,现在是搜微博。
比如某个宅男想看清纯少女的照片,越多越好。他会这样搜索:
然后,他会逐页阅读和欣赏这些吸引眼球的图片,并在遇到喜欢的人时将大图片下载到本地保存。
作为一个python程序员,我懒得像这样一页一页地翻页。喜欢全部下载下来慢慢欣赏,爆了硬盘!类似于以下内容:
这种简单的问题让我们为pythoner写爬虫那么容易,何乐而不为呢?让我直接与你分享。
分析目标网站
微博的搜索结果是分页的,所以我们的思路肯定是分页处理,逐页解析。
我们先来看看搜索结果:
我们点击“搜索”按钮后,很容易找到搜索请求。此处网页显示了第一页的结果。
然后我们点击“Next”,我们可以发现请求变成了如下:
细心的话,可能一眼就发现在请求后多了一个page参数,指的是页码。这很容易。我们只需要改变页码就可以请求对应页面的内容。
由于此请求返回一个 HTML 页面,因此我们需要在此页面上努力找到指向图像的链接。我们随便用页面元素检查来定位一张图片,会看到如下效果:
我们可以看到这个div里面的action-data是一个集合,下面li里面img的action-data是单张图片的数据。
接下来,我们点击“查看大图”按钮,浏览器会跳转到一个新页面,页面内容为大图。
从请求的 URL 往下看,我发现了这个:
我把这个网址复制到浏览器请求中,发现这正是我们需要的大图。我们也可以很容易的看到这个URL的特点,就是最后我们在上面的action-data中添加了pic_id。
这样,我们的思路就很清晰了,下面是获取一页图片的思路:
获取页面内容;在页面内容中找到图片ID;拼接查看大图的URL,请求获取图片;将图像写入本地。代码代码
思路很清晰,需要代码code来验证。由于代码比较简单,我就一次性给大家展示一下。
import requests
import re
import os
import time
cookie = {
'Cookie': 'your cookie'
}
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4144.2 Safari/537.36'
}
get_order = input('是否启动程序? yes or no: ')
number = 1
store_path = 'your path'
while True:
if get_order != 'no':
print('抓取中......') # 下面的链接填写微博搜索的链接
url = f'https://s.weibo.com/weibo?q=%23%E5%B0%91%E5%A5%B3%E5%86%99%E7%9C%9F%23&wvr=6&b=1&Refer=SWeibo_box&page={number}'
response = requests.get(url, cookies=cookie)
result = response.text
print(result)
detail = re.findall('data="uid=(.*?)&mid=(.*?)&pic_ids=(.*?)">', result)
for part in detail:
uid = part[0]
mid = part[1]
pids = part[2]
for picid in pids.split(','):
url_x = f'https://wx1.sinaimg.cn/large/%s.jpg'%picid # 这里就是大图链接了
response_photo = requests.get(url_x, headers=header)
file_name = url_x[-10:]
if not os.path.exists(store_path+uid):
os.mkdir(store_path+uid)
with open(store_path+uid + '/' + file_name, 'ab') as f: # 保存文件
f.write(response_photo.content)
time.sleep(0.5)
print('获取完毕')
get_order = input('是否继续获取下一页? Y:yes N:no: ')
if get_order != 'no':
number += 1
else:
print('程序结束')
break
else:
print('程序结束')
break
我这里采用了逐页断点的形式,方便调试。如果你想一次得到所有页面的图片,你可以把这些输入判断去掉,一次性全部运行。代码中的cookie和图片存储路径需要替换为你本地的。
运行后的结果如下:
我按照微博把图片分到文件夹里。如果觉得不直观,想把所有图片都放在一个目录下,可以去掉这一层文件夹。
总结
本文介绍如何通过一个简单的爬虫获取微博图片搜索结果。代码量相当少,但是对一些人来说是很有帮助的,省时省力。还可以展开,除了图片,还可以获取其他搜索内容,比如微博文字、视频、购物链接等。