项目:DrissionPage爬取图片网站

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

引入库

from DrissionPage import WebPage

打开网站

并找到图片所在的json
alt text
找到所在链接特征。
alt text

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)

alt text

提取json中关键信息

alt text

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

alt text

下载功能

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) 显示下载情况信息

alt text

可以看到部分是下载成功的,部分是失败的。
分析失败原因: 网页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)