梦想之家

利用Python3抓取百度新医疗专题的图片

利用python抓取新医疗专题内的图片,废话不多说,直接上代码

#!/usr/bin/python3
#-*- conding:utf-8 -*-
# Create by Dcr163
import requests,re,os,html as Htmls,time,zipfile
#目录下的文件打包zip
def dirZip(src_dir,output_filename):
    # 创建zip文件,用写入的方式
    myzip = zipfile.ZipFile(output_filename,'w')
    # 读取源目录上级目录的字符长度
    dirnameLen = len( os.path.dirname(src_dir) )
    # 遍历源目录下的所有文件及文件夹
    for parent, dirnames, filenames in os.walk(src_dir):
        for file in filenames:
            # 拼接真实的文件地址
            pathfile = os.path.join(parent, file)
            # 相对路径
            arcname = pathfile[dirnameLen:].strip(os.path.sep)
            # 添加到zip中保存为
            myzip.write(pathfile, arcname)
    #关闭zip
    myzip.close()
    print(output_filename,'打包完毕')

# 下载百度专题图片
def downUrlImg(url,saveDir=''):
    #获取网页内容
    r = requests.get(url)
    html = (r.text)
    #获取iframe内的真实链接 正则
    iframeReg = re.compile(r'<iframe src="(http[s]?://.+)"></iframe>')
    trueUrl = iframeReg.findall(html)

    if trueUrl == []:
        print('未拿到正确的专题地址')
        return
    #真实地址
    r = requests.get( Htmls.unescape(trueUrl[0]) )  #Htmls.unescape(trueUrl[0]) 把网页的特殊符号转换为正常符号
    r.encoding = r.apparent_encoding
    html = (r.text)



    #正则匹配图片地址
    # https://imagelib.cdn.bcebos.com/cip_ml_pic7c0f3e7f-209d-4ce3-931e-ab9549d4e3d3.png
    reg = re.compile(r'http[s]?://[\w\.\-]+/[\w_\-]*\.\b[jpg|jpeg|png|gif|mp4]+\b')
    lists1 = reg.findall(html)



    # 正则匹配图片地址 (20200812更新)
    # https://jmy-pic.wejianzhan.com/0/pic/a18d0e807647bd6ec6f09b079d505cf9.jpg
    reg = re.compile(r'http[s]?://[\w\.\-]+/\d+/\w+/[\w\_\d]+\.\b[jpg|jpeg|png|gif|mp4]+\b')
    lists2 = reg.findall(html)

    # https://lemonpro.cdn.bcebos.com/image/15968532819603679170a0ae4417-d4c2-4c3c-ae40-63a7fba8c93b.jpg 案例+商品图片
    # https://lemonpro.cdn.bcebos.com/image/1577337762446-67393-3f379809-4446-495e-8eb7-39c58e3cefe4.jpg@!scale525_525 @!scale\d+_\d+
    reg = re.compile(r'http[s]?://[\w\.\-]+[/]+[\w]+/[\w_\-]*\.\b[jpg|jpeg|png|gif|mp4]+\b')
    lists3 = reg.findall(html)
    # 重新组合新的图片规则
    newList3 = []
    if lists3:
        for img in lists3:
            newList3.append(img+'@!scale525_525')
        lists3 = newList3
        pass

    # 合并数据
    lists = lists1+lists2+lists3
    if len(lists) <= 0:
        exit('没有匹配到任何图片')
    #今天日期格式化
    nowTime = time.strftime('%Y%m%d',time.localtime())
    # 文件保存路径
    filePath = 'D:\python\\baiduWap\{nowDay}\{dir}'.format(nowDay=nowTime, dir=saveDir)
    # 判断目录是否存在,不存在则创建
    if os.path.isdir(filePath) == False:
        os.makedirs(filePath)
    if( lists ):
        i = 0
        print('总共: {total} 张图片'.format(total=len(lists)))
        for img in lists:
            i += 1
            #文件后缀根据后缀自动截取类似 .png|.jpg|.gif
            fileSuffix = img[img.rfind('.'):len(img)]
            #把 @!scale525_525 后缀去掉 20201207更新
            fileSuffix = fileSuffix.replace('@!scale525_525','')
            #文件名称
            fileTruePath = filePath + ('\{name}{suffix}'.format(name=i,suffix=fileSuffix))
            print('正在下载第:{number}张图片'.format(number=i))
            imgContent = requests.get(img).content
            with open(fileTruePath,'ab+') as f:
                f.write(imgContent)
    print('下载完成')
    #打包文件夹
    dirZip(filePath,filePath+'.zip')

#下载百度咨询页面的banner图片
def adaDown(url,saveDir='',baiduid=''):
    # 获取网页内容
    headers = {'user-agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Mobile Safari/537.36'}
    # 百度咨询页需要BAIDUID这个cookie
    cookies = dict(BAIDUID=baiduid)
    r = requests.get(url,headers=headers,cookies=cookies)
    html = (r.text)
    reg400 = re.compile(r'错误码:400')
    in400 = reg400.findall(html)
    if len(in400) > 0:
        # 因为没有baiduid所以导致访问失败,所以再次调用即可下载图片
        baiduId = r.cookies['BAIDUID']
        print('初始页面,已获取 BAIDUID:{baiduid} '.format(baiduid=baiduId))
        adaDown(url,saveDir,baiduId)
        return
    reg = re.compile(r'https://imagelib\.cdn\.bcebos\.com/[^"]+\.\b[jpeg|png|gif|mp4]+_[\w\d]+\.\b[jpeg|png|gif|mp4]+\b')
    lists = reg.findall(html)
    # 今天日期格式化
    nowTime = time.strftime('%Y%m%d', time.localtime())
    # 文件保存路径
    filePath = 'D:\python\\baiduWap\{nowDay}\{dir}'.format(nowDay=nowTime, dir=saveDir)
    # 判断目录是否存在,不存在则创建
    if os.path.isdir(filePath) == False:
        os.makedirs(filePath)
    if (lists):
        i = 0
        print('总共: {total} 张图片'.format(total=len(lists)))
        for img in lists:
            i += 1
            # 文件后缀根据后缀自动截取类似 .png|.jpg|.gif
            fileSuffix = img[img.rfind('.'):len(img)]
            # 文件名称
            fileTruePath = filePath + ('\{name}{suffix}'.format(name=i, suffix=fileSuffix))
            print('正在下载第:{number}张图片'.format(number=i))
            imgContent = requests.get(img).content
            with open(fileTruePath, 'ab+') as f:
                f.write(imgContent)
    print('下载完成')
    # 打包文件夹
    dirZip(filePath, filePath + '.zip')
#
if __name__ == '__main__':

    # 百度专题列表 用字典的方式排序,前面是链接,后面是保存的文件夹名称; ym.wejianzhan.com 开头的看起来是正常的页面   ada.baidu.com 是咨询页面
    urlList = {
        'https://ym.wejianzhan.com/site/tjbolaimei.cn/809154e0-c7cf-4535-9798-00dbbc3b8c38':'胸部整形',
    }
    print( '===开始下载,总共 {number} 个专题==='.format(number=len(urlList)) )
    i=0
    for key in urlList:
        i += 1
        print('---正在下载第 {number} 个链接图片---'.format(number=i))
        # 咨询页面
        if 'ada.baidu.com' in key:
            adaDown(key,urlList[key])
        # 专题页面
        else:
            downUrlImg(key, urlList[key])
    print('所有链接图片下载完毕!')

结果如下图所示:
image.png

相关推荐

您此刻的心情: