python 爬取图片

拟爬取一个漫画网站的所有漫画,其域名为https://xkcd.com

它的结构非常清晰 它有一个PrevNext按钮 第一张漫画Prev按钮的链接是#,最后一张漫画的Next按钮的链接为/

为避免误会,这里从最后一张往前面下载

步骤:

  • 打开网站
  • 获取图片url
  • 将图片以写二进制形式存入文件
  • 获取上一张图片链接地址
  • 循环反复,直到链接地址最后一个字符为#
#抓取http://xkcd.com上的动画并保存
import os,requests,bs4,time,warnings
warnings.filterwarnings("ignore")
def grapWep():
    #保存目录
    os.makedirs('xkcd',exist_ok=True)
    #目标网站url
    url='https://xkcd.com'
    while not url.endswith('#'):
        print('Downloading page %s' % url)
        #打开网站
        openWep=requests.get(url)
        openWep.raise_for_status()
        #获取动画
        soup=bs4.BeautifulSoup(openWep.text)
        imgElems=soup.select('#comic img')
        #获取动画url
        imgUrl='https:'+imgElems[0].get('src')
        #打开动画
        openImg=requests.get(imgUrl)
        openImg.raise_for_status()
        #获取动画后缀名
        imgSuffix=os.path.splitext(imgUrl)[1]
        #重新编辑动画名
        imgName=os.path.basename(os.path.splitext(imgUrl)[0])+'_'+str(int(time.time()))+imgSuffix
        print('Downloading animation %s' % imgUrl)
        #以动画名作为文件名,并以二进制写模式打开文件
        imgFile=open(os.path.join('xkcd',imgName),'wb')
        for chunk in openImg.iter_content(1000):
            imgFile.write(chunk)
        
        imgFile.close()
        
        #前一幅动画的url
        prevLink=soup.select('a[rel="prev"]')[0]
    
        url='https://xkcd.com'+prevLink.get('href')

    print('End')

所用知识总结:

  • warnings.filterwarnings("ignore") 忽略无用的警告信息
  • os.makedirs('dirpath',exists_ok=True) 创建多级目录,exists_ok=True保证即使目录已经存在,也不会报错
  • url.endswith('#') url如果以#结尾,返回True,否则返回False
  • openWeb=requests.get('url') 打开网站资源
  • soup=bs4.BeautifulSoup(openWeb.text) 获取网站的文本(class类型)
  • imgElems=soup.select('#comic img') 获取id=comic的元素内的img元素
  • imgElems[0].get('src') 获取src属性的值
  • os.path.splitext(imgUrl) 获取文件后缀名

你可能感兴趣的:(python)