走過路過不要錯過,學不會沒關係,長點見識也是可以的啦。
簡介
博主於17年開始自學的python, 期間做過各個領域的python開發,包括爬蟲
, web
, 硬件
, 桌面應用
, AI
, 數據分析
。
可能有人會問python能做硬件開發?可自行搜索pyboard
丶樹莓派
丶MicroPython
, 描述python最有精髓的一句話: python 除了不能生孩子, 啥都能幹。
通過該篇文章,讀者可以發現爬蟲入門並不難,還可以知道那些大學生網絡刷視頻課程的實現原理,以及搶票工具的實現原理,並且可以自己動手編寫一個簡單爬蟲。當然入門容易, 出來未並容易。
其實很多東西看似難,其實很容易,你覺得難的原因僅僅是因爲你不知道它的原理, 奉勸讀者學習的過程中多瞭解一下實現原理, 這也是我切身體會。
本質
- 爬蟲是一種獲取網絡信息的腳本,方便幫助人們快速的丶大量的從網絡上的獲取一些信息。
- 簡單地說,比如你在一個網站上看到很多壞壞的圖,你好喜歡,想下載下來,但是一個個點太費勁了,如果你是個妹子,或許能喊來一羣甜 dog幫你。
- 但是像博主這種沒人疼, 沒人愛的單身dog, 只能靠自己的雙手了,三下五除二, 擼了一段代碼搞定,代碼如下:
- 代碼呢? 年輕人做事不能這麼着急,慢慢來嘛, 討厭。心急吃不了熱豆腐。
- 緊接着,博主繼續闡述爬蟲的本質。上文說到爬蟲是自動化獲取網絡信息的腳本。, 那麼腳本操作的本質又是啥? 要知道腳本的操作本質,那麼得知道你操作瀏覽器時,人家瀏覽器是怎麼操作的,例如:
-
當你點擊一個頁面的時候,客戶端瀏覽器向指定的服務器發送一個
GET
請求,服務端接受到該請求之後便會返回響應內容,客戶端瀏覽器接受到響應內容便會進行解析渲染,此時你就看到了頁面上的內容。這期間還涉及客戶端是如何找到服務端的(DNS協議), 客戶端跟服務端是如何通信的(TCP協議), 這兩個協議這裏就不作解析了,再說就超綱了,博主是一個正直的男人(單身,劃重點),違背倫理道德的事我不幹,可以自行和百度老師好好深入交流。 -
當你想點讚我的文章時候,此時萬惡的瀏覽器告訴你(其實罪魁禍首是服務器端代碼),需要登錄,你拒絕登錄的話,那麼我就損失了一個贊,所以你還是行行好,登錄一下點贊吧, 你是個好人。
在登錄的時候,發現你沒有註冊,不管註冊還是登錄,你需要在瀏覽器輸入賬號密碼(掃碼登錄), 當你操作完成之後點登錄,客戶端瀏覽器會向服務端發送一個POST請求進行操作,服務端會進行一系列的操作然後響應給客戶端,客戶端瀏覽器會彈出提示告訴你操作狀態(登錄成功, 或者失敗)。GET請求和POST請求有什麼不同? GET請求的內容實體會帶在網址的後面,POST請求的內容實體會帶在請求體裏面。還有XXX, 不告訴你(百度)。 -
瞭解了請求的GET和POST,對於本篇文章已經夠用了(還有PUT,DELETE,OPTION), 如果想深入瞭解的可以百度搜索:
詳解HTTP請求
, 寫太深入就沒人看了。
-
- 網絡刷課,搶票軟件,刷文章訪問量等軟件的實現原理也是基於網絡請求的操作,只不過很多站點會增加一些反爬蟲機制,如ip限制,登錄加密,操作內容體加密,當然這些也是可以搞定的。
Python
也不知道我的讀者有沒有學過python, 甚至可能沒有學過編程,但是沒關係,很簡單的。
接下來,帶你如何快速入門python:
由於一篇文章的篇幅有限, 請自行查找python入門教程, 如果覺得不夠騷,可以私信我寫。
本人就是網上悶騷男, 網下靦腆男。
實戰
-
各位看官,現在又到了緊張的實戰環節, 我狂鐵賊六,又狂又頭鐵, 進可一打五,退可六分投。
-
首先介紹兩個Python的三方模塊
requests
,BeautifulSoup
。 -
入門教程從簡, 以一個鬥圖網的表情包套圖頁面爲例,實現該頁面下所有圖片的下載, 點我查看網頁。
-
先通過requests模塊獲取網頁文本數據:
import requests # 導入模塊 def get_html_text(url): # 獲取html文本內容 """ 獲取html文本 :param url: :return: """ return requests.get(url).text # 這裏通過GET請求拿到返回的網頁文本內容 if __name__ == '__main__': url = 'http://www.bbsnet.com/xiongmaoren-18.html' html_text = get_html_text(url) print(html_text)
-
分析網頁結構,鼠標對準圖片,右鍵點檢查元素, 如圖:
在右圖中可以看到,所有的圖片均包含在id=post_content
的div標籤裏面, 然後其下面是一些p標籤,img中src有圖片的鏈接,點進去可以直接看到一張圖片。
現在要做的事情,就是提取這些圖片鏈接,再通過GET請求和文件操作進行圖片的保存。 -
用BeautifouSoup查找這些圖片的鏈接地址, 定義一個函數來完成這件事情:
def get_images_urls(html_text): """ 獲取圖片鏈接 :param html_text: :return: """ urls = [] # 保存提取的url列表 soup = BeautifulSoup(html_text, 'html.parser') # 創建一個soup對象,可以打印出來看看裏面的內容 div_tag = soup.find('div', {'id': 'post_content'}) # 查找id=post_content的標籤 img_tag_list = div_tag.find_all_next('img') # 查找div下面的所有img標籤 for img_tag in img_tag_list[:-4]: # 觀察找到結果發現從倒數第四個開始並不是表情包,所以只迭代到倒數第四個 url = img_tag.attrs['src'] # 提取img標題的src元素的值 urls.append(url) return urls
-
然後需要定義一段代碼,來完成圖片的保存, 如下:
def save_images(dir, urls): """ 保存圖片 :param urls: :return: """ if not os.path.exists(dir): # 使用os模塊來判斷文件夾是否存在,不存在則創建 os.makedirs(dir) count = 1 for url in urls: print('正在下載第{}張圖片...'.format(str(count))) ext = url.split('.')[-1] # 拿到圖片的擴展名 filename = dir + '/' + str(count) + '.' + ext # 拼接圖片的存儲路徑 content = requests.get(url).content # 通過GET請求獲取圖片的二進制內容,注意拿網頁源碼時候是text with open(filename, 'wb') as f: # 已寫二進制的形式打開文件 f.write(content) # 將圖片內容寫入 count += 1 # count 用於圖片命名和計數,遞增1
-
代碼運行結果:
-
這時候就會有槓精說: 這一頁不就15個圖片嘛,我點幾下就完事了,寫個代碼時間還比較長時間。又或者有虛心向學者問: 怎樣爬取整個網站的圖片或者某一分類下所有的圖片。那麼已鬥圖表情包分類下的圖片爲例子, 參照之前講述的步驟, 看下網頁結構:
可以看到右側我圈紅的框內容包含了一些li標籤,li標籤對應的就算每一個封面圖, 我們要找到的就是藍錢畫出來的url,對應之前代碼的url, 只要我們把這些url都找出來,再調用我們之前的代碼就可以下載所有的圖片了, 當然這裏還涉及分頁, 分頁的操作方法也是一樣的,只要我們把下一頁的鏈接找出來,再進行訪問,直到找不到下一頁爲止。 -
貼上爬取單個頁面的完整代碼,爬取分類的讀者自己琢磨怎麼去實現。
# _*_coding:utf8_*_ # Project: spider # File: main.py # Author: ClassmateLin # Email: [email protected] # 有項目的可以滴滴我, Python/Java/PHP/Go均可。WX: ClassmateYue # Time: 2020/2/21 4:54 下午 # DESC: import requests import os from bs4 import BeautifulSoup def get_html_text(url): """ 獲取html文本 :param url: :return: """ return requests.get(url).text def get_images_urls(html_text): """ 獲取圖片鏈接 :param html_text: :return: """ urls = [] # 保存提取的url列表 soup = BeautifulSoup(html_text, 'html.parser') # 創建一個soup對象,可以打印出來看看裏面的內容 div_tag = soup.find('div', {'id': 'post_content'}) # 查找id=post_content的標籤 img_tag_list = div_tag.find_all_next('img') # 查找div下面的所有img標籤 for img_tag in img_tag_list[:-4]: # 觀察找到結果發現從倒數第四個開始並不是表情包,所以只迭代到倒數第四個 url = img_tag.attrs['src'] # 提取img標題的src元素的值 urls.append(url) return urls def save_images(dir, urls): """ 保存圖片 :param urls: :return: """ if not os.path.exists(dir): # 使用os模塊來判斷文件夾是否存在,不存在則創建 os.makedirs(dir) count = 1 for url in urls: print('正在下載第{}張圖片...'.format(str(count))) ext = url.split('.')[-1] # 拿到圖片的擴展名 filename = dir + '/' + str(count) + '.' + ext # 拼接圖片的存儲路徑 content = requests.get(url).content # 通過GET請求獲取圖片的二進制內容,注意拿網頁源碼時候是text with open(filename, 'wb') as f: # 已寫二進制的形式打開文件 f.write(content) # 將圖片內容寫入 count += 1 # count 用於圖片命名和計數,遞增1 if __name__ == '__main__': url = 'http://www.bbsnet.com/xiongmaoren-18.html' html_text = get_html_text(url) image_urls = get_images_urls(html_text) save_images('./images', image_urls)
-
博客已遷移至, 這裏,快點我
說明
- 讀完這篇文章,你應該對爬蟲有一定的瞭解了, 能夠舉一反三當然是最好了。
- 本文示例的爬蟲是最簡單,沒有任何反爬蟲機制,想知道反爬蟲機制有哪些的,可以自行百度瞭解。
- 本文示例爬蟲是html文本形式的解析,有些網站會用javascript動態生成網頁,直播彈幕的爬蟲需要分析websockt。
- 網絡刷課丶搶票軟件及各種腳本的實現, 都是通過模擬這些網絡請求來進行操作的,只不過有些需要登錄丶或者有加密方式,app軟件爬蟲丶前後端分離站點需要對接口進行抓包分析。例如我Github上刷訪問量的代碼,點我查看。
- 爬蟲難點不在於實現,而是在於分析,只要你分析到位了,寫腳本就是簡簡單單的。
- 這裏演示的是沒有采用框架的實現,有很多爬蟲框架使得爬蟲實現更爲容易, 如Scrapy。有些網站需要javascript動態生成網頁的,那麼可以用selenium庫來操作chrome等瀏覽器,實質上是爲了拿到html純文本進行數據的提取, 例如我Github這份代碼進行百度SEO使用的就算selenium庫,點我查看。
- 該實例實現的是單線程的,在數據量龐大的時候根本處理不過來,可以使用多線程丶多進程丶協程來進行操作。例如協程庫:aiohttp, 可以點擊參考我這篇文章。
"""
# _*_coding:utf8_*_
在這裏順便給大家免費發點福利,
2020年最新python開發丶爬蟲丶數據分析等視頻教.程資料
+QQ羣 904474519 羣文件自己下載哦,還可跟老司機討論問題
"""
print("Hello World!")