利用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('所有链接图片下载完毕!')
Dcr163的博客
http://dcr163.cn/216.html(转载时请注明本文出处及文章链接)