Python爬取百度图片搜索结果

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yx0628/article/details/81836829

爬取百度图片搜索的图片,我们先需要分析其访问 URL,我们在搜索页面,比如搜索 “abc” ,打开 F12 调试,下拉结果页面页,查看网络请求,在其中我们可以找到这样一个请求

http://image.baidu.com/search/acjson?
tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=abc&
cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=&z=&ic=&word=abc&s=&se=&
tab=&width=&height=&face=&istype=&qc=&nc=1&fr=&pn=90&rn=30&gsm=5a&1534648263840=

可以看到 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 = 0

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

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(0, 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=10)
                p.write(img.read())
                p.close()
                totalCount += 1
            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=&face=0&istype=2&qc=&nc=1&fr=&pn=" + 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 次就够用了,或者改下代码当请求读不到图了之后停止循环就行。

猜你喜欢

转载自blog.csdn.net/yx0628/article/details/81836829