百度图片爬取(传统翻页版本)

百度图片爬取(传统翻页版本)


一、需求分析

(1)百度图片:搜索‘天’
可以看到在最后面是页数:
这里写图片描述
(2)目的:爬取关键字搜索的所有图片,并实现翻页,最后将图片保存到本地。

二、网页图片链接提取及翻页

1.图片地址提取

(1)在百度图片的搜索结果页面右键,然后单击“查看源文件”(本人用的是搜狗浏览器),可以看到相关的网页代码。

(2)随便选一张图片,右键选择“复制图片网址”。然后转到上一步的html代码。按Ctrl+F,粘贴图片网址,可以发现:

这里写图片描述

经过打开相应的url,最后发现:“objURL”:”http://h.hiphotos.baidu.com/lvpics/h=800/sign=79fa819f8694a4c21523ea2b3ef51bac/8b82b9014a90f603dcfffcd73812b31bb151edd7.jpg“, 之中的图片效果最好。因此可以写出图片地址获取的正则表达式:

pat = '"objURL":"(.*?)",'

2.翻页实现
(1)观察地址栏的变化:
第1页:
https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%E5%A4%A9&ct=201326592&ic=0&lm=-1&width=&height=&v=flip
第2页:
https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%E5%A4%A9&pn=20&gsm=3c&ct=&ic=0&lm=-1&width=0&height=0
第3页:
https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%E5%A4%A9&pn=40&gsm=50&ct=&ic=0&lm=-1&width=0&height=0

观察其中的pn字段,可以发现翻页的规律。

(2)最后可总结出实现翻页的URL:

for k in range(0,page): 
    url = "https://image.baidu.com/search/flip?tn=baiduimage&word="+key+"&pn="+str(k*20)

三、代码实现

import urllib.request
import re

#浏览器伪装
def pretends():
    headers = ("Uesr-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0")
    opener = urllib.request.build_opener()
    opener.addheaders = [headers]   
    urllib.request.install_opener(opener)

#爬取函数,参数为:搜索关键词, 页数
def crawl(keyword,page):
    for k in range(0,page): 
        try:
            key = urllib.request.quote(keyword)
            url = "https://image.baidu.com/search/flip?tn=baiduimage&word="+key+"&pn="+str(k*20)
            data = urllib.request.urlopen(url).read().decode('utf-8')
            print(len(data))
            pat = '"objURL":"(.*?)",'
            rst = re.compile(pat).findall(data)
            cnt = 0
            for i in range(0,len(rst)):
                #添加异常处理
                try:
                    #获取图片扩展名
                    pat1 = '\.[^.\\/:*?"<>|\r\n]+$'
                    rst1 = re.compile(pat1).findall(rst[i])
                    #下载图片到本地
                    urllib.request.urlretrieve(rst[i],"F:\\Python\\Web Spider\\Crawl Data\\百度图片\\2\\"+str(k+1)+str(i)+rst1[0])                                                                                              
                    print('正在下载:%s' % rst[i])
                except Exception as err:
                    print(err)
        except Exception as err:
            print("出现异常:"+str(err))

def main():
    pretends()
    crawl("风景",10)

if __name__ == '__main__':
    main()

四、结果展示

如无特殊情况,会在相应的文件夹发现下载的图片:
这里写图片描述

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值