一、解決的問題:python
以前遇到過項目中須要大量的圖書圖片,本身沒有就只有到大型網站抓取了。 ̄□ ̄||mysql
二、解決的辦法:web
經過python+selenium到豆瓣抓取圖片,能夠直接把圖片地址保存下來,也能夠直接下載圖片。sql
三、腳本解析:(這裏沒有弄成項目,直接寫的一個腳本)chrome
腳本包含2個類,一個是數據庫操做類,一個是圖片處理類數據庫
(1)圖片處理類:提供獲取圖片地址的方法、保存圖片地址到數據庫、下載圖片到本地app
(2)數據庫操做類:提供了鏈接數據庫,插入數據、查詢數據等方法,這裏只用到了插入數據和關閉鏈接池的方法。dom
(3)excel操做類:isbn放在excel裏面,從excel中讀取isbn。fetch
(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()
四、腳本擴展:
能夠直接把isbn經過txt或者excel讀取,而後獲取圖片。
以前的文章已經涉及到excel的讀取,這裏就再也不重複了。