目錄
Hello!大家好,我是努力賺錢買生髮水的灰小猿,很多學習了Python的小夥伴都希望可以擁有一條屬於自己的爬蟲,所以今天大灰狼就來和小夥伴們分享一下簡單的爬蟲程序編寫。
允許我在這裏爲小夥伴們賣一下關子哈。
什麼是網絡爬蟲?
所謂網絡爬蟲,簡單來說,就是通過程序來打開特定的網頁並且爬取網頁上存在的某些信息。想象一下,把一個網頁比作一片田地的話,爬蟲就是生活在這片田地裏,從田頭爬到田尾,並且只捕食這片田地上某一類食物的昆蟲。哈哈,比喻有些糙,但網絡爬蟲的實際作用也就跟這個差不多啦。
想深入瞭解的小夥伴也可以看我的這篇文章“Python一分鐘帶你探祕不爲人知的網絡昆蟲!”啦!
爬蟲的原理是什麼?
那可能有小夥伴就問了,爬蟲程序是如何工作的呢?
舉個栗子:
我們所看到的所有的網頁都是由特定的代碼組成的,這些代碼中涵蓋了這個網頁中所存在的所有信息,在我們打開某一個網頁的時候,按F12鍵就可以看到這個網頁的代碼了,我們以百度圖片搜索皮卡丘的網頁爲例,按F12後,就可以看到如下的涵蓋整個網頁所有內容的代碼了。
以一條爬取“皮卡丘圖片”的爬蟲爲例,我們的爬蟲要爬取這個網頁上所有的皮卡丘圖片,所以我們的爬蟲要做的就是,找到這個網頁的代碼中包括皮卡丘圖片的鏈接,並且將這個鏈接下的圖片下載。
所以爬蟲的工作原理就是從網頁的代碼中找到並提取出特定的代碼,就好比從一個很長的字符串中找到特定格式的字符串是一樣的,對這一塊知識感興趣的小夥伴也可以閱讀我的這篇文章“Python實戰之特定文本提取,挑戰高效辦公的第一步”,
瞭解了以上兩點之後,就是如何去編寫這樣一條爬蟲了。
Python爬蟲常用的第三方模塊有urllib2和requests,大灰狼個人認爲urllib2模塊要比requests模塊複雜些,所以在這裏以requests模塊爲例來編寫爬蟲程序。
以爬取百度皮卡丘圖片爲例。
根據爬蟲的原理,我們的爬蟲程序要做的依次是:
- 獲取百度圖片中“皮卡丘圖片”的網頁鏈接
- 獲取該網頁的全部代碼
- 查找代碼中圖片的鏈接
- 根據圖片鏈接寫出通用的正則表達式
- 通過設定的正則表達式匹配代碼中所有符合要求的圖片鏈接
- 逐個打開圖片鏈接並將圖片下載
接下來大灰狼就根據上面的步驟爲大家分享一下這條爬蟲的編寫:
1、獲取百度圖片中“皮卡丘圖片”的網頁鏈接
首先我們打開百度圖片的網頁鏈接https://image.baidu.com/
之後再打開關鍵字搜索“皮卡丘”後的鏈接
對比一下,剔除多餘部分,我們就可以得到百度圖片關鍵詞搜索的通用鏈接長這樣:http://image.baidu.com/search/index?tn=baiduimage&word=關鍵字
現在我們的第一步獲取百度圖片中“皮卡丘圖片”的網頁鏈接已經完成了,接下來就是獲取該網頁的全部代碼
2、獲取該網頁的全部代碼
這個時候,我們可以先使用requests模塊下的get()函數打開該鏈接
然後通過模塊中的text函數獲取到網頁的文本,也就是全部的代碼。
url = "http://image.baidu.com/search/index?tn=baiduimage&word=皮卡丘"
urls = requests.get(url) #打開鏈接
urltext = urls.text #獲取鏈接文本
3、查找代碼中圖片的鏈接
這一步我們可以先打開該網頁鏈接,按照最開始大灰狼說的方法按下F12查看該網頁的全部代碼,然後如果說我們要爬取全部的jpg格式的圖片,我們可以再按下Ctrl+F查找特定內容的代碼,
如我們在該網頁的代碼中找到帶有jpg的代碼,然後找到類似於下圖這樣的代碼,
其中的鏈接就是我們要獲取到內容,我們仔細觀察這幾個鏈接就會發現它們的相同之處,也就是它們每一個鏈接前都會有”OpjURL”:進行提示,最後以”進行結尾,
並且我們拿出其中一個鏈接
http://dnptystore.qbox.me/p/chapter/attachment/EgfSetvEt-/Eg6s4gEwet2We_MVe_2SeTuDGN95Gb9ugvMq972t5c9heCmc9mH26_b.jpg
進行訪問,發現也是可以打開該圖片的。
所以我們就可以暫時的推斷出百度圖片中jpg圖片的通用格式爲“”OpjURL”:XXXX””,
4、根據圖片鏈接寫出通用的正則表達式
現在我們已經知道了該類型圖片的通用格式爲“”OpjURL”:XXXX””,那麼接下來就是根據該格式進行正則表達式的書寫。
urlre = re.compile('"objURL":"(.*?)"', re.S)
# 其中re.S的作用是讓正則表達式中的“.”可以匹配所有的“\n”換行符。
對正則表達式使用不了解的小夥伴也可以看我的這兩篇文章“Python教程之正則表達式(基礎篇)”和“Python教程之正則表達式(提高篇)”
5、通過設定的正則表達式匹配代碼中所有符合要求的圖片鏈接
我們在上面已經寫好了圖片鏈接的正則表達式,接下來就是通過該正則表達式對全部代碼進行匹配了,並且獲取到所有鏈接的列表
urllist = re.findall(urltext)
#獲取到圖片鏈接的列表,其中的urltext爲整個頁面的全部代碼,
接下來我們用幾行代碼對我們通過正在表達式匹配到的圖片鏈接進行一下驗證,將匹配到的所有鏈接寫入txt文件:
with open("1.txt", "w") as txt:
for i in urllist:
txt.write(i + "\n")
之後我們在這個文件下就可以看到已經匹配到的圖片鏈接,隨便複製一個都是可以打開的。
6、逐個打開圖片鏈接並將圖片下載
現在我們已經將所有的圖片的鏈接存放到了列表之中,接下來就是將圖片下載即可。
基本思路是:通過for循環遍歷列表中的所有鏈接,以二進制的方式打開該鏈接,新建一個.jpg文件,將我們的圖片以二進制的形式寫入該文件。
在這裏我們爲了避免下載過快,在每次下載前休眠三秒鐘,並且每個鏈接的訪問時間最多爲5秒,如果超過五秒的訪問時間,我們就判定下載失敗,繼續下載下一章圖片。
至於爲什麼以二進制的方式打開和寫入圖片,是因爲我們的圖片需要先用二進制的方式進行解析,然後才能被計算機寫入。
下載圖片的代碼如下,下載張數設定爲3張:
i = 0
for urlimg in urllist:
time.sleep(3) # 程序休眠三秒
img = requests.get(urlimg, timeout = 5).content # 以二進制形式打開圖片鏈接
if img:
with open(str(i) + ".jpg", "wb") as imgs: # 新建一個jpg文件,以二進制寫入
print("正在下載第%s張圖片 %s" % (str(i+1), urlimg))
imgs.write(img) #將圖片寫入
i += 1
if i == 3: #爲了避免無限下載,在這裏設定下載圖片爲3張
break
else:
print("下載失敗!")
現在,一個簡單的爬取百度皮卡丘圖片的爬蟲就完成了,小夥伴也可以任意更改圖片關鍵字和下載張數,培養一隻屬於自己的爬蟲。
最後附上完整源碼:
import requests
import re
import time
url = "http://image.baidu.com/search/index?tn=baiduimage&word=皮卡丘"
urls = requests.get(url) # 打開鏈接
urltext = urls.text # 獲取鏈接全部文本
urlre = re.compile('"objURL":"(.*?)"', re.S) # 書寫正則表達式
urllist = urlre.findall(urltext) # 通過正則進行匹配
with open("1.txt", "w") as txt: # 將匹配到的鏈接寫入文件
for i in urllist:
txt.write(i + "\n")
i = 0
# 循環遍歷列表並下載圖片
for urlimg in urllist:
time.sleep(3) # 程序休眠三秒
img = requests.get(urlimg, timeout = 5).content # 以二進制形式打開圖片鏈接
if img:
with open(str(i) + ".jpg", "wb") as imgs: # 新建一個jpg文件,以二進制寫入
print("正在下載第%s張圖片 %s" % (str(i+1), urlimg))
imgs.write(img) #將圖片寫入
i += 1
if i == 3: #爲了避免無限下載,在這裏設定下載圖片爲3張
break
else:
print("下載失敗!")
print("下載完畢!")
覺得有用記得點贊關注喲!
同時你也可以關注我的微信公衆號“灰狼洞主”,回覆 “Python筆記”獲取Python從入門到精通筆記分享和常用函數方法速查手冊!
大灰狼期待與你一同進步!