Python爬蟲爬取百度圖片


前期准備:一個所爬人物的名單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)
 
 
 
 
 

                        
                        
                 

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com