Python爬百度图片并下载到本地实战

百度图片是Ajax加载的,怎么判断是不是Ajax呢?方法很简单,我们在页面进行某种操作时,网页的链接不会变化,但是内容变了,就可以判定网页内容是Ajax动态加载出来的,例如在浏览百度图片时,鼠标滚轮一直往下滑动,图片会不断加载出来,但是网页的链接并没有变化,百度图片就是Ajax动态加载出来的。

爬取Ajax动态加载的内容一般需要找到它的json接口,在浏览器开发者工具—>Network—>XHR可以找到,如果没有找到就再选择其他的看看。

import requests
from urllib import parse
from uuid import uuid4
import os

headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
}
session=requests.session()
session.headers=headers
num=0
def getPage(url):
    page=session.get(url)
    print(page.status_code)
    # print(page.json())
    page.encoding=page.apparent_encoding
    data=page.json()['data']    # 列表
    for i in data[:-1]: # 因为最后一个是空的,所以取到倒数第二个元素
        img_url=i['hoverURL']
        print(img_url)
        imgDownload(img_url)

# 下载图片
def imgDownload(url):
    if not os.path.exists('06_imgs'):
        os.makedirs('06_imgs')
    global num
    try:
        content=session.get(url)
        with open('06_imgs/{}.jpg'.format(uuid4()),'wb') as f:
            for chunk in content.iter_content(225): # 每次下载225字节
                if chunk:
                    f.write(chunk)
            num += 1
            print(">>>第{}张爬取成功.".format(num))
    except:
        print(">>>爬取失败.")

if __name__ == '__main__':
    # num=0
    word=input("请输入关键词:")
    pages=input("请输入要爬取的页数,每页30张图片:")
    for page in range(int(pages)):
        url='https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&word='+parse.quote(word)+'&pn='+str((page+1)*30)
        getPage(url)

猜你喜欢

转载自blog.csdn.net/KK_2018/article/details/112913223