python爬虫(1) : 爬取百度图片

python爬虫(1) : 爬取百度图片

最近在自学python的爬虫方法,总结了一些笔记在此分享。

先以搜索词“哆啦A梦”为例:

我们在百度图片中搜索“哆啦A梦”,向下滑动网页时,图片会不断加载,因此该网页是动态加载的网页,按F12,选择网络,在消息中选择过滤XHR消息。

查看响应消息,可以看出,该请求为GET请求,返回的是一个JSON文件,里面的data蕴含着我们想要获取的每个图片的url。

由此,我们可以利用requests模块的get方法模拟浏览器发送请求,获得其对应的JSON数据。

可能使用到的头文件有:

import re
import os
import requests

使用requests模块的get()方法可以获得一个网址的源码,其中params里面的参数可以右键-复制全部得到。然后通过key="data"获取我们想要的url。

    url = 'https://image.baidu.com/search/acjson'
    params={
            "tn": "resultjson_com",
            "logid": "11555092689241190059",
            "ipn": "rj",
            "ct": "201326592",
            "is": "",
            "fp": "result",
            "queryWord": "哆啦A梦",
            "cl": "2",
            "lm": "-1",
            "ie": "utf-8",
            "oe": "utf-8",
            "adpicid": "",
            "st": "-1",
            "z": "",
            "ic": "0",
            "hd": "",
            "latest": "",
            "copyright": "",
            "word":"哆啦A梦" ,
            "s": "",
            "se": "",
            "tab": "",
            "width": "",
            "height": "",
            "face": "0",
            "istype": "2",
            "qc": "",
            "nc": "1",
            "fr": "",
            "expermode": "",
            "force": "",
            "pn": 0,
            "rn":"60" ,
            "gsm": "1e",
            "1617626956685": ""
    result = requests.get(url, headers=header,params=params).json()
    url_list=[]
    for data in result['data'][:-1]:
        url_list.append(data['thumbURL'])

url_list为一个有60个元素的列表,每个元素对应一张图片的链接。

最后一步,遍历url_list中的所有元素,逐个下载保存即可。

    def getImg(url,idx,path):
        img=requests.get(url,headers=header)
        file=open(path+str(idx)+'.jpg','wb')
        file.write(img.content)
        file.close()
   for i in range(len(url_list)):
        getImg(url_list[i],60*page+i,path)
效果图

值得注意的是,请求参数中的"word"和"queryword"为我们的关键词,"pn"表示开始索引,"rn"表示获取的张数(每一页最多可获取60张图片,要想获得更多图片,重复发请求即可)。

最后完善一下交互操作即可实现自动爬取百度图片。

import re
import os
import requests
import tqdm
header={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'}
def getImg(url,idx,path):
    img=requests.get(url,headers=header)
    file=open(path+str(idx)+'.jpg','wb')
    file.write(img.content)
    file.close()
search=input("请输入搜索内容:")
number=int(input("请输入需求数量:"))
path='image/'+search+'/'
if not os.path.exists(path):
    os.makedirs(path)
bar=tqdm.tqdm(total=number)
page=0
while(True):
    if number==0:
        break
    url = 'https://image.baidu.com/search/acjson'
    params={
            "tn": "resultjson_com",
            "logid": "11555092689241190059",
            "ipn": "rj",
            "ct": "201326592",
            "is": "",
            "fp": "result",
            "queryWord": search,
            "cl": "2",
            "lm": "-1",
            "ie": "utf-8",
            "oe": "utf-8",
            "adpicid": "",
            "st": "-1",
            "z": "",
            "ic": "0",
            "hd": "",
            "latest": "",
            "copyright": "",
            "word": search,
            "s": "",
            "se": "",
            "tab": "",
            "width": "",
            "height": "",
            "face": "0",
            "istype": "2",
            "qc": "",
            "nc": "1",
            "fr": "",
            "expermode": "",
            "force": "",
            "pn": str(60*page),
            "rn": number,
            "gsm": "1e",
            "1617626956685": ""
    result = requests.get(url, headers=header,params=params).json()
    url_list=[]
    for data in result['data'][:-1]:
        url_list.append(data['thumbURL'])
    for i in range(len(url_list)):
        getImg(url_list[i],60*page+i,path)
        bar.update(1)