zoukankan      html  css  js  c++  java
  • python爬取图片

    1.导入需要的模块requests,BeautifulSoup,os(用于文件读写)。

      2.创建一个类,并初始化。

     
    1
    2
    3
    4
    5
    6
    7
    8
    class BeautifulPicture:
        def __init__(self):  # 类的初始化操作
            self.headers = {
                # 给请求指定一个请求头来模拟chrome浏览器
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64)'
                              ' AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
            self.web_url = 'url'  # 要访问的网页地址
            self.folder_path = 'E:\\1\\pic'  # 设置图片要存放的文件目录

      3.先请求图片所在的网页,返回网页response

     
    1
    2
    3
    def request(self, url):  # 返回网页response
        r = requests.get(url, self.headers)  # 向目标url地址发送get请求,返回一个response对象
        return r

      调用request方法,print(r.text)就可以看到控制台上print出的网页源码了。

      4.通过BeautifulSoup工具获取需要抓取的img标签,这里根据不同的网页布局css选择器也会有不同:

     
    1
    2
    3
    4
    5
    6
    def get_pic(self):
        r = self.request(self.web_url)
        all_item = BeautifulSoup(r.text, 'html.parser').select(".search_results > .item")
        for item in all_item:
            img = item.find('a').find('img')
            url = img['src']

      此处,我是先抓取img所在的div(类名为item),再获取div下的a链接下的img,网页具体代码格式为

     
    1
    2
    3
    4
    5
    6
    7
    8
    <div class="flex_grid credits search_results" style="margin:4px 14px 0 15px">       
        <div class="item" data-w="640" data-h="256">
            <a href="">
                <img srcset="" src="" alt="">
            </a>
        </div>
        ......
    </div>

      通过遍历可以获取所有图片的链接。

      5.获取到图片地址链接后,就可以下载图片并保存到本地了。那么就需要确认初始化定义的文件夹是否存在,如果不存在,需要创建。

     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def mkdir(self, path):  # 创建文件夹
        path = path.strip()
        is_exists = os.path.exists(path)
        if not is_exists:
            print('创建名字叫做', path, '的文件夹')
            os.makedirs(path)
            print('创建成功!')
        else:
            print(path, '文件夹已经存在了,不再创建')

      6.接下来就可以保存图片了。

      第四步操作,在get_pic方法中,获取到所有图片所在的div标签后,先确保存放图片的文件下是否存在,调用方法

      self.mkdir(self.folder_path) # 创建文件夹  

      os.chdir(self.folder_path) # 切换路径至上面创建的文件夹

      遍历所有的div,根据url名中jpg/png的不同,决定保存图片的后缀名

     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    i = 1  # 后面用来给图片命名
    for item in all_item:
        img = item.find('a').find('img')
        url = img['src']
        if url.count('jpg') > 0:
            self.save_img(url, str(i) + '.jpg')
        elif url.count('png') > 0:
            self.save_img(url, str(i) + '.png')
        i += 1

      其中save_img方法为:

     
    1
    2
    3
    4
    5
    6
    def save_img(self, url, name):  # 保存图片
        img = self.request(url)
        f = open(name, 'ab')
        f.write(img.content)
        print(name, '文件保存成功!')
        f.close()

      创建MyBeautifulPicture类的实例,调用get_pic方法,至此,保存图片到本地就可以实现了。

      完整的get_pic方法为:

     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    def get_pic(self):
        r = self.request(self.web_url)
        all_item = BeautifulSoup(r.text, 'html.parser').select(".search_results > .item")
        self.mkdir(self.folder_path)  # 创建文件夹
        os.chdir(self.folder_path)  # 切换路径至上面创建的文件夹
        i = 1  # 后面用来给图片命名
        for item in all_item:
            img = item.find('a').find('img')
            url = img['src']
            # print(url)
            if url.count('jpg') > 0:
                self.save_img(url, str(i) + '.jpg')
            elif url.count('png') > 0:
                self.save_img(url, str(i) + '.png')
            i += 1
  • 相关阅读:
    Linq与Lambda,神一般的工作效率
    svn和git孰优孰劣
    关于C++的***5的输出问题
    POJ 3469 Dual Core CPU(最小割)
    HDU 4259 Double Dealing
    最大流Dinic算法
    HDU 4442 Physical Examination(2012年金华赛区现场赛A题)
    int ,long , long long类型的范围
    POJ 1679 The Unique MST(判断最小生成树是否唯一)
    HDU 4280 Island Transport(网络流)
  • 原文地址:https://www.cnblogs.com/c1q2s3/p/11924034.html
Copyright © 2011-2022 走看看