python爬蟲—爬取英文名以及正則表達式的介紹
爬取英文名:
一. 爬蟲模塊詳細設計
(1)整體思路
對於本次爬取英文名數據的爬蟲實現,我的思路是先將A-Z所有英文名的連接爬取出來,保存在一個csv文件中;再讀取csv文件當中的每個英文名鏈接,采用循環的方法讀取每一個英文名鏈接,根據每個英文名鏈接爬取每個鏈接中的數據,保存在新的csv文件當中。
需要寫一個爬取英文名鏈接的函數、將爬取的內容保存在csv文件的函數以及讀取csv文件內容的函數、爬取英文名詳情頁內容的函數。
表5.3.1
函數名 |
作用 |
def get_nameLink(): |
爬取英文名鏈接 |
def save_to_csv(dict,filename): |
將爬取的內容以字典的形式保存在csv文件 |
def get_WebLinkcsv(name): |
讀取csv文件的內容 |
def get_namedata(): |
根據鏈接爬取每個英文名的具體數據 |
(2)爬取英文名鏈接
首先觀察A-Z英文名的網頁的內容,發現每個字母都對應一個網站,剛打開網站只會顯示三個模塊的英文名,每個模塊30個英文名;關於一個字母的更多的英文名是根據鼠標的移動再進行動態的加載才會在網頁上顯示出來;但每個字母的英文名不同的網頁上顯示。如圖:
經觀察,每個字母的所有英文名都可以根據頁數來確定,可以不用動態爬取的方法,根據觀察每個字母的英文名頁數來確定每個字母英文名的數量進行爬取鏈接。鏈接格式為:
https://www.thebump.com/b/baby-girl-names-that-start-with-{letter}?sort_by=popular&page={number}&page_size=30&gender=&request-by-ajax=true
Letter表示A-Z的字母,number表示頁數,page_size表示每個頁面所顯示的英文名數量為30個。
代碼如下:
(3) 爬取詳情頁
打開某個英文名對應的詳情頁,右鍵點開查看需要爬取內容的審查元素,觀察每個模塊內容所對應的標簽進行解析。經觀察,有的英文名存在Celebrity模塊,有的英文名不存在Celebrity模塊,就需要進行判斷,若存在就解析保存在csv文件中,不存在顯示為空跳過,繼續解析下一個內容。如圖:
Abigail名字中就有Celebrity模塊的內容,Annabelle名字中就沒有這個Celebrity中的內容,這種情況下,就會存入空的內容。
代碼如下:
采用try except進行異常處理。
(4)存儲內容
采用字典的形式存入內容保存在csv文件當中。字典(dictionary)是Python中另一個非常有用的內置數據類型,列表是有序的對象結合,字典是無序的對象集合。兩者之間的區別在於:字典當中的元素是通過鍵來存取的,而不是通過偏移存取;字典是一種映射類型,字典用“{ }”標識,它是一個無序的鍵(key)、值(value)對集合,鍵(key)必須使用不可變類型。
def save_to_csv(dict,filename)函數表示存儲數據,使用字典形式存儲,因為本次實驗數據較大,不能一次性爬取,所以在爬取內容的時候都是分開爬的,對於數據的存儲也是采用追加的方式進行存取的。
如圖:
(5)讀取文件
讀取文件主要是用來讀取名字鏈接,根據名字鏈接進行詳情頁的爬取
二. 調試與測試
(1) 調試過程中遇到的問題
(1)在爬取關於A的英文名鏈接的時候,只出現了90個鏈接,剩下的爬不出來,但在網頁中剩下的英文名可以根據鼠標的滑動進行加載出現在網頁中,經觀察可以根據此鏈接https://www.thebump.com/b/baby-girl-names-that-start-with-{letter}?sort_by=popular&page={number}&page_size=30&gender=&request-by-ajax=true,進行獲取每個英文名的爬取以及對每個字母的英文名數量進行確認;用此url形式就相當於是進行翻頁操作,每一頁只有30個英文名。
(2)在運行的過程中會顯示縮緊錯誤,但在觀察過程中,並沒有縮進的錯誤,在網上查詢得只是因為在定義一個函數時,函數里面沒有內容才會報此錯誤。
(3)在進行幾次爬取過程中,會經常在某一個固定的地方停止爬取,經多次修改,最終發現是請求頭的問題。
(2)爬取顯示
爬取的內容會保存在csv文件當中,如圖:
三 課程設計心得與體會
(1) 通過這次課程設計,使我更加扎實的掌握了有關Python方面的知識,在設計過程中,雖然遇到了一些問題,但經過一次又一次的思考,一遍又一遍的檢查終於找出了原因所在,也暴露出了前期我在這方面的知識欠缺以及經驗不足。實踐出真知,通過親自動手設計,使我們找你哥我的知識不再是紙上談兵。
(2) 過而能改,善莫大焉。在課程設計過程中,我們不斷發現錯誤,不斷改正,不斷領悟,不斷獲取。最終的檢測調試環節,本身就是在實踐“過而能改,善莫大焉”的知行觀。這次的課程設計終於順利完成了,在設計中遇到了很多問題,最后在同學們的幫助下迎刃而解,這也告訴我們,在今后的社會發展和學習實踐過程中,一定要不懈努力,不能遇到問題就想到要退縮,一定要不厭其煩的發現問題所在,然后一一解決,只有這樣才能成功的做成想做的事,才能在今后的道路上披荊斬棘,而不是知難而退,那樣永遠不可能收獲成功,收獲喜悅,也永遠不可能得到社會及他人的認可。
(3) 課程設計誠然是一門專業課,給我很多專業知識以及專業技能上的提升,同時又是一門思辨課,給了我許多道,很多思。是我對抽象理論有了具體的認識。通過這次課程設計,我對正則表達式有了更深一步的理解運用,通過查詢資料也了解了Python的爬蟲原理。我認為,在這學期的實驗中,不僅培養了獨立思考、動手操作能力,在各種其他能力上也都有了提高。更重要的是,在課程設計學習中,我學會了很多學習方法,而這是日后最實用的,真的是受益匪淺。要面對社會的挑戰,只有不斷的學習、實踐。在學習、在實踐。這對於我們的將來也有很大的幫助。
正則表達式:
一:什么是正則表達式
正則表達式,又稱規則表達式,通常被用來檢索、替換那些符合某個模式(規則)的文本。
正則表達式是對字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規則字符串”,這個“規則字符串”用來表達對字符串的一種過濾邏輯。
給定一個正則表達式和另一個字符串,我們可以達到如下的目的:
- 給定的字符串是否符合正則表達式的過濾邏輯(“匹配”);
- 通過正則表達式,從文本字符串中獲取我們想要的特定部分(“過濾”)。
二:爬蟲的四個主要步驟
- 明確目標 (要知道你准備在哪個范圍或者網站去搜索)
- 爬 (將所有的網站的內容全部爬下來)
- 取 (過濾和匹配我們需要的數據,去掉沒用的數據)
- 處理數據(按照我們想要的方式存儲和使用)
三:正則表達式匹配規則
元字符 | 說明 |
---|---|
. | 代表任意字符 |
\ | |
[ ] | 匹配內部的任一字符或子表達式 |
[^] | 對字符集和取非 |
- | 定義一個區間 |
\ | 對下一字符取非(通常是普通變特殊,特殊變普通) |
* | 匹配前面的字符或者子表達式0次或多次 |
*? | 惰性匹配上一個 |
+ | 匹配前一個字符或子表達式一次或多次 |
+? | 惰性匹配上一個 |
? | 匹配前一個字符或子表達式0次或1次重復 |
{n} | 匹配前一個字符或子表達式 |
{m,n} | 匹配前一個字符或子表達式至少m次至多n次 |
{n,} | 匹配前一個字符或者子表達式至少n次 |
{n,}? | 前一個的惰性匹配 |
^ | 匹配字符串的開頭 |
\A | 匹配字符串開頭 |
$ | 匹配字符串結束 |
[\b] | 退格字符 |
\c | 匹配一個控制字符 |
\d | 匹配任意數字 |
\D | 匹配數字以外的字符 |
\t | 匹配制表符 |
\w | 匹配任意數字字母下划線 |
\W | 不匹配數字字母下划線 |
四.正則表達式例子
學習基礎的例子,可以參見博客,個人覺得比較詳細:https://blog.csdn.net/weixin_44258187/article/details/85307979