天天看點

Python爬取百度圖檔搜尋結果

爬取百度圖檔搜尋的圖檔,我們先需要分析其通路 URL,我們在搜尋頁面,比如搜尋 “abc” ,打開 F12 調試,下拉結果頁面頁,檢視網絡請求,在其中我們可以找到這樣一個請求

http://image.baidu.com/search/acjson?
tn=resultjson_com&ipn=rj&ct=&is=&fp=result&queryWord=abc&
cl=&lm=-&ie=utf-&oe=utf-&adpicid=&st=&z=&ic=&word=abc&s=&se=&
tab=&width=&height=&hljs-number">1&fr=&pn=&rn=&gsm=a&=
           

可以看到 queryword 和 word 字段是我們的搜尋關鍵詞,

我們繼續下拉可以發現

pn=120&rn=30
pn=150&rn=30
pn=180&rn=30
pn=210&rn=30
......
           

可以分析出 pn 是目前的位置,而 rn 是每次請求的記錄數量,知道了這些就可以開始爬蟲了:

完整的代碼如下:

import urllib2
import re
import os

global totalCount
totalCount = 

save_path = "D:\Python\img\BaiduDemo"
rn = 
requestTotalNum = 

user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) " \
                      "Chrome/55.0.2883.95 Safari/537.36 "
headers = {'User-Agent': user_agent}


def search(keyword):
    for i in range(, requestTotalNum):
        url = get_search_url(keyword, i * rn)
        response = get_response(url).replace("\\", "")
        image_url_list = pick_image_urls(response)
        save(image_url_list)


def save(image_url_list):

    print "正在存儲 " + str(len(image_url_list)) + "張,存儲路徑:" + save_path

    if not os.path.exists(save_path):
        os.makedirs(save_path)

    global totalCount

    for image in image_url_list:

        with open(save_path + "/%s.jpg" % str(totalCount), "wb") as p:
            try:
                req = urllib2.Request(image, headers=headers)
                img = urllib2.urlopen(req, timeout=)
                p.write(img.read())
                p.close()
                totalCount += 
            except Exception as e:
                print "Exception" + str(e) + image
                p.close()
                if os.path.exists("img/%s.jpg" % totalCount):
                    os.remove("img/%s.jpg" % totalCount)

    print "已存儲 " + str(totalCount) + " 張圖檔"


def pick_image_urls(response):
    reg = r'"thumbURL":"(http://img[0-9]\.imgtn.*?)"'
    img_regex = re.compile(reg)
    img_list = re.findall(img_regex, response)
    return img_list


def get_response(url):
    page = urllib2.urlopen(url)
    return page.read()


def get_search_url(keyword, pn):
    return "http://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=" + \
           keyword + "&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&word=" + keyword + \
           "&s=&se=&tab=&width=&height=& + str(pn) + "&rn=" + str(rn) + \
           "&gsm=1000000001e&1486375820481="


search("abc")
           

運作結果:

正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 30 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 60 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 90 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 120 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 150 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 180 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 210 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 240 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 270 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 300 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 330 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 360 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 390 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 420 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 450 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 480 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 510 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 540 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 570 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 600 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 630 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 660 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 690 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 720 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 750 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 780 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 810 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 840 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 870 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 900 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 930 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 960 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 990 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 1020 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 1050 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 1080 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 1110 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 1140 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 1170 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 1200 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 1230 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 1260 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 1290 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 1320 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 1350 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 1380 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 1410 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 1440 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 1470 張圖檔
正在存儲 30張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 1500 張圖檔
正在存儲 17張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 1517 張圖檔
正在存儲 0張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 1517 張圖檔
正在存儲 0張,存儲路徑:D:\Python\img\BaiduDemo
已存儲 1517 張圖檔
正在存儲 0張,存儲路徑:D:\Python\img\BaiduDemo
...
           

另,試了很多次不同的關鍵詞,好像百度圖檔搜尋結果一般都是1500多張,這樣的話設定請求數量為 1650 / 30 = 55 次就夠用了,或者改下代碼當請求讀不到圖了之後停止循環就行。