Python爬虫爬取百度图片

该博客介绍了一个使用Python爬虫从百度获取特定人物图片的方法。首先,准备一个包含人名的TXT文件,然后逐个遍历人名,为每个人名创建一个文件夹并下载30张相关图片。通过观察URL中的参数`pn`,发现每页包含60张图片,通过递增60来实现翻页,从而获取更多图片。

前期准备:一个所爬人物的名单txt,只要人名,一行一个。

代码流程:读取上述名单,遍历每一个人名,爬取30张关于他的百度图片,保存在以他名字命名的文件夹中。

ps:默认情况下,网址的一页是60张图,如何翻页呢?注意到所爬网址的最后是pn=60,只要每次加60就会到新的一页,比如pn=120,pn=180等。

#!/usr/bin/env python
# encoding: utf-8
import urllib2
import re
import os
import sys
reload(sys)
sys.setdefaultencoding("utf-8")

def img_spider(name_file):
    user_agent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36"
    headers = {'User-Agent':user_agent}
    #读取名单txt,生成包括所有人的名单列表
    with open(name_file) as f:
        name_list = [name.rstrip().decode('utf-8') for name in f.readlines()]
        f.close()
    #遍历每一个人,爬取30张关于他的图,保存在以他名字命名的文件夹中
    for name in name_list:
        #生成文件夹(如果不存在的话)
        if not os.path.exists('E:/celebrity/img_data/' + name):
            os.makedirs('E:/celebrity/img_data/' + name)
            try:
                #有些外国人名字中间是空格,要把它替换成%20,不然访问页面会出错。
                url = "http://image.baidu.com/search/avatarjson?tn=resultjsonavatarnew&ie=utf-8&word=" + name.replace(' ','%20') + "&cg=girl&rn=60&pn=60"
                req = urllib2.Request(url, headers=headers)
                res = urllib2.urlopen(req)
                page = res.read()
                #print page
                #因为JSON的原因,在浏览器页面按F12看到的,和你打印出来的页面内容是不一样的,所以匹配的是objURL这个东西,对比一下页面里别的某某URL,那个能访问就用那个
                img_srcs = re.findall('"objURL":"(.*?)"', page, re.S)
                print name,len(img_srcs)
            except:
                #如果访问失败,就跳到下一个继续执行代码,而不终止程序
                print name," error:"
                continue
            j = 1
            src_txt = ''

            #访问上述得到的图片路径,保存到本地
            for src in img_srcs:
                with open('E:/celebrity/img_data/' + name + '/' + str(j)+'.jpg','wb') as p:
                    try:
                        print "downloading No.%d"%j
                        req = urllib2.Request(src, headers=headers)
                        #设置一个urlopen的超时,如果3秒访问不到,就跳到下一个地址,防止程序卡在一个地方。
                        img = urllib2.urlopen(src,timeout=3)
                        p.write(img.read())
                    except:
                        print "No.%d error:"%j
                        p.close()
                        continue
                    p.close()
                src_txt = src_txt + src + '\n'
                if j==30:
                    break
                j = j+1
            #保存30个图片的src路径为txt,我要一行一个,所以加换行符
            with open('E:/celebrity/img_data/' + name + '/' + name +'.txt','wb') as p2:
                p2.write(src_txt)
                p2.close()
                print "save %s txt done"%name

#主程序,读txt文件开始爬
if __name__ == '__main__':
    name_file = "name_lists1.txt"
    img_spider(name_file)





                
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值