python网络爬虫(二)分页爬取图片

网络爬虫系列

python网络爬虫(一) 爬取网站图片
python网络爬虫(二)分页爬取图片

上篇回顾

  • 在上篇讲述了网络爬虫爬取某个网页上的图片,我们实现的是具有Img标签的所有href进行爬取。但是,一个网站不可能只有一个页面有图片,我们爬取图片也不是只爬取一个页面的图片,这时如果我们需要爬取某个网站上的多页图片时,就需要对上篇代码进行改进了。

怎么实现分页爬取呢?

  • 还是以ZOL桌面壁纸这个网站为例,打开网站我们发现下面有上一页、1、2、3、4、5、下一页等链接可以点击,所以在改进代码时,就是对这几个链接左处理了。
    在这里插入图片描述
  • 当我们点击每页时可以找到URL的一些规律:
  • 可以发现每一页变得是/2、/3、/4。所以对此我们可以在代码中加一个for循环,使循环的最大值小于网站page的最大值,从第一页开始爬取图片,但是这种方法不太好,因为网站是动态的,不可能最大page一直不变,我们也不可能每次来爬取的时候先进网站找最大页面值,所以必须找一种就算网站更新了,还是可以从第一页开始到最后一页结束为止,把所有图片都爬取完的方法。
  • 右键审查,选择下一页图标,在Element中查看html格式。
    在这里插入图片描述
    可以发现下一页有个id="pageNext"的属性,所以我们可以在翻页时判断页面a标签中是否有
id = "pageNext"

如果有就做while循环直到最后一页为止,这样就实现了自动翻页的功能了。
在这里插入图片描述


实现思路

  • 每翻一页,就把页面上的img下载。
def download_img(url):
   imgname = url.split('/')[-1]
   img = requests.get(url, headers = headers)
   with open('imgs1/'+imgname,'wb') as file:
       file.write(img.content)
       print(url, imgname)
  • 判断是否有‘’下一页‘’这个标签,如果有就把页面的图片下载到指定文件夹下并且返回下一页的URL,没有则返回null。
def next_page(url):
   res = requests.get(url, headers = headers)
   html = etree.HTML(res.text)
   srcs = html.xpath(".//img/@src")
   for i in srcs:
       download_img(i)
   next_page_link = html.xpath('.//a[@id="pageNext"]/@href')
   return next_page_link
  • mian函数通过while循环来判断是否有下一页,如果有current_page加一,没有了就执行完成,即到了尾页,这里由于是演示,就在代码中加了一个限定,只下载10页以前的图片。
def main():
   current_page = 1
   next_page_base = 'http://desk.zol.com.cn/dongman/1920x1080/'
   next_page_link = html.xpath('.//a[@id="pageNext"]/@href')
   while next_page_link:
       current_page=current_page + 1
       next_page_link = next_page(next_page_base+str(current_page)+'.html')
       if current_page > 10:
           break
  • 注意在首页的url为http://desk.zol.com.cn/dongman/1920x1080/与后面的页面不一样,所有在while循环之前先将首页的Img下载下来。

代码部分:

import  requests
import time
from lxml import etree
url = 'http://desk.zol.com.cn/dongman/1920x1080/'

headers = {"Referer":"Referer: http://desk.zol.com.cn/dongman/1920x1080/",
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36",}

resq = requests.get(url,headers = headers)

print(resq)

html = etree.HTML(resq.text)
srcs = html.xpath(".//img/@src")

def download_img(url):
    imgname = url.split('/')[-1]
    img = requests.get(url, headers = headers)
    with open('imgs1/'+imgname,'wb') as file:
        file.write(img.content)
        print(url, imgname)

def next_page(url):
    res = requests.get(url, headers = headers)
    html = etree.HTML(res.text)
    srcs = html.xpath(".//img/@src")
    for i in srcs:
        download_img(i)
    next_page_link = html.xpath('.//a[@id="pageNext"]/@href')
    return next_page_link

def main():
    current_page = 1
    next_page_base = 'http://desk.zol.com.cn/dongman/1920x1080/'
    next_page_link = html.xpath('.//a[@id="pageNext"]/@href')
    while next_page_link:
        current_page=current_page + 1
        next_page_link = next_page(next_page_base+str(current_page)+'.html')
        if current_page > 10:
            break

if __name__ == '__main__':
    main()


执行结果

  • 运行成功,正在下载图片
    在这里插入图片描述
  • 打开文件夹,查看下载的图片
    在这里插入图片描述

  • 8
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值