Python爬取动态网页中图片的完整实例
动态网页爬取是爬虫学习中的一个难点。本文将以知名插画网站pixiv为例,简要介绍动态网页爬取的方法。
写在前面
本代码的功能是输入画师的pixivid,下载画师的所有插画。由于本人水平所限,所以代码不能实现自动登录pixiv,需要在运行时手动输入网站的cookie值。
重点:请求头的构造,json文件网址的查找,json中信息的提取
分析
创建文件夹
根据画师的id创建文件夹(相关路径需要自行调整)。
defmakefolder(id):#根据画师的id创建对应的文件夹
try:
folder=os.path.join('E:\pixivimages',id)
os.mkdir(folder)
returnfolder
except(FileExistsError):
print('thefolderexists!')
exit()
获取作者所有图片的id
访问url:https://pixiv.net/ajax/user/画师id/profile/all(这个json可以在画师主页url:https://www.pixiv.net/users/画师id的开发者面板中找到,如图:)
json内容:
将json文档转化为python的字典,提取对应元素即可获取所有的插画id。
defgetAuthorAllPicID(id,cookie):#获取画师所有图片的id
url='https://pixiv.net/ajax/user/'+id+'/profile/all'#访问存有画师所有作品
headers={
'User-Agent':user_agent,
'Cookie':cookie,
'Referer':'https://www.pixiv.net/artworks/'
#referer不能缺少,否则会403
}
res=requests.get(url,headers=headers,proxies=proxies)
ifres.status_code==200:
resdict=json.loads(res.content)['body']['illusts']#将json转化为python的字典后提取元素
return[keyforkeyinresdict]#返回所有图片id
else:
print("Cannotgettheauthor'spictureids!")
exit()
获取图片的真实url并下载
访问url:https://www.pixiv.net/ajax/illust/图片id?lang=zh,可以看到储存有图片真实地址的json:(这个json可以在图片url:https://www.pixiv.net/artworks/图片id的开发者面板中找到)
用同样的方法提取json中有用的元素:
defgetPictures(folder,IDlist,cookie):#访问图片储存的真实网址
forpicidinIDlist:
url1='https://www.pixiv.net/artworks/{}'.format(picid)#注意这里referer必不可少,否则会报403
headers={
'User-Agent':user_agent,
'Cookie':cookie,
'Referer':url1
}
url='https://www.pixiv.net/ajax/illust/'+str(picid)+'?lang=zh'#访问储存图片网址的json
res=requests.get(url,headers=headers,proxies=proxies)
ifres.status_code==200:
data=json.loads(res.content)
picurl=data['body']['urls']['original']#在字典中找到储存图片的路径与标题
title=data['body']['title']
title=changeTitle(title)#调整标题
print(title)
print(picurl)
download(folder,picurl,title,headers)
else:
print("Cannotgettheurlsofthepictures!")
exit()
defchangeTitle(title):#为了防止
globali
title=re.sub('[*:]',"",title)#如果图片中有下列符号,可能会导致图片无法成功下载
#注意可能还会有许多不能用于文件命名的符号,如果找到对应符号要将其添加到正则表达式中
iftitle=='無題':#pixiv中有许多名为'無題'(日文)的图片,需要对它们加以区分以防止覆盖
title=title+str(i)
i=i+1
returntitle
defdownload(folder,picurl,title,headers):#将图片下载到文件夹中
img=requests.get(picurl,headers=headers,proxies=proxies)
ifimg.status_code==200:
withopen(folder+'\\'+title+'.jpg','wb')asfile:#保存图片
print("downloading:"+title)
file.write(img.content)
else:
print("downloadpictureserror!")
完整代码
importrequests
fromfake_useragentimportUserAgent
importjson
importre
importos
globali
i=0
ua=UserAgent()#生成假的浏览器请求头,防止被封ip
user_agent=ua.random#随机选择一个浏览器
proxies={'http':'http://127.0.0.1:51837','https':'http://127.0.0.1:51837'}#代理,根据自己实际情况调整,注意在请求时一定不要忘记代理!!
defmakefolder(id):#根据画师的id创建对应的文件夹
try:
folder=os.path.join('E:\pixivimages',id)
os.mkdir(folder)
returnfolder
except(FileExistsError):
print('thefolderexists!')
exit()
defgetAuthorAllPicID(id,cookie):#获取画师所有图片的id
url='https://pixiv.net/ajax/user/'+id+'/profile/all'#访问存有画师所有作品
headers={
'User-Agent':user_agent,
'Cookie':cookie,
'Referer':'https://www.pixiv.net/artworks/'
}
res=requests.get(url,headers=headers,proxies=proxies)
ifres.status_code==200:
resdict=json.loads(res.content)['body']['illusts']#将json转化为python的字典后提取元素
return[keyforkeyinresdict]#返回所有图片id
else:
print("Cannotgettheauthor'spictureids!")
exit()
defgetPictures(folder,IDlist,cookie):#访问图片储存的真实网址
forpicidinIDlist:
url1='https://www.pixiv.net/artworks/{}'.format(picid)#注意这里referer必不可少,否则会报403
headers={
'User-Agent':user_agent,
'Cookie':cookie,
'Referer':url1
}
url='https://www.pixiv.net/ajax/illust/'+str(picid)+'?lang=zh'#访问储存图片网址的json
res=requests.get(url,headers=headers,proxies=proxies)
ifres.status_code==200:
data=json.loads(res.content)
picurl=data['body']['urls']['original']#在字典中找到储存图片的路径与标题
title=data['body']['title']
title=changeTitle(title)#调整标题
print(title)
print(picurl)
download(folder,picurl,title,headers)
else:
print("Cannotgettheurlsofthepictures!")
exit()
defchangeTitle(title):#为了防止
globali
title=re.sub('[*:]',"",title)#如果图片中有下列符号,可能会导致图片无法成功下载
#注意可能还会有许多不能用于文件命名的符号,如果找到对应符号要将其添加到正则表达式中
iftitle=='無題':#pixiv中有许多名为'無題'(日文)的图片,需要对它们加以区分以防止覆盖
title=title+str(i)
i=i+1
returntitle
defdownload(folder,picurl,title,headers):#将图片下载到文件夹中
img=requests.get(picurl,headers=headers,proxies=proxies)
ifimg.status_code==200:
withopen(folder+'\\'+title+'.jpg','wb')asfile:#保存图片
print("downloading:"+title)
file.write(img.content)
else:
print("downloadpictureserror!")
defmain():
globali
id=input('inputtheidoftheartist:')
cookie=input('inputyourcookie:')#半自动爬虫,需要自己事先登录pixiv以获取cookie
folder=makefolder(id)
IDlist=getAuthorAllPicID(id,cookie)
getPictures(folder,IDlist,cookie)
if__name__=='__main__':
main()
效果
总结
到此这篇关于Python爬取动态网页中图片的文章就介绍到这了,更多相关Python爬取动态网页图片内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。