35.5月21日 项目:DrissionPage爬取图片网站
项目:DrissionPage爬取图片网站
我们之后的项目需要用到爬取图片,下载视频,下载文档等功能。
我们通过这个项目,简单介绍下如何使用DrissionPage的下载功能。
本次使用的网站是:

引入库
from DrissionPage import WebPage
打开网站
并找到图片所在的json

找到所在链接特征。

from DrissionPage import WebPage
wp=WebPage()
wp.listen.start('api.nguaduot.cn/snake/v3')
wp.get("https://snake.timeline.ink/random")
packet=wp.listen.wait()
photo_list=packet.response.body['data']
print(photo_list)

提取json中关键信息

for photo in photo_list:
catehowname=photo['catehowname']
photo_id=photo['id']
imgurl=photo['imgurl']
print(photo_id,catehowname,imgurl)

下载功能
DrissionPage使用download()方法可添加单线程任务,该方法是阻塞式的,且只使用一个线程。
for photo in photo_list:
catehowname=photo['catehowname']
photo_id=photo['id']
imgurl=photo['imgurl']
print(photo_id,catehowname,imgurl)
save_path = './'
res = wp.download(photo['imgurl'], save_path)
print(res)
- save_path = ‘./’ 用于指定图片的存放路径
- res = wp.download(imgurl, save_path) 实现下载,参数分别是下载链接和下载存放位置
- print(res) 显示下载情况信息

可以看到部分是下载成功的,部分是失败的。
分析失败原因: 网页URL能正常打开,初步判断是“反爬虫”机制原因导致的。
直接请求res = wp.download(photo[‘imgurl’], save_path)
是没有header 和cookie的 很容易被“反爬虫”机制拦截。
过反爬机制
简单说明,我们需要访问一次该链接。(get()方式)
在这个过程中,会产生正常的header和cookie。
这时再请求时就不会被“反爬虫”机制拦截。
同时为了不和原先的wp=WebPage()混淆,也为了不影响packet=wp.listen.wait()
我们需要重新创建个WebPage对象
from DrissionPage import WebPage
wp=WebPage()
wp2=WebPage() # 新对象
wp.listen.start('api.nguaduot.cn/snake/v3')
wp.get("https://snake.timeline.ink/random")
packet=wp.listen.wait()
wp.set.download_file_name('.jpg')
photo_list=packet.response.body['data']
for photo in photo_list:
catehowname=photo['catehowname']
photo_id=photo['id']
imgurl=photo['imgurl']
save_path = './'
res = wp.download(photo['imgurl'], save_path)
print(res)
同时,具有反爬虫机制的网站有明显url特征"hdslb"、“huaban”、"lf127"等
为了不影响代码整体执行效率。
故仅仅对以上URL 进行特殊处理
for photo in photo_list:
if "hdslb" in photo['imgurl'] or "huaban" in photo['imgurl'] or "lf127" in photo['imgurl']:
wp2.get( photo['imgurl'])
save_path = r'./'
res = wp.download( photo['imgurl'], save_path)
print(res)
save_path = r'./'
res = wp.download(photo['imgurl'], save_path)
print(res)
time.sleep(1)
修改文件名
略
循环
略
完整代码
from DrissionPage import WebPage
wp=WebPage()
wp2=WebPage()
wp.listen.start('api.nguaduot.cn/snake/v3')
while True:
wp.get("https://snake.timeline.ink/random")
packet=wp.listen.wait()
photo_list=packet.response.body['data']
save_path = './img'
for photo in photo_list:
catehowname=photo['catehowname']
photo_id=photo['id']
imgurl=photo['imgurl']
if "hdslb" in photo['imgurl'] or "huaban" in photo['imgurl'] or "lf127" in photo['imgurl']:
wp2.get( photo['imgurl'])
res = wp2.download( photo['imgurl'], save_path,photo_id+'.jpg')
print(res)
else:
res = wp.download(photo['imgurl'], save_path,photo_id+'.jpg')
print(res)
time.sleep(1)
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 现代职校董良
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果