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
|