爬虫怎么根据一个关键词爬取上千张网络图片

本文的亮点是可以保存通过关键词搜索到的所有图片,而不只是第一页的图片。

 由于公司做训练需要搜集一些图片,所以就开始打算用爬虫自动下载。刚开始是使用

【图文详解】python爬虫实战——5分钟做个图片自动下载器 - 简书


中的程序进行下载。但是感觉不是太好用,每一个关键词最多只能保存60张图片。而我们需要搜集几万张图片,根本不能满足要求。

代码如下:

#-*- coding:utf-8 -*-
import re
import requests



def dowmloadPic(html,keyword,startNum):

    pic_url = re.findall('"objURL":"(.*?)",',html,re.S)
    num = len(pic_url)
    i = startNum
    print('找到关键词:'+keyword+'的图片%d 张,现在开始下载图片...' % num)
    for each in pic_url:
        print('正在下载第'+str(i+1)+'张图片,图片地址:'+str(each))
        try:
            pic= requests.get(each, timeout=10)
            string = 'pictures1/'+keyword+'_'+str(i) + '.jpg'
            #resolve the problem of encode, make sure that chinese name could be store
            fp = open(string,'wb')
            fp.write(pic.content)
            fp.close()
        # except requests.exceptions.ConnectionError:
        except:
            print ('【错误】当前图片无法下载')
            continue

        i += 1

    return i


if __name__ == '__main__':

    lastNum = 0
    words = ['胖人墨镜','墨镜手錶美女','带墨镜帅哥','墨镜中年帅哥','墨镜帅哥画','墨镜小帅哥','海边墨镜帅哥','墨镜帅哥壁纸','90后墨镜帅哥']
 #words为一个列表,可以自动保存多个关键字的图片
  for word in words:
        # word = input("Input key word: ")
        if word.strip() == "exit":
            break
  #关键就在这里,我发现将百度图片选择传统版本(默认是瀑布流版本,只有滑动滑动条,才会看到更多图片。传统版本,就是分页显示,底部可以选择页数)后,图片网址跟页数有一个关系,因此利用该关系就可以自动获取好多页的网址,进行保存图片。
   pageId = 0
  #这里我保存到第50页
   for i in range(50):
            url = 'http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=' + word + "&pn="+str(pageId)+"&gsm=?&ct=&ic=0&lm=-1&width=0&height=0"
            pageId += 20
            #url = 'https://image.baidu.com/search/index?tn=baiduimage&ie=utf-8&word=%E5%A2%A8%E9%95%9C%E7%94%B7%E4%BA%BA&ct=201326592&ic=0&lm=-1&width=&height=&v=index'
            result = requests.get(url)
            lastNum = dowmloadPic(result.text, 'sunglasses', lastNum)





<think>嗯,用户的问题是关于爬取图片时遇到不相关图片的情况,该怎么处理。首先,我需要理解用户的具体情况。用户可能是在做一个爬虫项目,从某个网站或者多个网站抓取图片,但结果中发现有些图片和主题无关,比如爬取的是猫咪图片,结果里面混进了狗狗或者其他不相关的图片。这时候用户需要找出方法来过滤掉这些不相关的图片,提高数据的准确性。 首先,我应该考虑用户可能已经采取的方法,比如简单的URL过滤或者基于文件名的筛选,但显然这些方法不够,导致仍有不相关图片混入。接下来,我需要列举几种常见的解决方案,并分析它们的优缺点,以及适用场景。 可能的解决方案包括: 1. **优化爬取规则**:检查用户当前的爬取规则,看看是否有可以改进的地方。比如,是否爬取的页面或链接不够精准,导致抓取了不相关的内容。可能需要更严格的正则表达式或者XPath选择器来定位正确的图片位置。 2. **文件名或URL过滤**:检查图片的文件名或URL中是否包含关键词,比如用户的目标是“风景”,那么图片URL中可能包含“landscape”、“scenery”等词汇。不过这种方法可能不够可靠,因为有些网站可能使用随机文件名。 3. **图像内容识别**:使用机器学习或深度学习模型对图片进行分类,比如使用预训练的CNN模型(如ResNet、Inception等)来判断图片内容是否符合要求。这需要一定的编程和模型部署知识,但效果可能较好。 4. **元数据检查**:检查图片的元数据,比如EXIF信息中的描述、拍摄设备等,但很多网络图片可能删除了这些信息,所以可行性不高。 5. **人工审核与后处理**:如果数据量不大,可以手动筛选,但显然对于大规模数据来说效率太低,不适合。 接下来,需要详细说明每种方法的实施步骤,特别是图像内容识别,因为这是比较有效的方法。可能需要提到使用现有的API(如Google Cloud Vision API、AWS Rekognition)或者开源库(如TensorFlow、PyTorch)来搭建分类模型。 另外,可能需要考虑用户的技术背景。如果用户是初学者,推荐使用现成的API服务可能更合适;如果用户有一定的技术能力,可以尝试自己训练或微调模型。同时,要提到数据隐私的问题,如果图片涉及敏感内容,使用第三方API需要考虑数据安全。 还需要提到后处理步骤,比如在爬取过程中实时过滤,或者在爬取完成后批量处理。实时过滤可能需要更高的计算资源,但节省存储空间;批量处理则相反。 此外,可能还需要建议用户结合多种方法,比如先通过URL和文件名进行初步过滤,再通过内容识别进一步筛选,以提高效率和准确性。 最后,提醒用户注意法律和道德问题,确保爬取行为符合目标网站的robots.txt协议和相关法律法规,避免侵犯版权或隐私。</think>针对爬取图片中存在不相关内容的问题,可以通过以下步骤优化筛选流程: \#\# 解决方案框架 $$ \text{问题定位} \rightarrow \text{规则优化} \rightarrow \text{内容验证} \rightarrow \text{持续监控} $$ \#\# 具体实施步骤 1. **精准定位目标资源** - 使用CSS选择器/XPath精确提取含有关联性更高的图片容器 - 示例:`//div[@class='gallery-section']//img` 比通用的`//img`更准确 - 验证页面结构:`开发者工具 > Elements > 检查DOM层级` 2. **多重过滤规则** - **URL维度**: $$ \text{匹配模式} = \frac{\text{有效关键词数}}{\text{总关键词数}} \geq 0.7 $$ 使用正则表达式: ```python re.compile(r'(product|detail|main)_img\d*\.(jpg|png)$', re.I) ``` - **属性过滤**: ```python if 'alt' in img.attrib and '广告' not in img.attrib['alt']: download(img['src']) ``` 3. **内容智能识别(核心方案)** - **轻量级方案**:使用CLIP模型进行零样本分类 ```python from transformers import CLIPProcessor, CLIPModel model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32") processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32") inputs = processor(text=["宠物猫", "无关内容"], images=image, return_tensors="pt", padding=True) outputs = model(**inputs) probs = outputs.logits_per_image.softmax(dim=1) # 获取分类概率 ``` - **生产级方案**:定制YOLOv8检测模型 ```python from ultralytics import YOLO model = YOLO('custom_cat_detector.pt') # 自定义训练模型 results = model.predict(image) if len(results[0].boxes.cls) > 0: # 检测到目标对象 save_image(image) ``` 4. **动态反馈机制** - 建立误抓样本库进行主动学习 - 每周更新过滤规则: $$ \lambda_{new} = \lambda_{old} + \alpha \times \frac{\text{误判数}}{\text{总样本数}} $$ - 使用混淆矩阵分析错误类型: ``` | 预测相关 | 预测无关 -----------|---------|--------- 实际相关 | TP | FN 实际无关 | FP | TN ``` \#\# 成本优化策略 - 分级处理流程: $$ \text{初筛(规则过滤)} \rightarrow \text{精筛(快速模型)} \rightarrow \text{终筛(高精度模型)} $$ - 云服务对比: | 服务商 | 单价(每千张) | 时延 | 准确率 | |------------|-----------|-----|------| | AWS Rekognition | \$0.001 | 200ms | 92% | | 自建YOLOv8 | \$0.0002 | 50ms | 88% | | CLIP API | \$0.0005 | 150ms | 95% | 建议先通过规则过滤排除60%以上的无效图片,再使用CLIP模型进行二次验证。对于需要高实时性的场景,可部署ONNX格式的优化模型实现毫秒级响应。定期收集约5%的边界案例(如半遮挡图片、相似背景图片)进行模型微调,持续提升准确率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值