python+selenium爬取圖片


1、解決的問題:

之前遇到過項目中需要大量的圖書圖片,自己沒有就只有到大型網站抓取了。 ̄□ ̄||

2、解決的辦法:

通過python+selenium到豆瓣抓取圖片,可以直接把圖片地址保存下來,也可以直接下載圖片。

3、腳本解析:(這里沒有弄成項目,直接寫的一個腳本)

腳本包含2個類,一個是數據庫操作類,一個是圖片處理類

(1)圖片處理類:提供獲取圖片地址的方法、保存圖片地址到數據庫、下載圖片到本地

(2)數據庫操作類:提供了連接數據庫,插入數據、查詢數據等方法,這里只用到了插入數據和關閉連接池的方法。

(3)excel操作類:isbn放在excel里面,從excel中讀取isbn。

(4)代碼:

# -*- coding: utf-8 -*-
'''
Created on 2018年6月20日

@author: zww
'''
from selenium import webdriver
import pymysql
import time
import os

import random
from urllib import request


class DouBanPics:
    def __init__(self, isbnlist):
        path = "C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe"
        self.wb = webdriver.Chrome(executable_path=path)
        # 根據isbn來抓取
        self.isbn_list = isbnlist
        # 字典存放isbn對應的圖片地址
        self.pics_url = {}

# 爬取isbn對應的圖片地址
    def getPicsUrl(self):
        for isbn in self.isbn_list:
     # 每抓一個休眠一個隨機時間,免得被封了IP

    time.sleep(round(random.uniform(1, 4), 2))


            # 根據isbn來查詢書籍
            self.wb.get(
                'https://book.douban.com/subject_search?search_text=%s&cat=1001' % isbn)
            # 獲取大圖
            self.wb.find_element_by_xpath(
                '//*[@id="root"]/div/div[2]/div[1]/div[1]/div/div/a/img').click()
            # 獲取圖片地址
            self.wb.find_element_by_xpath('//*[@id="mainpic"]/a/img').click()
            # 當前頁面的url就是圖片地址
            img_url = self.wb.current_url
            # 通過字典存放
            self.pics_url[isbn] = img_url

# 只把圖片的地址存到數據庫中
    def savePicsUrls(self):
        try:
            # 連接數據庫的信息也可以通過配置來取,這里就直接寫死了
            self.db = DataBaseHandle(
                'ip', 3306, 'root', '密碼', 數據庫名')
            for key in self.pics_url.keys():
                sql = '''insert into doubanpics(isbn,imgurl) values("%s","%s")''' % (
                    key, self.pics_url[key])
                self.db.insert_sql(sql)
        except Exception as e:
            print(e)
        finally:
            self.db.close()

# 把圖片下載到本地
    def savePics(self, path='D:\\doubanPics'):
        # 目錄不存在,就新建一個
        if not os.path.exists(path):
            os.makedirs(path)

        for key in self.pics_url.keys():
            # 這里要取圖片地址的最后一個,以便之后獲取圖片的格式,保存的時候就按照本來的格式保存
            lastname = self.pics_url[key].split('/')
            prefix, Suffix = lastname[-1].split('.')
            # 組裝圖片的絕對路徑,用isbn來命名
            pic_path = ''.join([path, '\\', str(key), '.', Suffix])
            req = request.Request(self.pics_url[key], headers={
                                  'User-Agent':  r'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0'})
            data = request.urlopen(req, timeout=30).read()
            f = open(pic_path, 'wb')
            f.write(data)
            f.close()


# 數據庫操作類
class DataBaseHandle:
    def __init__(self, ip, port, user, passwd, db_name):
        self.con = pymysql.connect(
            host=ip, port=port, user=user, passwd=passwd, db=db_name, charset='utf8')
        self.cursor = self.con.cursor()

    # 執行查詢SQL
    def select_sql(self, sql):
        self.cursor.execute(sql)
        result = self.cursor.fetchall()
#         row = self.cursor.fetchone()
        return result

    # 執行插入SQL
    def insert_sql(self, sql):
        self.cursor.execute(sql)
        self.con.commit()

    # 執行更新SQL
    def update_sql(self, sql):
        self.cursor.execute(sql)
        self.con.commit()

    # 執行關閉連接
    def close(self):
        self.cursor.close()
        self.con.close()
# isbn放在excel里面,從excel中讀取isbn
class ExcelHandle:
    def __init__(self, excel_path):
        self.excel_obj = xlrd.open_workbook(excel_path)
        self.sheet = self.excel_obj.sheet_by_index(0)

    def getIsbnList(self):
        rows = self.sheet.nrows
        isbn_list = []
        for i in range(1, rows):
            isbn = self.sheet.cell_value(i, 0)
            isbn_list.append(isbn)
        return isbn_list



def main():
    excel_obj = ExcelHandle('isbnList.xlsx')
    isbnlist = excel_obj.getIsbnList()
    dbpics = DouBanPics(isbnlist)
    # 獲取圖片地址
    dbpics.getPicsUrl()
    # 只存url地址
    dbpics.savePicsUrls()
    # 下載圖片到本地
    dbpics.savePics()


if __name__ == '__main__':
    main()
4、腳本擴展:

可以直接把isbn通過txt或者excel讀取,然后獲取圖片。

之前的文章已經涉及到excel的讀取,這里就不再重復了。

 

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM