[Python從零到壹] 四.網絡爬蟲之入門基礎及正則表達式抓取博客案例 | 【生長吧!Python】(python從0到1)

      網友投稿 858 2025-03-31

      Python系列整體框架包括基礎語法10篇、網絡爬蟲30篇、可視化分析10篇、機器學習20篇、大數據分析20篇、圖像識別30篇、人工智能40篇、Python安全20篇、其他技巧10篇。您的關注、和轉發就是對秀璋最大的支持,知識無價人有情,希望我們都能在人生路上開心快樂、共同成長。

      https://blog.csdn.net/Eastmount

      https://github.com/eastmountyxz/Python-zero2one

      文章目錄

      一.什么是網絡爬蟲

      二.正則表達式

      1.re模塊

      2.complie方法

      3.match方法

      4.search方法

      5.group和groups方法

      三.Python網絡數據爬取的常用模塊

      1.urllib模塊

      2.urlparse模塊

      四.正則表達式抓取網絡數據的常見方法

      1.抓取標簽間的內容

      2.爬取標簽中的參數

      3.字符串處理及替換

      五.個人博客爬取實例

      1.分析過程

      2.代碼實現

      六.總結

      一.什么是網絡爬蟲

      隨著互聯網的迅速發展,萬維網成為大量信息的載體,越來越多的網民可以通過互聯網獲取所需的信息,同時如何有效地提取并利用這些信息也成為了一個巨大的挑戰。搜索引擎(Search Engine)作為輔助人們檢索信息的工具,它成為了用戶訪問萬維網的入口和工具,常見的搜索引擎比如Google、Yahoo、百度、搜狗等。但是,這些通用性搜索引擎也存在著一定的局限性,比如搜索引擎返回的結果包含大量用戶不關心的網頁;再如它們是基于關鍵字檢索,缺乏語義理解,導致反饋的信息不準確;通用的搜索引擎無法處理非結構性數據,圖片、音頻、視頻等復雜類型的數據。

      為了解決上述問題,定向抓取相關網頁資源的網絡爬蟲應運而生,下圖是Google搜索引擎的架構圖,它從萬維網中爬取相關數據,通過文本和連接分析,再進行打分排序,最后返回相關的搜索結果至瀏覽器。同時,現在比較熱門的知識圖譜也是為了解決類似的問題而提出的。

      網絡爬蟲又被稱為網頁蜘蛛或網絡機器人,它是一種按照一定的規則,自動地抓取萬維網信息的程序或者腳本。網絡爬蟲根據既定的抓取目標,有選擇的訪問萬維網上的網頁與相關的鏈接,獲取所需要的信息。與通用爬蟲不同,定向爬蟲并不追求大的覆蓋,而將目標定為抓取與某一特定主題內容相關的網頁,為面向主題的用戶查詢準備數據資源。

      網絡爬蟲按照系統結構和實現技術,大致可以分為以下幾種類型:通用網絡爬蟲(General Purpose Web Crawler)、聚焦網絡爬蟲(Focused Web Crawler)、增量式網絡爬蟲(Incremental Web Crawler)、深層網絡爬蟲(Deep Web Crawler)。實際的網絡爬蟲系統通常是幾種爬蟲技術相結合實現的。

      數據分析通常包括前期準備、數據爬取、數據預處理、數據分析、可視化繪圖及分析評估六個步驟,如下圖所示。其中數據爬取主要劃分為四個步驟:

      需求分析。首先需要分析網絡數據爬取的需求,了解所爬取主題的網址、內容分布,所獲取語料的字段、圖集等內容。

      技術選擇。網頁抓取技術可以通過Python、Java、C++、C#等不同編程語言實現,主要涉及的技術包括:Urllib庫、正則表達式、Selenium、BeautifulSoup、Scrapy等技術。

      網頁抓取。確定好爬取技術后,需要分析網頁的DOM樹結構,通過XPATH技術定位網頁所爬取內容的節點,再抓取數據;同時,部分網站涉及到頁面跳轉、登錄驗證等。

      存儲技術。數據存儲技術主要是存儲爬取的數據信息,主要包括SQL數據庫、純文本格式、CSV\XLS文件等。

      二.正則表達式

      正則表達式是用于處理字符串的強大工具,通常被用來檢索、替換那些符合某種規則的文本。這篇文章首先引入正則表達式的基本概念,然后講解其常用的方法,并結合Python網絡數據爬取常用模塊和常見正則表達式的網站分析方法進行講解,最后使用正則表達式爬取了個人博客網站。

      正則表達式(Regular Expression,簡稱Regex或RE)又稱為正規表示法或常規表示法,常常用來檢索、替換那些符合某個模式的文本,它首先設定好了一些特殊的字符及字符組合,通過組合的“規則字符串”來對表達式進行過濾,從而獲取或匹配我們想要的特定內容。它非常靈活,其邏輯性和功能性也非常強,并能迅速地通過表達式從字符串中找到所需信息,但對于剛接觸的人來說,比較晦澀難懂。

      由于正則表達式主要應用對象是文本,因此它在各種文本編輯器中都有應用,小到著名編輯器EditPlus,大到Microsoft Word、Visual Studio等大型編輯器,都可以使用正則表達式來處理文本內容。

      1.re模塊

      Python通過re模塊提供對正則表達式的支持,但在使用正則表達式之前需要導入re模塊,才能調用該模塊的功能函數。

      import re

      其基本步驟是先將正則表達式的字符串形式編譯為Pattern實例,然后使用Pattern實例處理文本并獲得一個匹配(match)實例,再使用match實例獲得所需信息。常用的函數是findall,原型如下:

      findall(string[, pos[, endpos]]) | re.findall(pattern, string[, flags])

      該函數表示搜索字符串string,以列表形式返回全部能匹配的子串。其中參數re包括三個常見值,每個常見值括號內的內容是完整的寫法。

      re.I(re.IGNORECASE):使匹配忽略大小寫

      re.M(re.MULTILINE):允許多行匹配

      re.S(re.DOTALL):匹配包括換行在內的所有字符

      Pattern對象是一個編譯好的正則表達式,通過Pattern提供的一系列方法可以對文本進行匹配查找。Pattern不能直接實例化,必須使用re.compile()進行構造。

      2.complie方法

      re正則表達式模塊包括一些常用的操作函數,比如complie()函數。其原型如下:

      compile(pattern[,flags] )

      該函數根據包含正則表達式的字符串創建模式對象,返回一個pattern對象。參數flags是匹配模式,可以使用按位或“|”表示同時生效,也可以在正則表達式字符串中指定。Pattern對象是不能直接實例化的,只能通過compile方法得到。

      簡單舉個實例,使用正則表達式獲取字符串中的數字內容,如下所示:

      >>> import re >>> string="A1.45,b5,6.45,8.82" >>> regex = re.compile(r"\d+\.?\d*") >>> print regex.findall(string) ['1.45', '5', '6.45', '8.82'] >>>

      3.match方法

      match方法是從字符串的pos下標處起開始匹配pattern,如果pattern結束時已經匹配,則返回一個match對象;如果匹配過程中pattern無法匹配,或者匹配未結束就已到達endpos,則返回None。該方法原型如下:

      match(string[, pos[, endpos]]) | re.match(pattern, string[, flags])

      參數string表示字符串;pos表示下標,pos和endpos的默認值分別為0和len(string);參數flags用于編譯pattern時指定匹配模式。

      4.search方法

      search方法用于查找字符串中可以匹配成功的子串。從字符串的pos下標處嘗試匹配pattern,如果pattern結束時仍可匹配,則返回一個match對象;若pattern結束時仍無法匹配,則將pos加1后重新嘗試匹配;直到pos=endpos時仍無法匹配則返回None。函數原型如下:

      search(string[, pos[, endpos]]) | re.search(pattern, string[, flags])

      參數string表示字符串;pos表示下標,pos和endpos的默認值分別為0和len(string));參數flags用于編譯pattern時指定匹配模式。

      5.group和groups方法

      group([group1, …])方法用于獲得一個或多個分組截獲的字符串,當它指定多個參數時將以元組形式返回,沒有截獲字符串的組返回None,截獲了多次的組返回最后一次截獲的子串。groups([default])方法以元組形式返回全部分組截獲的字符串,相當于多次調用group,其參數default表示沒有截獲字符串的組以這個值替代,默認為None。

      三.Python網絡數據爬取的常用模塊

      本小節介紹Python網絡數據爬取的常用模塊或庫,主要包括urlparse模塊、urllib模塊、urllib2模塊和requests模塊,這些模塊中的函數都是基礎知識,但也非常重要。

      1.urllib模塊

      本書首先介紹Python網絡數據爬取最簡單并且應用比較廣泛的第三方庫函數urllib。urllib是Python用于獲取URL(Uniform Resource Locators,統一資源定址器)的庫函數,可以用來抓取遠程數據并保存,甚至可以設置消息頭(header)、代理、超時認證等。

      urllib模塊提供的上層接口讓我們像讀取本地文件一樣讀取www或ftp上的數據。它比C++、C#等其他編程語言使用起來更方便。其常用的方法如下:

      urlopen

      urlopen(url, data=None, proxies=None)

      該方法用于創建一個遠程URL的類文件對象,然后像本地文件一樣操作這個類文件對象來獲取遠程數據。參數url表示遠程數據的路徑,一般是網址;參數data表示以post方式提交到url的數據;參數proxies用于設置代理。urlopen返回一個類文件對象。urlopen提供了如下表所示。

      注意,在Python中我們可以導入相關擴展包,通過help函數查看相關的使用說明,如下圖所示。

      下面通過一個實例講述Urllib庫函數爬取百度官網的實例。

      # -*- coding:utf-8 -*- import urllib.request import webbrowser as web url = "http://www.baidu.com" content = urllib.request.urlopen(url) print(content.info()) #頭信息 print(content.geturl()) #請求url print(content.getcode()) #http狀態碼 #保存網頁至本地并通過瀏覽器打開 open("baidu.html","wb").write(content.read()) web.open_new_tab("baidu.html")

      該段調用調用urllib.urlopen(url)函數打開百度鏈接,并輸出消息頭、url、http狀態碼等信息,如下圖所示。

      代碼import webbrowser as web引用webbrowser第三方庫,然后可以使用類似于“module_name.method”調用對應的函數。open().write()表示在本地創建靜態的baidu.html文件,并讀取已經打開的百度網頁內容,執行文件寫操作。web.open_new_tab(“baidu.html”)表示通過瀏覽器打開已經下載的靜態網頁新標簽。其中下載并打開的百度官網靜態網頁“baidu.html”文件如下圖所示。

      同樣可以使用web.open_new_tab(“http://www.baidu.com”)在瀏覽器中直接打開在線網頁。

      urlretrieve

      urlretrieve(url, filename=None, reporthook=None, data=None)

      urlretrieve方法是將遠程數據下載到本地。參數filename指定了保存到本地的路徑,如果省略該參數,urllib會自動生成一個臨時文件來保存數據;參數reporthook是一個回調函數,當連接上服務器,相應的數據塊傳輸完畢時會觸發該回調,通常使用該回調函數來顯示當前的下載進度;參數data指傳遞到服務器的數據。下面通過例子來演示將新浪首頁網頁抓取到本地,保存在“D:/sina.html”文件中,同時顯示下載進度。

      # -*- coding:utf-8 -*- import urllib.request # 函數功能:下載文件至本地,并顯示進度 # a-已經下載的數據塊, b-數據塊的大小, c-遠程文件的大小 def Download(a, b, c): per = 100.0 * a * b / c if per > 100: per = 100 print('%.2f' % per) url = 'http://www.sina.com.cn' local = 'd://sina.html' urllib.request.urlretrieve(url, local, Download)

      上面介紹了urllib模塊中常用的兩個方法,其中urlopen()用于打開網頁,urlretrieve()方法是將遠程數據下載到本地,主要用于爬取圖片。注意,Python2可以直接引用,而Python3需要通過urllib.request調用。

      # -*- coding:utf-8 -*- import urllib.request url = 'https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png' local = 'baidu.png' urllib.request.urlretrieve(url, local)

      抓取百度logo圖片如下圖所示:

      2.urlparse模塊

      urlparse模塊主要是對url進行分析,其主要操作是拆分和合并url各個部件。它可以將url拆分為6個部分,并返回元組,也可以把拆分后的部分再組成一個url。主要有函數有urljoin、urlsplit、urlunsplit、urlparse等。

      urlparse

      urlparse.urlparse(urlstring[, scheme[, allow_fragments]])

      該函數將urlstring值解析成6個部分,從urlstring中取得url,并返回元組(scheme, netloc, path, params, query, fragment)。該函數可以用來確定網絡協議(HTTP、FTP等)、服務器地址、文件路徑等。實例代碼如下所示。

      # coding=utf-8 from urllib.parse import urlparse url = urlparse('http://www.eastmount.com/index.asp?id=001') print(url) #url解析成六部分 print(url.netloc) #輸出網址

      輸出如下所示,包括scheme、netloc、path、params、query、fragment六部分內容。

      >>> ParseResult( scheme='http', netloc='www.eastmount.com', path='/index.asp', params='', query='id=001', fragment='' ) www.eastmount.com >>>

      同樣可以調用urlunparse()函數將一個元組內容構建成一條Url。函數如下:

      urlunparse

      urlparse.urlunparse(parts)

      該元組類似urlparse函數,它接收元組(scheme, netloc, path, params, query, fragment)后,會重新組成一個具有正確格式的url,以便供Python的其他HTML解析模塊使用。示例代碼如下:

      # coding=utf-8 import urllib.parse url = urllib.parse.urlparse('http://www.eastmount.com/index.asp?id=001') print(url) #url解析成六部分 print(url.netloc) #輸出網址 #重組URL u = urllib.parse.urlunparse(url) print(u)

      輸出如下圖所示。

      四.正則表達式抓取網絡數據的常見方法

      1.抓取標簽間的內容

      HTML語言是采用標簽對的形式來編寫網站的,包括起始標簽和結束標簽,比如< head>、< tr>、< script>< script>等。下面講解抓取標簽對之間的文本內容,比如抓取< title>Python標簽對之間的“Python”內容。

      (1) 抓取title標簽間的內容

      '(.*?)'

      首先我們可以采用該正則表達式來抓取起始標簽< title >和結束標簽< /title >之間的內容,“(.*?)”就代表著我們需要抓取的內容。下面這段代碼是爬取百度官網的標題,即“百度一下,你就知道”。

      # coding=utf-8 import re import urllib.request url = "http://www.baidu.com/" content = urllib.request.urlopen(url).read() title = re.findall(r'(.*?)', content.decode('utf-8')) print(title[0]) # 百度一下,你就知道

      代碼調用urllib庫的urlopen()函數打開超鏈接,并調用正則表達式re庫中的findall()函數尋找title標簽間的內容。由于findall()函數是獲取所有滿足該正則表達式的文本,這里只需要輸出第一個值title[0]即可。注意,Python3需要轉換utf8編碼,否則會報錯。

      下面講解另一種方法,用來獲取標題起始標簽(< title>)和結束標簽()之間的內容,同樣輸出百度官網標題“百度一下,你就知道”。

      # coding=utf-8 import re import urllib.request url = "http://www.baidu.com/" content = urllib.request.urlopen(url).read() pat = r'(?<=).*?(?=)' ex = re.compile(pat, re.M|re.S) obj = re.search(ex, content.decode('utf-8')) title = obj.group() print(title) # 百度一下,你就知道

      2.抓取超鏈接標簽間的內容

      在HTML中,< a href=url>超鏈接標題用于標識超鏈接,下面的代碼用于獲取完整的超鏈接,同時獲取超鏈接< a>和之間的標題內容。

      # coding=utf-8 import re import urllib.request url = "http://www.baidu.com/" content = urllib.request.urlopen(url).read() #獲取完整超鏈接 res = r"" urls = re.findall(res, content.decode('utf-8')) for u in urls: print(u) #獲取超鏈接之間內容 res = r'(.*?)' texts = re.findall(res, content.decode('utf-8'), re.S|re.M) for t in texts: print(t)

      輸出結果部分內容如下所示,這里如果采用“print(u)”或“print(t)”語句直接輸出結果。

      3.抓取tr標簽和td標簽間的內容

      網頁常用的布局包括table布局或div布局,其中table表格布局中常見的標簽包括tr、th和td,表格行為tr(table row),表格數據為td(table data),表格表頭為th(table heading)。那么如何抓取這些標簽間的內容呢?下面是獲取它們之間內容的代碼。假設存在HTML代碼如下所示:

      表格

      學號姓名
      1001楊秀璋
      1002燕娜

      運行結果如下圖所示:

      正則表達式爬取tr、th、td標簽之間內容的Python代碼如下。

      # coding=utf-8 import re import urllib.request content = urllib.request.urlopen("test.html").read() #打開本地文件 #獲取間內容 res = r'(.*?)' texts = re.findall(res, content.decode('utf-8'), re.S|re.M) for m in texts: print(m) #獲取間內容 for m in texts: res_th = r'(.*?)' m_th = re.findall(res_th, m, re.S|re.M) for t in m_th: print(t) #直接獲取間內容 res = r'(.*?)(.*?)' texts = re.findall(res, content.decode('utf-8'), re.S|re.M) for m in texts: print(m[0],m[1])

      輸出結果如下,首先獲取tr之間的內容,然后再在tr之間內容中獲取< th>和之間值,即“學號”、“姓名”,最后是獲取兩個< td>和之間的內容。注意,Python3解析本地文件可能會出錯,掌握方法更重要。

      如果包含屬性值,則正則表達式修改為“< td id=.?>(.?)”。同樣,如果不一定是id屬性開頭,則可以使用正則表達式“(.?)”。

      2.爬取標簽中的參數

      (1) 抓取超鏈接標簽的url

      HTML超鏈接的基本格式為“< a href=url>鏈接內容”,現在需要獲取其中的url鏈接地址,方法如下:

      # coding=utf-8 import re content = ''' 新聞 hao123 地圖 視頻 ''' res = r"(?<=href=\").+?(?=\")|(?<=href=\').+?(?=\')" urls = re.findall(res, content, re.I|re.S|re.M) for url in urls: print(url)

      輸出內容如下:

      2.抓取圖片超鏈接標簽的url

      在HTML中,我們可以看到各式各樣的圖片,其圖片標簽的基本格式為“< img src=圖片地址 />”,只有通過抓取了這些圖片的原地址,才能下載對應的圖片至本地。那么究竟怎么獲取圖片標簽中的原圖地址呢?下面這段代碼就是獲取圖片鏈接地址的方法。

      content = '''Python''' urls = re.findall('src="(.*?)"', content, re.I|re.S|re.M) print urls # ['http://m.bai1xia.com/news/zb_users/upload/2022/05/20220530234011_30974.jpg']

      原圖地址為“http://…/eastmount.jpg”,它對應一張圖片,該圖片是存儲在“www.yangxiuzhang.com”網站服務器端的,最后一個“/”后面的字段為圖片名稱,即為“eastmount.jpg”。那么如何獲取url中最后一個參數呢?

      3.獲取url中最后一個參數

      在使用Python爬取圖片過程中,通常會遇到圖片對應的url最后一個字段用來命名圖片的情況,如前面的“eastmount.jpg”,需要通過解析url“/”后面的參數來獲取圖片。

      content = '''Python''' urls = 'http://m.bai1xia.com/news/zb_users/upload/2022/05/20220530234011_61810.jpg' name = urls.split('/')[-1] print name # eastmount.jpg

      該段代碼urls.split(’/’)[-1]表示采用字符“/”分割字符串,并且獲取最后一個所獲取的值,即為圖片名稱“eastmount.jpg”。

      3.字符串處理及替換

      在使用正則表達式爬取網頁文本時,通常需要調用find()函數找到指定的位置,再進行進一步爬取,比如獲取class屬性為“infobox”的表格table,再進行定位爬取。

      start = content.find(r'

      ') #終點位置 infobox = text[start:end] print infobox

      同時,爬取過程中可能會爬取到無關變量,此時需要對無關內容進行過濾,這里推薦使用replace函數和正則表達式進行處理。比如爬取內容如下所示:

      # coding=utf-8 import re content = '''

      ''' res = r'' texts = re.findall(res, content, re.S|re.M) for m in texts: print(m[0],m[1])

      輸出內容如下所示:

      此時需要過濾多余字符串,如換行(< br />)、空格(& nbsp;)、加粗(< B>),過濾代碼如下:

      # coding=utf-8 import re content = '''

      ''' res = r'' texts = re.findall(res, content, re.S|re.M) for m in texts: value0 = m[0].replace('
      ', '').replace(' ', '') value1 = m[1].replace('
      ', '').replace(' ', '') if '' in value1: m_value = re.findall(r'(.*?)', value1, re.S|re.M) print(value0, m_value[0]) else: print(value0, value1)

      采用replace將字符串“< br />”和“’& nbsp;”替換成空白,實現過濾,而加粗(< B>)需要使用正則表達式過濾。輸出結果如下:

      五.個人博客爬取實例

      切記:這個例子可能不是非常好,但是作為入門及正則表達式結合挺好的。剛開始學習Python網絡爬蟲不要嫌麻煩,只有通過類似的訓練,以后面對類似的問題你才會得心應手,更好的抓取需要的數據。

      1.分析過程

      博客網址的標題(title)內容

      爬取所有圖片的超鏈接,比如爬取< img src=”xxx.jpg” />中的“xxx.jpg”

      分別爬取博客首頁中的四篇文章的標題、超鏈接及摘要內容,比如標題為“再見北理工:憶北京研究生的編程時光”。

      第一步 瀏覽器源碼定位

      首先通過瀏覽器定位需要爬取元素的源代碼,比如文章標題、超鏈接、圖片等,發現這些元素對應HTML源代碼存在的規律,這稱為DOM樹文檔節點分析。通過瀏覽器打開網頁,選中需要爬取的內容,右鍵鼠標并點擊“審查元素”或“檢查”,即可找到所需爬取節點對應的HTML源代碼,如圖所示。

      標題“再見北理工:憶北京研究生的編程時光”位于< div class=”essay”>節點下,它包括一個< h1>記錄標題,一個< p>記錄摘要信息,即:

      這里需要通過網頁標簽的屬性和屬性值來標記爬蟲節點,即找到class屬性為“essay”的div,就可以定位第一篇文章的位置。同理,其余三篇文章為< div class=”essay1”>、< div class=”essay2”>和< div class=”essay3”>,定位這些節點即可。

      第二步 正則表達式爬取標題

      網站的標題通常位于< head>< title>…之間,該網站標題HTML代碼如下:

      秀璋學習天地 ....

      爬取博客網站的標題“秀璋學習天地”的方法是通過正則表達式“< title>(.*?)”實現,代碼如下,首先通過urlopen()函數訪問博客網址,然后定義正則表達式爬取。

      import re import urllib.request url = "http://www.eastmountyxz.com/" content = urllib.request.urlopen(url).read() title = re.findall(r'(.*?)', content.decode('utf-8')) print(title[0])

      輸出結果如下圖所示:

      第三步 正則表達式爬取所有圖片地址

      由于HTML插入圖片標簽格式為“< img src=圖片地址 />”,則使用正則表達式獲取圖片地址的方法為:獲取以“src=”開頭,以雙引號結尾的內容即可。代碼如下:

      import re import urllib.request url = "http://www.eastmountyxz.com/" content = urllib.request.urlopen(url).read() urls = re.findall(r'src="(.*?)"', content.decode('utf-8')) for url in urls: print(url)

      輸出的結果如下所示,共顯示了6張圖片。

      需要注意:這里的每張圖片都省略了博客地址:

      http://www.eastmountyxz.com/

      我們需要對所爬取的圖片地址進行拼接,增加原博客地址拼成完整的圖片地址,再進行下載,并且該地址通過瀏覽器可以直接訪問查看。如:

      http://www.eastmountyxz.com/images/11.gif

      第四步 正則表達式爬取博客內容

      前面第一步講述了如何定位四篇文章的標題,第一篇文章位于< div class=”essay”>和標簽之間,第二篇位于< div class=”essay1”>和,依次類推。但是該HTML代碼存在一個錯誤:class屬性通常表示一類標簽,它們的值都應該是相同的,所以這四篇文章的class屬性都應該是“essay”,而name或id才是用來標識標簽的唯一屬性。

      這里使用find(’< div class=“essay” >’)函數來定位第一篇文章的起始位置,使用find(’< div class=“essay1” >’)函數來定位第一篇文章的結束位置,從而獲取< div class=”essay”>到之間的內容。比如獲取第一篇文章的標題和超鏈接代碼如下:

      import re import urllib.request url = "http://www.eastmountyxz.com/" content = urllib.request.urlopen(url).read() data = content.decode('utf-8') start = data.find(r'

      ') end = data.find(r'
      ') print(data[start:end])

      輸出內容如下,獲取第一篇博客的HTML源代碼。

      該部分代碼分為三步驟:

      調用urllib庫的urlopen()函數打開博客地址,并讀取內容賦值給content變量。

      調用find()函數查找特定的內容,比如class屬性為“essay”的div標簽,依次定位獲取開始和結束的位置。

      進行下一步分析,獲取源碼中的超鏈接和標題等內容。

      定位這段內容之后,再通過正則表達式獲取具體內容,代碼如下:

      import re import urllib.request url = "http://www.eastmountyxz.com/" content = urllib.request.urlopen(url).read() data = content.decode('utf-8') start = data.find(r'

      ') end = data.find(r'
      ') page = data[start:end] res = r"(?<=href=\").+?(?=\")|(?<=href=\').+?(?=\')" t1 = re.findall(res, page) #超鏈接 print(t1[0]) t2 = re.findall(r'(.*?)', page) #標題 print(t2[0]) t3 = re.findall('

      (.*?)

      ', page, re.M|re.S) #摘要 print(t3[0])

      調用正則表達式分別獲取內容,由于爬取的段落(P)存在換行內容,所以需要加入re.M和re.S支持換行查找,最后輸出結果如下:

      2.代碼實現

      完整代碼如下:

      #coding:utf-8 import re import urllib.request url = "http://www.eastmountyxz.com/" content = urllib.request.urlopen(url).read() data = content.decode('utf-8') #爬取標題 title = re.findall(r'(.*?)', data) print(title[0]) #爬取圖片地址 urls = re.findall(r'src="(.*?)"', data) for url in urls: print(url) #爬取內容 start = data.find(r'

      ') end = data.find(r'
      ') page = data[start:end] res = r"(?<=href=\").+?(?=\")|(?<=href=\').+?(?=\')" t1 = re.findall(res, page) #超鏈接 print(t1[0]) t2 = re.findall(r'(.*?)', page) #標題 print(t2[0]) t3 = re.findall('

      (.*?)

      ', page, re.M|re.S) #摘要 print(t3[0]) print('') start = data.find(r'
      ') end = data.find(r'
      ') page = data[start:end] res = r"(?<=href=\").+?(?=\")|(?<=href=\').+?(?=\')" t1 = re.findall(res, page) #超鏈接 print(t1[0]) t2 = re.findall(r'(.*?)', page) #標題 print(t2[0]) t3 = re.findall('

      (.*?)

      ', page, re.M|re.S) #摘要 print(t3[0])

      輸出結果如圖所示。

      通過上面的代碼,讀者會發現使用正則表達式爬取網站還是比較繁瑣,尤其是定位網頁節點時,后面將講述Python提供的常用第三方擴展包,利用這些包的函數進行定向爬取。

      六.總結

      正則表達式是通過組合的“規則字符串”來對表達式進行過濾,從復雜內容中匹配想要的信息。它的主要對象是文本,適合于匹配文本字符串等內容,不適合匹配文本意義,比如匹配URL、Email這種純文本的字符就非常適合。各種編程語言都能使用正則表達式,比如C#、Java、Python等。

      正則表達式爬蟲常用于獲取字符串中的某些內容,比如提取博客閱讀量和評論數的數字,截取URL域名或URL中某個參數,過濾掉特定的字符或檢查所獲取的數據是否符合某個邏輯,驗證URL或日期類型等。由于其比較靈活、邏輯性和功能性較強的特點,使它能迅速地以極簡單的方式從復雜字符串中達到匹配目的。

      前文賞析:

      [Python從零到壹] 一.為什么我們要學Python及基礎語法詳解

      [Python從零到壹] 二.語法基礎之條件語句、循環語句和函數

      [Python從零到壹] 三.語法基礎之文件操作、CSV文件讀寫及面向對象

      [Python從零到壹] 四.網絡爬蟲之入門基礎及正則表達式抓取博客案例

      希望能與大家一起在華為云社區共同承載,原文地址:https://blog.csdn.net/Eastmount/article/details/108887652

      【生長吧!Python】有獎征文火熱進行中:https://bbs.huaweicloud.com/blogs/278897

      (By:娜璋之家 Eastmount 2021-07-07 夜于武漢)

      參考文獻如下:

      AI Python 正則表達式

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:CF #738(div2)B. Mocha and Red and Blue(構造)
      下一篇:如何借助低代碼開發平臺解決方案提升生產力和減少開發周期?
      相關文章
      亚洲国产精品综合福利专区| 亚洲综合无码一区二区三区| 亚洲一本一道一区二区三区| 亚洲乱码一区av春药高潮| 亚洲欧洲免费视频| 国产精品久久久亚洲| 亚洲处破女AV日韩精品| 久久久无码精品亚洲日韩蜜桃 | 亚洲综合av一区二区三区不卡| 激情综合亚洲色婷婷五月APP| 亚洲国产精品综合一区在线 | 国产乱辈通伦影片在线播放亚洲 | 亚洲av无码国产综合专区| 亚洲精品午夜视频| 亚洲日本视频在线观看| 91亚洲性爱在线视频| 亚洲一区在线观看视频| 精品亚洲456在线播放| 亚洲人成人网毛片在线播放| 亚洲色大成网站www| 欧洲亚洲国产精华液| 久久综合亚洲色hezyo| 在线亚洲v日韩v| 亚洲日韩在线观看免费视频| 日韩精品亚洲aⅴ在线影院| 亚洲人成人无码网www电影首页| 亚洲国产精品国自产拍AV| 亚洲av日韩av激情亚洲| 亚洲精品自在线拍| 亚洲一卡2卡3卡4卡国产网站| 久久亚洲国产成人影院| 亚洲AⅤ男人的天堂在线观看| 亚洲精品国产福利一二区| 亚洲精品乱码久久久久久蜜桃不卡| 亚洲成色WWW久久网站| 亚洲精品成人图区| 亚洲欧洲日韩国产一区二区三区| 亚洲av无一区二区三区| 亚洲一区日韩高清中文字幕亚洲 | 亚洲国产精品无码专区在线观看| 亚洲AV人人澡人人爽人人夜夜|
        1001楊秀璋
        1002燕 娜
        1003Python
        (.*?)(.*?)
        1001楊秀璋
        1002顏 娜
        1003Python
        (.*?)(.*?)
          <ul id="8m2og"></ul>
        • <strike id="8m2og"><menu id="8m2og"></menu></strike>