Python爬虫实战系列(一): 爬取图片根据url创建目录并保存到本地

一、爬取目标

爬虫网址: http://bbs.talkop.com/forum.php?mod=viewthread&tid=54143&page=1&authorid=2
爬虫任务: 点击只看作者 ,爬取62页的图片, 由于url中包含了日期信息,所以根据url中的日期在本地创建目录后在指定目录存档

二、分析
  1. 先获取62个网页,每个网页的地址
    网址是这个样子 http://bbs.talkop.com/forum.php?mod=viewthread&tid=54143&extra=&authorid=2&page=2 各个网页只有最后一个数字的差异
  2. 爬取单个页面的img的地址src属性
三、实战
  1. 实战过程发现 此网页需要登陆才能查看,所以得先使用fiddle4抓包工具获取cookies,在request.get()中添加参数request.get( url, cookies=cookies )
  2. 爬下来的网页的src属性不会立即加载,也就是src属性没有图片的url,但是file属性有,所以最后使用了img的file属性
四、完整Python代码
import urllib.request
import requests
from bs4 import BeautifulSoup
import os

class TalkopDownload(object):
    def __init__(self, url, startpage, endpage, path):
        self.head = url
        self.startpage = startpage
        self.endpage = endpage
        self.path = path
        self.cookie = {' #此字段请自己抓包获取'}
        self.directory = []
        self.url = []

    """
    函数说明:获取每个页面的page链接
    """
    def get_download_url(self):
        for page in range(self.startpage, self.endpage, 1):
            self.directory.append(self.head + str(page))

    """
    函数说明:获取每个页面下的图片的下载连接
    """
    def get_content(self, target):
        req = requests.get(target, cookies = self.cookie).text
        bf = BeautifulSoup(req, 'html.parser')
        contents = bf.find_all(attrs={'class': 't_f'})
        for content in contents:
            imgs = content.find_all('img')
            for img in imgs:
                self.url.append(img.get('file'))

    def download(self, dl_url):
        if dl_url is None:
            print("None")
            return
        filename = dl_url.split('/')[-1:]
        dirname = path + dl_url.split('/')[4] + dl_url.split('/')[5] + '/'
        if not os.path.exists(dirname):
            os.mkdir(dirname)
        if not os.path.exists(dirname + filename[0]):
            urllib.request.urlretrieve(dl_url, dirname + filename[0])

    def download_manager(self):
        self.get_download_url()
        for page in self.directory:
            self.get_content(page)
        print("It will download %d picture" % len(self.url))
        for link in range(10):
            print(self.url[link])
        for i in range(len(self.url)):
            print("downloading {:d} / {:d} have completed {:.2%}".format(i+1, len(self.url), i/len(self.url)))
            self.download(self.url[i])


if __name__ == '__main__':
    url = 'http://bbs.talkop.com/forum.php?mod=viewthread&tid=54143&extra=&authorid=2&page='
    path = 'E:/Picture/'
    TalkopPictureDownload = TalkopDownload(url, 1, 63, path)
    TalkopPictureDownload.download_manager()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值