Python爬蟲實戰 批量下載高清美女圖片

2021-03-06 Python學習交流樂園

彼岸圖網站裡有大量的高清圖片素材和壁紙,並且可以免費下載,讀者也可以根據自己需要爬取其他類型圖片,方法是類似的,本文通過python爬蟲批量下載網站裡的高清美女圖片,熟悉python寫爬蟲的基本方法:發送請求、獲取響應、解析並提取數據、保存到本地。

很多人學習python,不知道從何學起。

很多人學習python,掌握了基本語法過後,不知道在哪裡尋找案例上手。

很多已經做案例的人,卻不知道如何去學習更加高深的知識。

那麼針對這三類人,我給大家提供一個好的學習平臺,免費領取視頻教程,電子書籍,以及課程的原始碼!

QQ群:101677771

目標url:http://pic.netbian.com/4kmeinv/index.html

1. 爬取一頁的圖片正則匹配提取圖片數據

網頁原始碼部分截圖如下:


重新設置GBK編碼解決了亂碼問題

代碼實現:

import requests
import re

# 設置保存路徑
path = r'D:\test\picture_1\ '
# 目標url
url = "http://pic.netbian.com/4kmeinv/index.html"
# 偽裝請求頭 防止被反爬
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1",
"Referer": "http://pic.netbian.com/4kmeinv/index.html"
}

# 發送請求 獲取響應
response = requests.get(url, headers=headers)
# 列印網頁原始碼來看 亂碼 重新設置編碼解決編碼問題
# 內容正常顯示 便於之後提取數據
response.encoding = 'GBK'

# 正則匹配提取想要的數據 得到圖片連結和名稱
img_info = re.findall('img src="(.*?)" alt="(.*?)" /', response.text)

for src, name in img_info:
img_url = 'http://pic.netbian.com' + src # 加上 'http://pic.netbian.com'才是真正的圖片url
img_content = requests.get(img_url, headers=headers).content
img_name = name + '.jpg'
with open(path + img_name, 'wb') as f: # 圖片保存到本地
print(f"正在為您下載圖片:{img_name}")
f.write(img_content)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

Xpath定位提取圖片數據


檢查分析網頁可以找到圖片的連結和名稱的Xpath路徑,寫出xpath表達式定位提取出想要的圖片數據,但得到的每個圖片的src前面需要都加上 『http://pic.netbian.com』 得到的才是圖片真正的url,可以用列表推導式一行代碼實現。

代碼實現:

import requests
from lxml import etree

# 設置保存路徑
path = r'D:\test\picture_1\ '
# 目標url
url = "http://pic.netbian.com/4kmeinv/index.html"
# 偽裝請求頭 防止被反爬
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1",
"Referer": "http://pic.netbian.com/4kmeinv/index.html"
}

# 發送請求 獲取響應
response = requests.get(url, headers=headers)
# 列印網頁原始碼來看 亂碼 重新設置編碼解決編碼問題
# 內容正常顯示 便於之後提取數據
response.encoding = 'GBK'
html = etree.HTML(response.text)
# xpath定位提取想要的數據 得到圖片連結和名稱
img_src = html.xpath('//ul[@class="clearfix"]/li/a/img/@src')
# 列表推導式 得到真正的圖片url
img_src = ['http://pic.netbian.com' + x for x in img_src]
img_alt = html.xpath('//ul[@class="clearfix"]/li/a/img/@alt')

for src, name in zip(img_src, img_alt):
img_content = requests.get(src, headers=headers).content
img_name = name + '.jpg'
with open(path + img_name, 'wb') as f: # 圖片保存到本地
print(f"正在為您下載圖片:{img_name}")
f.write(img_content)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

2.翻頁爬取,實現批量下載

手動翻頁分析規律
第一頁:http://pic.netbian.com/4kmeinv/index.html
第二頁:http://pic.netbian.com/4kmeinv/index_2.html
第三頁:http://pic.netbian.com/4kmeinv/index_3.html
最後一頁:http://pic.netbian.com/4kmeinv/index_161.html
分析發現除第一頁比較特殊,之後的頁面都有規律,可以用列表推導式生成url列表,遍歷url列表裡的連結,進行請求,可實現翻頁爬取圖片。

單線程版

import requests
from lxml import etree
import datetime
import time

# 設置保存路徑
path = r'D:\test\picture_1\ '
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1",
"Referer": "http://pic.netbian.com/4kmeinv/index.html"
}
start = datetime.datetime.now()

def get_img(urls):
for url in urls:
# 發送請求 獲取響應
response = requests.get(url, headers=headers)
# 列印網頁原始碼來看 亂碼 重新設置編碼解決編碼問題
# 內容正常顯示 便於之後提取數據
response.encoding = 'GBK'
html = etree.HTML(response.text)
# xpath定位提取想要的數據 得到圖片連結和名稱
img_src = html.xpath('//ul[@class="clearfix"]/li/a/img/@src')
# 列表推導式 得到真正的圖片url
img_src = ['http://pic.netbian.com' + x for x in img_src]
img_alt = html.xpath('//ul[@class="clearfix"]/li/a/img/@alt')
for src, name in zip(img_src, img_alt):
img_content = requests.get(src, headers=headers).content
img_name = name + '.jpg'
with open(path + img_name, 'wb') as f: # 圖片保存到本地
# print(f"正在為您下載圖片:{img_name}")
f.write(img_content)
time.sleep(1)

def main():
# 要請求的url列表
url_list = ['http://pic.netbian.com/4kmeinv/index.html'] + [f'http://pic.netbian.com/4kmeinv/index_{i}.html' for i in range(2, 11)]
get_img(url_list)
delta = (datetime.datetime.now() - start).total_seconds()
print(f"抓取10頁圖片用時:{delta}s")

if __name__ == '__main__':
main()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

程序運行成功,抓取了10頁的圖片,共210張,用時63.682837s。

多線程版

import requests
from lxml import etree
import datetime
import time
import random
from concurrent.futures import ThreadPoolExecutor

# 設置保存路徑
path = r'D:\test\picture_1\ '
user_agent = [
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
"Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
]
start = datetime.datetime.now()

def get_img(url):
headers = {
"User-Agent": random.choice(user_agent),
"Referer": "http://pic.netbian.com/4kmeinv/index.html"
}
# 發送請求 獲取響應
response = requests.get(url, headers=headers)
# 列印網頁原始碼來看 亂碼 重新設置編碼解決編碼問題
# 內容正常顯示 便於之後提取數據
response.encoding = 'GBK'
html = etree.HTML(response.text)
# xpath定位提取想要的數據 得到圖片連結和名稱
img_src = html.xpath('//ul[@class="clearfix"]/li/a/img/@src')
# 列表推導式 得到真正的圖片url
img_src = ['http://pic.netbian.com' + x for x in img_src]
img_alt = html.xpath('//ul[@class="clearfix"]/li/a/img/@alt')
for src, name in zip(img_src, img_alt):
img_content = requests.get(src, headers=headers).content
img_name = name + '.jpg'
with open(path + img_name, 'wb') as f: # 圖片保存到本地
# print(f"正在為您下載圖片:{img_name}")
f.write(img_content)
time.sleep(random.randint(1, 2))

def main():
# 要請求的url列表
url_list = ['http://pic.netbian.com/4kmeinv/index.html'] + [f'http://pic.netbian.com/4kmeinv/index_{i}.html' for i in range(2, 51)]
with ThreadPoolExecutor(max_workers=6) as executor:
executor.map(get_img, url_list)
delta = (datetime.datetime.now() - start).total_seconds()
print(f"爬取50頁圖片用時:{delta}s")

if __name__ == '__main__':
main()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

程序運行成功,抓取了50頁圖片,共1047張,用時56.71979s。開多線程大大提高的爬取數據的效率。

最終成果如下:

3. 其他說明

相關焦點

  • 18個Python爬蟲實戰案例(已開源)
    點擊上方「Python技術之巔」,馬上關注,每天下午17:40準時推送目錄爬蟲小工具爬蟲實戰筆趣看小說下載VIP視頻下載百度文庫文章下載_rev1百度文庫文章下載_rev2《帥啊》網帥哥圖片下載構建代理IP池
  • python網頁爬蟲實戰:PEER資料庫地震波批量下載
    python大火的原因得益於簡單易懂的語句結構和豐富強大的功能包。隨著人工智慧、機器學習和大數據科學日益興起和火爆,python迅速進入大眾視野,甚至推動了少兒編程。地震工程同樣是一門基於大數據的科學,全球數以萬計的學者的研究資料和時刻發生的地震的地面運動數據構成了極其龐大的資料庫。因此,python可以幫助從事地震工程研究的學者輕鬆愉快地獲得大量數據。
  • python爬蟲百度搜索圖片
    根據需求:需要爬去百度搜索的圖片使用python語言實現,直接貼代碼:
  • 廖雪峰老師的Python商業爬蟲課程 Python網絡爬蟲實戰教程 體會不一樣的Python爬蟲課程
    :1個├─(50) 20181209.zip(30)\資料\3\第五節;目錄中文件數:1個├─(51) python二期12.16.zip(31)\資料\3\第八節;目錄中文件數:1個├─(52) python二期12.20.zip(32)\資料\3\第六節;目錄中文件數:1個├─(53) python二期12.19.zip(33)\資料
  • 在知乎上學 Python - 爬蟲篇
    在這個過程中,會遇到很多難題,許多小夥伴都會去尋找答案,但是因為答案的紛繁複雜和種類多樣,往往要花上好些時間。://www.zhihu.com/question/38801925/answer/184406876(簡介:Python爬蟲方面入門書籍推薦)教程:系列教程:
  • 一小時入門 Python 3 網絡爬蟲
    這就是一個最簡單的爬蟲實例,可能你會問,我只是爬取了這個網頁的HTML信息,有什麼用呢?客官稍安勿躁,接下來進入我們的實戰正文。 三、爬蟲實戰 實戰內容由簡單到複雜,難度逐漸增加,但均屬於入門級難度。下面開始我們的第一個實戰內容:網絡小說下載。 1.
  • Python開發簡單爬蟲【學習資料總結】
    一、簡單爬蟲架構 簡單爬蟲架構 將URL存放在關係型數據中 將URL存儲在緩存資料庫中 三、網頁下載器和urllib2模塊 網頁下載器類似於瀏覽器,會將網際網路對應的網頁以HTML的形式下載到本地,存儲成本地文件或內存字符串,然後進行後續的分析。
  • Python爬蟲實戰教程——爬取xkcd漫畫
    網絡爬蟲(又被稱為網頁蜘蛛,網絡機器人),是一種按照一定的規則,自動地抓取網絡信息的程序或者腳本。4.1 requests安裝requests模塊:pip3 install requests用途:從網絡上下載文件和網頁。
  • Python爬蟲,批量獲取知網文獻信息
    於是,反手寫一個爬蟲,批量獲取基本信息,豈不美哉?在開始這個項目之前,我抱著不重複造輪子的心態,尋思著去Github先找找。結果發現基本上都是幾年前的項目,現在早已不能使用。最後證實了,靠別人不如靠自己,擼起袖子就開幹!1. 爬蟲基礎網絡爬蟲就是模擬瀏覽器發送網絡請求,接收請求響應,一種按照一定的規則,自動地抓取網際網路信息的程序。
  • 從零開始的python爬蟲速成指南
    小夥伴感興趣可以自取~此外,我這還有兩本比較經典的python爬蟲電子書,在微信公眾號【輪子工廠】後臺回復 」爬蟲」 可以領取。Python爬蟲入門七之正則表達式二、爬蟲實戰Python爬蟲實戰一之爬取糗事百科段子Python爬蟲實戰二之爬取百度貼吧帖子Python爬蟲實戰三之實現山東大學無線網絡掉線自動重連Python爬蟲實戰四之抓取淘寶MM照片Python爬蟲實戰五之模擬登錄淘寶並獲取所有訂單Python
  • Python 網絡爬蟲實戰:爬取並下載《電影天堂》3千多部動作片電影
    而且正因為這個爬蟲比較簡單,所以我會寫的稍微細一點,爭取讓 python 小白們也能儘可能看懂,並且能夠在這個爬蟲的基礎上修改,得到爬取這個網站其他板塊或者其他電影網站的爬蟲。 寫在前面的話在編寫爬蟲程序之前,我先捋一捋我們的思路。
  • python爬蟲系列(4)- 提取網頁數據(正則表達式、bs4、xpath)
    python 爬蟲 常見流程.jpg就永恆君使用經驗來說,bs4、xpath比較容易上手但是功能有限,正則比較晦澀難懂但是功能超級強大。我們寫爬蟲最終獲取的數據信息,就是通過_Element 對象的方法來獲取的。
  • Python批量修改圖片尺寸
    任務描述:一個文件夾下面有好多圖片格式是png,大小不一。
  • PYTHON-1 根據excel中的url 批量下載圖片
    學習分享:包括但不限於計算機學習、數學、英語等;影音分享:我個人喜歡的影視作品,以及音樂;今天主要分享我前段時間為了解決批量下載圖片寫的一段python代碼過程。讀取excel文件存儲路徑並讀取文件內容;按照文件中一級分類->二級分類批量創建文件夾,並根據圖片的url下載圖片(for循環+if判斷);代碼示例:import xlrdimport requestsimport numpy as npimport pandas as pdimport
  • 適合新手學習的Python爬蟲書籍
    精通Python網絡爬蟲:核心技術、框架與項目實戰本書從技術、工具與實戰3個維度講解了Python網絡爬蟲:技術維度:詳細講解了Python網絡爬蟲實現的核心技術,包括網絡爬蟲的工作原理、如何用urllib庫編寫網絡爬蟲、爬蟲的異常處理、正則表達式、爬蟲中Cookie的使用、爬蟲的瀏覽器偽裝技術、定向爬取技術、反爬蟲技術,以及如何自己動手編寫網絡爬蟲; 工具維度:以流行的Python網絡爬蟲框架Scrapy為對象,詳細講解了Scrapy的功能使用、高級技巧、架構設計、實現原理,以及如何通過Scrapy來更便捷、高效地編寫網絡爬蟲;實戰維度:以實戰為導向,是本書的主旨
  • 批量下載文獻法寶①——關鍵詞篇
    前兩天,因為要開一個新的課題關於肺癌的,我要看很多相關的文獻,需要批量下載關鍵詞為lung cancer的文獻。但是我用endnote關鍵詞查找,我發現,我的endnote不能點擊查找全文。這可把我愁壞了,但是我Trouble Breaker不是浪得虛名,經過我的不懈探索,終於找到了批量下載文獻的兩法寶。
  • python爬蟲系列(3)- 網頁數據解析(bs4、lxml、Json庫)
    python 爬蟲 常見流程.jpg本文記錄解析網頁bs4、lxml、Json一些常用方法和使用樣板簡介通過requests庫向網站請求網頁,獲得網頁原始碼之後,下一步的工作就需要對網頁代碼進行解析,方便後面的提取工作。永恆君目前常使用的有lxml、bs4、json等庫,本文就記錄一些常用方法,以及一些使用樣板。
  • Python爬蟲從爪巴到爬
    主要內容如下Python環境搭建Requests解析Python靜態請求動態請求批量下載歌曲水軍製作批量評論批量點讚Bilibili如何跨過登錄遊民星空壁紙爬取QQ音樂同城約會數據爬取>課時列表:000 - 課程演示001 - Python爬蟲介紹002 - Python爬蟲課程介紹100 - Anaconda創建環境101 - PyCharm激活102 - 使用PyCharm運行第一個Python程序103 - 回顧爬蟲流程
  • Python爬蟲常用庫之requests詳解
    作者:sergiojune      個人公眾號:日常學python作者好文:Python爬蟲常用庫之
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    scrapy框架及案例 21數據分析 22機器學習 23深度學習 24數據結構和算法 25python網絡爬蟲 26機器學習入門篇 27機器學習入門篇2 28機器學習提升篇 29數據挖掘篇 30深度學習必備原理與實戰 31深度學習必備原理與實戰2