鱼C论坛

 找回密码
 立即注册
查看: 2049|回复: 10

[已解决]用requests取图片的问题

[复制链接]
发表于 2021-3-22 10:34:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 柿子饼同学 于 2021-3-22 10:40 编辑

目标URL:
https://image.baidu.com/search/albumsdetail?tn=albumsdetail&word=%E5%AE%A0%E7%89%A9%E5%9B%BE%E7%89%87&fr=albumslist&album_tab=%E5%8A%A8%E7%89%A9&album_id=688&rn=30
传送门就是想取得前5张吧

我看的书上是用urllib.request取得图片,那如果用requests和bs4该怎么做呢
import requests as r
import bs4 as b

url = '''https://image.baidu.com/search/albumsdetail?tn=albumsdetail&word=%E5%AE%A0%E7%89
%A9%E5%9B%BE%E7%89%87&fr=albumslist&album_tab=%E5%8A%A8%E7%89%A9&album_id=688&rn=30'''
headers={"User-Agent":
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0"}

res = r.get(url,headers = headers)
s = b.BeautifulSoup(res.text, 'html.parser')
link = s.find_all('div', class_ = 'albumsdetail-item')
#后面不知怎么写了


最佳答案
2021-3-23 01:55:52
百度图片有数据接口,请求数据接口可以得到图片url。
import requests
import os
from tqdm import tqdm


def save_img(wd, id_, url):
    if not os.path.exists(wd):
        os.mkdir(wd)
    img_name = f'{wd}/{id_}.jpeg'
    if not os.path.exists(img_name):
        img = requests.get(url)
        with open(img_name, 'wb') as f:
            f.write(img.content)


def get_img(page):
    url = 'https://image.baidu.com/search/albumsdata'  # 数据接口
    header = {'user-agent': 'Mozilla/5.0'}
    rn = 30
    word = '宠物图片'
    for i in range(0, page):
        pn = i * rn
        params = {
            'pn': pn,  # 翻页参数(每一页+30)
            'rn': rn,  # 每一页图片数(固定30)
            'tn': 'albumsdetail',  # 类型(albumsdetail)
            'word': word,  # 关键词
            'album_tab': '动物',  # 专辑(例如你想爬动物,那么这个参数就是动物)
            'album_id': 688,  # 专辑id(动物专辑id是688)
            'curPageNum': i  # 翻页参数,页码
        }
        res = requests.get(url, headers=header, params=params).json()
        imgs = res.get('albumdata').get('linkData')
        for img in tqdm(imgs, f'第{i+1}页'):
            img_id = img.get('pid')
            img_url = img.get('thumbnailUrl')
            save_img(word, img_id, img_url)


if __name__ == '__main__':
    num = int(input('输入需要下载的页数:'))
    get_img(num)

屏幕截图 2021-03-22 103135.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-3-22 10:43:12 | 显示全部楼层
爬虫思路
1、获取真实的url信息
2、清洗数据
3、保存数据
思路是一样的,用什么方法都可以,这里建议你去学学requests和xpath,B站一搜一大把
不过你这要爬度娘的,他反爬比较溜,你这样不一定能爬的到
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-22 12:43:21 | 显示全部楼层
本帖最后由 小伤口 于 2021-3-22 13:08 编辑

import requests
from bs4 import BeautifulSoup
# 获取页面
def huo_qu(page_url):
    # 加请求头
    headers = {
        'user-agent': ""'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Mobile Safari/537.36 Edg/89.0.774.45'}
    res = requests.get(page_url, headers=headers)
    return res

# 查找图片下载链接,并保存链接
def xun_zhao(res):
    # 用BeautifulSoup解析
    soup = BeautifulSoup(res.text,features="lxml")

    img_addrs = []
    # 查找所有有img的标签
    for link in soup.find_all('img'):
        # 找到有src属性的链接并保存
        if link.get('src') not in img_addrs:
            img_addrs.append(link.get('src'))
            if len(img_addrs)>=16:
                break

    return img_addrs

# 保存图片
def bao_cun(img_addrs):

    for each in img_addrs:

        filename = each.split('/')[-1]
        r = requests.get(each)
        with open(filename, 'wb') as f:
            f.write(r.content)

# 主代码
def download_tx(temp, pages):
    fenglei = {'欧美头像': 'oumei/', '清新头像': 'xiaoqingxin/', '恐怖头像': 'kongbu/', \
               '可爱头像': 'keai/', '小孩头像': 'xiaohai/', '卡通头像': 'katong/', '古风头像': 'gufeng/', '搞笑头像': 'gaoxiao/'}
    url = 'http://www.imeitou.com/' + fenglei[temp]
    if pages == 1:
        page_url = url
        res = huo_qu(page_url)
        img_addrs = xun_zhao(res)
        bao_cun(img_addrs)
    else:
        page_url = url + 'index_' + str(pages) + '.html'
        res = huo_qu(page_url)
        img_addrs = xun_zhao(res)
        bao_cun(img_addrs)
if __name__=="__main__":
    temp=input('爬取类型(欧美头像 清新头像)')
    pages=input('爬取第几页')
    download_tx(temp, pages)
基本爬取一般的图片视频都这个步骤

好像我这个针对你这个网站不行获取的文本里都没有图片下载地址
网页里好像没有下载地址
只有单独点进去才会出现下载地址
我觉得不应该解析这个网页吧
我爬虫很菜
不知道咋整,也想蹲个眼
学习一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-22 13:08:53 | 显示全部楼层
小伤口 发表于 2021-3-22 12:43
基本爬取一般的图片视频都这个步骤
好像我这个针对你这个网站不行获取的文本里都没有图片下载地址{:10_2 ...

那我先不设最佳答案?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-22 13:10:45 | 显示全部楼层
柿子饼同学 发表于 2021-3-22 13:08
那我先不设最佳答案?

我发的也对你的没有帮助
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-22 13:22:45 | 显示全部楼层
本帖最后由 柿子饼同学 于 2021-3-22 13:23 编辑
小伤口 发表于 2021-3-22 12:43
基本爬取一般的图片视频都这个步骤
好像我这个针对你这个网站不行获取的文本里都没有图片下载地址{:10_2 ...


好像人家都是贴吧里弄,这百度图片,不要也罢。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-23 01:55:52 | 显示全部楼层    本楼为最佳答案   
百度图片有数据接口,请求数据接口可以得到图片url。
import requests
import os
from tqdm import tqdm


def save_img(wd, id_, url):
    if not os.path.exists(wd):
        os.mkdir(wd)
    img_name = f'{wd}/{id_}.jpeg'
    if not os.path.exists(img_name):
        img = requests.get(url)
        with open(img_name, 'wb') as f:
            f.write(img.content)


def get_img(page):
    url = 'https://image.baidu.com/search/albumsdata'  # 数据接口
    header = {'user-agent': 'Mozilla/5.0'}
    rn = 30
    word = '宠物图片'
    for i in range(0, page):
        pn = i * rn
        params = {
            'pn': pn,  # 翻页参数(每一页+30)
            'rn': rn,  # 每一页图片数(固定30)
            'tn': 'albumsdetail',  # 类型(albumsdetail)
            'word': word,  # 关键词
            'album_tab': '动物',  # 专辑(例如你想爬动物,那么这个参数就是动物)
            'album_id': 688,  # 专辑id(动物专辑id是688)
            'curPageNum': i  # 翻页参数,页码
        }
        res = requests.get(url, headers=header, params=params).json()
        imgs = res.get('albumdata').get('linkData')
        for img in tqdm(imgs, f'第{i+1}页'):
            img_id = img.get('pid')
            img_url = img.get('thumbnailUrl')
            save_img(word, img_id, img_url)


if __name__ == '__main__':
    num = int(input('输入需要下载的页数:'))
    get_img(num)

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-23 14:44:26 | 显示全部楼层
YunGuo 发表于 2021-3-23 01:55
百度图片有数据接口,请求数据接口可以得到图片url。

谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-24 22:38:13 | 显示全部楼层

https://fishc.com.cn/thread-189478-1-1.html

我来晚了,不然最佳一定是我的

百度图片爬虫一条龙,手把手包教包会
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-24 22:39:17 | 显示全部楼层

https://fishc.com.cn/thread-189478-1-1.html

手把手一条龙,包教包会,百度爬虫
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-25 07:30:00 | 显示全部楼层
Daniel_Zhang 发表于 2021-3-24 22:39
https://fishc.com.cn/thread-189478-1-1.html

手把手一条龙,包教包会,百度爬虫

NB
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 07:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表