Python爬蟲(十一)_案例:使用正則表達式的爬蟲

在這里插入圖片描述

本章將結合先前所學的爬蟲和正則表達式知識,做一個簡單的爬蟲案例,更多內容請參考:Python學習指南

現在擁有了正則表達式這把神兵利器,我們就可以進行對爬取到的全部網頁源代碼進行篩選了。

下面我們一起嘗試一下爬取內涵段子網站: http://www.neihan8.com/article/list_5_1.html

打開之后,不難看出里面一個一個非常有內涵的段子,當你進行翻頁的時候,注意url地址的變化:

  • 第一頁url: http: //www.neihan8.com/article/list_5_1 .html
  • 第二頁url: http: //www.neihan8.com/article/list_5_2 .html
  • 第三頁url: http: //www.neihan8.com/article/list_5_3 .html
  • 第四頁url: http: //www.neihan8.com/article/list_5_4 .html

這樣我們的url規律找到了,要想爬取所有的段子,只需要修改一個參數即可。 我們就開始一步一步將所有的段子爬取下來吧。

第一步:獲取數據

1. 按照我們之前的用法,我們需要一個加載頁面的方法。

這里我們統一定義一個類,將url請求作為一個成員方法處理。 我們創建了一個文件,叫duanzi_spider.py 然后定義一個Spider類,并且添加一個加載頁面的成員方法。

import urllib2class Spider:"""內涵段子爬蟲類"""def loadPage(self, page):"""@brief 定義一個url請求網頁的方法@param page需要請求的第幾頁@returns 返回的頁面url"""url = "http://www.neihan8.com/article/list_5_" + str(page)+ ".html"#user-Agent頭user_agent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT6.1; Trident/5.0"headers = {"User-Agent":user_agent}req = urllib2.Request(url, headers = headers)response = urllib2.urlopen(req)print html

以上的loadPage的實現思想想必大家都應該熟悉了,需要注意定義python類的成員方法需要額外添加一個參數self.

2.寫main函數測試一個loadPage方法

if __name__ == "__main__":"""=====================內涵段子小爬蟲====================="""print("請按下回車開始")raw_input()#定義一個Spider對象mySpider = Spider()mySpider.loadPage(1)
  • 程序正常執行的話,我們會在皮姆上打印了內涵段子第一頁的全部html代碼。但是我們發現,html中的中文部分顯示的可能是亂碼。

內涵段子亂碼

那么我們需要簡單的將得到的網頁源代碼處理一下: def loadPage(self, page): “”" @bridf 定義一個url請求網頁的方法 @param page 需要請求的第幾頁 @returns 返回的頁面html “”" url = “http://www.neihan8.com/article/list_5_”+str(page)+“.html” #user-agent頭 user-agent = “Mozilla/5.0 (compatible; MSIE 9.0; Windows NT6.1; Trident/5.0” headers = {“User-Agent”:user-agent} req = urllib2.Request(url, headers = headers) response = urllib2.urlopen(req) html = response.read() gbk_html = html.decode(“gbk”).encode(“utf-8”) return gbk_html

注意:對于每個網站對中文的編碼各自不同,所以html.decode(“gbk”)的寫法并不是通用的,根據網站的編碼而異。

網站編碼不同

第二步:篩選數據

接下來我們已經得到了整個頁面的數據。但是,很多內容我們并不關心,所以下一步我們需要篩選數據。如何篩選,就用到了上一節講述的正則表達式

  • 首先 import re
  • 然后,我們得到的gbk_html中進行篩選匹配。

我們需要一個匹配規則

我們可以打開內涵段子的網頁,鼠標點擊右鍵"查看源代碼"你會驚奇的發現,我們需要的每個段子的內容都是在一個<div>標簽中,而且每個div標簽都有一個屬性class="f18 mb20"

內涵段子正則匹配

根據正則表達式,我們可以推算出一個公式是:

<div.*?class="f18 mb20">(.*?)</div>
  • 這個表達式實際上就是匹配到所有divclass="f18 mb20"里面的內容(具體可以看前面介紹)
  • 然后這個正則應用到代碼中,我們會得到以下代碼:
def loadPage(self, page):"""@brief 定義一個url請求網頁的辦法@param page 需要請求的第幾頁@returns 返回的頁面html"""url = "http://www.neihan8.com/article/list_5_" +str(page) + ".html"#User-Agent頭user-agent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT6.1; Trident/5.0"  headers = {"User-Agent":user-agent}req = urllib2.Request(url, headers=headers)response = urllib2.urlopen(req)html = response.read()gbk_html = html.decode("gbk").encode("utf-8")#找到所有的段子內容<div class="f18 mb20"></div>#re.S 如果沒有re.S,則是只匹配一行有沒有符合規則的字符串,如果沒有則匹配下一行重新匹配#如果加上re.S,則是將所有的字符串按一個整體進行匹配pattern = re.compile(r'<div.*?class="f18 mb20">(.*?)</div>', re.S)item_list = pattern.findall(gbk_html)return item_listdef printOnePage(self, item_list, page):"""@brief 處理得到的段子列表@param item_list 得到的段子列表@param page處理第幾頁"""print("*********第%d頁,爬取完畢...******"%page)for item in item_list:print("===============")print ite
  • 這里需要注意一個是re.S是正則表達式中匹配的一個參數。
  • 如果沒有re.S則是只匹配一行有沒有符合規則的字符串,如果沒有則下一行重新匹配。
  • 如果加上re.S則是將所有的字符串按一個整體進行匹配,findall將匹配到的所有結果封裝到一個list中。
  • 如果我們寫了一個遍歷item_list的一個方法printOnePage()。ok程序寫到這,我們再一次執行一下。
python duanzi_spider.py
我們第一頁的全部段子,不包含其他信息全部的打印了出來.
  • 你會發現段子中有很多<p>,</p>很是不舒服,實際上這個是html的一種段落的標簽。
  • 在瀏覽器上看不出來,但是如果按照文本打印會有<p>出現,那么我們只需要把我們的內容去掉即可。
  • 我們可以如下簡單修改一下printOnePage()
def printOnePage(self, item_list, page):"""@brief 處理得到的段子列表@param item_list 得到的段子列表@param page 處理第幾頁"""print("******第%d頁,爬取完畢*****"%page)  for item in item_list:print("============")item = item.replace("<p>", "").replace("</p>", "").replace("<br />", "")print item

第三步:保存數據

  • 我們可以將所有的段子存放在文件中。比如,我們可以將得到的每個item不是打印出來,而是放在一個叫duanzi.txt的文件中也可以。
def writeToFile(self, text):"""@brief 將數據追加寫進文件中@param text 文件內容"""myFile = open("./duanzi.txt", "a")  #a追加形式打開文件  myFile.write(text)myFile.write("-------------------------")myFile.close()
  • 然后我們將所有的print的語句改寫成writeToFile(), 當前頁面的所有段子就存在了本地的duanzi.txt文件中。
def printOnePage(self, item_list, page):"""@brief  處理得到的段子列表@param item_list 得到的段子列表@param page 處理第幾頁"""print("***第%d頁,爬取完畢****"%page)for item in item_list:item = item.replace("<p>", "").replace("</p>", "").replace("<br />". "")self.writeToFile(item)

第四步:顯示數據

  • 接下來我們就通過參數的傳遞對page進行疊加來遍歷內涵段子吧的全部段子內容。
  • 只需要在外層加上一些邏輯處理即可。
def doWork(self):"""讓爬蟲開始工作"""while self.enable:try:item_list = self.loadPage(self.page)except urllib2.URLError, e:print e.reasoncontinue#將得到的段子item_list處理self.printOnePage(item_list, self.page)self.page += 1print "按回車繼續...."print "輸入quit退出"command = raw_input()if(command == "quit"):self.enable = Falsebreak
  • 最后,我們執行我們的代碼,完成后查看當前路徑下的duanzi.txt文件,里面已經有了我們要的內涵段子。

以上便是一個非常精簡的小爬蟲程序,使用起來很是方便,如果想要爬取其它網站的信息,只需要修改其中某些參數和一些細節即可。

更多Python的學習資料可以掃描下方二維碼無償領取!!!

1)Python所有方向的學習路線(新版)

總結的Python爬蟲和數據分析等各個方向應該學習的技術棧。

在這里插入圖片描述

比如說爬蟲這一塊,很多人以為學了xpath和PyQuery等幾個解析庫之后就精通的python爬蟲,其實路還有很長,比如說移動端爬蟲和JS逆向等等。

img

(2)Python學習視頻

包含了Python入門、爬蟲、數據分析和web開發的學習視頻,總共100多個,雖然達不到大佬的程度,但是精通python是沒有問題的,學完這些之后,你可以按照我上面的學習路線去網上找其他的知識資源進行進階。

在這里插入圖片描述

(3)100多個練手項目

我們在看視頻學習的時候,不能光動眼動腦不動手,比較科學的學習方法是在理解之后運用它們,這時候練手項目就很適合了,只是里面的項目比較多,水平也是參差不齊,大家可以挑自己能做的項目去練練。

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/35876.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/35876.shtml
英文地址,請注明出處:http://en.pswp.cn/news/35876.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

stm32 cubemx can通訊(3)bsp_can

文章目錄 前言一、bspbsp_can.hbsp_can.c 二、如何使用總結 前言 stm32 cubemx can通訊&#xff08;1&#xff09;回環模式 stm32 cubemx can通訊&#xff08;2&#xff09;過濾器設置說明代碼分析 根據前兩篇文章已經能夠實現can標準幀的收發&#xff0c;但是調用的函數沒有標…

2023年國賽數學建模思路 - 案例:異常檢測

文章目錄 賽題思路一、簡介 -- 關于異常檢測異常檢測監督學習 二、異常檢測算法2. 箱線圖分析3. 基于距離/密度4. 基于劃分思想 建模資料 賽題思路 &#xff08;賽題出來以后第一時間在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 一、簡介 – 關于異常…

軟考高級之系統架構師之數據通信與計算機網絡

概念 OSPF 在劃分區域之后&#xff0c;OSPF網絡中的非主干區域中的路由器對于到外部網絡的路由&#xff0c;一定要通過ABR(區域邊界路由器)來轉發&#xff0c;既然如此&#xff0c;對于區域內的路由器來說&#xff0c;就沒有必要知道通往外部網絡的詳細路由&#xff0c;只要由…

保持城市天際線(力扣)貪心 JAVA

給你一座由 n x n 個街區組成的城市&#xff0c;每個街區都包含一座立方體建筑。給你一個下標從 0 開始的 n x n 整數矩陣 grid &#xff0c;其中 grid[r][c] 表示坐落于 r 行 c 列的建筑物的 高度 。 城市的 天際線 是從遠處觀察城市時&#xff0c;所有建筑物形成的外部輪廓。…

html2canvas生成圖片地址Base64格式轉成blob在轉成file(二進制)可正常發送(保姆教程,復制粘貼可用)

開始: 最終結果: 1. html2canvas方法生成的圖片地址已Base64編碼形式放在img標簽src中可直接展示生成的圖片(注意頁面標簽獲取位置,還有個setTimeout頁面渲染需要時間) setTimeout(function () {var result {};v…

Python 使用Hadoop 3 之HDFS 總結

Hadoop 概述 Hadoop 是一個由Apache 軟件基金會開發的分布式基礎架構。用戶可以在不了解分布式底層細節的情況下&#xff0c;開發分布式程序&#xff0c;充分利用集群的威力進行高速運算和存儲。 Hadoop 實現一個分布式文件系統&#xff08;Hadoop Distributed File Sy…

Python爬蟲——selenium_交互

交互&#xff1a; 點擊&#xff1a;button.click() 輸入&#xff1a;inputs.send_keys() 后退操作&#xff1a;browser.back() 前進操作&#xff1a;browser.forword() 模擬js滾動&#xff1a;browser. js_bottom document.documentElement.scrollTop100000 browser.execute_…

將本地項目上傳至gitee的詳細步驟

將本地項目上傳至gitee的詳細步驟 1.在gitee上創建以自己項目名稱命名的空項目2.進入想上傳的項目的文件夾&#xff0c;然后右鍵點擊3. 初始化本地環境&#xff0c;把該項目變成可被git管理的倉庫4.添加該項目下的所有文件5.使用如下命令將文件添加到倉庫中去6.將本地代碼庫與遠…

Stable Diffusion 插件開發基礎講解

近來Stable diffusion擴散網絡大熱,跟上時代,簡單的文生圖,圖生圖,其實可以滿足絕大多數設計師的應用,但是有什么是賽博畫手無法做到的呢? 那就是他們使用到的stable diffusion的插件開發,他們并不清楚stable diffusino的代碼結構,如果遇到一些代碼層面的報錯問題,他們…

生信豆芽菜-單基因KM曲線

網址&#xff1a;http://www.sxdyc.com/panCancerKMCurve 該工具主要用于查看單基因在泛癌組織中&#xff0c;高低表達的預后情況&#xff0c;這里可以選擇合適的截斷值&#xff0c;比如最佳截斷&#xff0c;中位值&#xff0c;平均值&#xff0c;當然也可以自己輸入&#xff0…

基于長短期神經網絡的客流量預測,基于長短期神經網絡的超短期客流量預測,lstm詳細原理

目錄 背影 摘要 LSTM的基本定義 LSTM實現的步驟 基于長短期神經網絡LSTM的客流量預測 完整代碼: 基于長短期神經網絡LSTM的公交站客流量預測資源-CSDN文庫 https://download.csdn.net/download/abc991835105/88184734 效果圖 結果分析 展望 參考論文 背影 碳排放越來越受到重…

java將字符串中文轉為拼音

可以使用第三方庫來實現中文轉拼音的功能&#xff0c;比如使用pinyin4j這個庫。 首先&#xff0c;需要將pinyin4j庫添加到項目的依賴中。可以通過Maven或者Gradle來添加依賴。 對于Maven&#xff0c;可以在pom.xml文件中添加以下代碼&#xff1a; <dependency><group…

原生信息流廣告特點,如何幫APP開發者增加變現收益?

簡單來說&#xff1a;原生廣告&#xff0c;就是把廣告片和賬號&#xff0c;一起用消耗推流的買量模式&#xff0c;一同投放出去。 用戶看到的廣告/內容&#xff0c;與原生視頻沒有差別——用戶可以點頭像關注、也可以查看賬號歷史信息。原生廣告本質&#xff0c;是顯得真實、原…

聊一聊Sentinel背后的原理

Sentinel簡介 Sentinel是阿里開源的一款面向分布式、多語言異構化服務架構的流量治理組件。 主要以流量為切入點&#xff0c;從流量路由、流量控制、流量整形、熔斷降級、系統自適應過載保護、熱點流量防護等多個維度來幫助開發者保障微服務的穩定性。 上面兩句話來自Sentin…

Android自定義側滑Item

源碼地址&#xff1a;https://github.com/LanSeLianMa/CustomizeView/tree/master/cehuaitem 使用方式一&#xff1a;XML布局中直接使用 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com…

Python爬蟲 爬取圖片

在我們日常上網瀏覽網頁的時候&#xff0c;經常會看到一些好看的圖片&#xff0c;我們就希望把這些圖片保存下載&#xff0c;或者用戶用來做桌面壁紙&#xff0c;或者用來做設計的素材。 我們最常規的做法就是通過鼠標右鍵&#xff0c;選擇另存為。但有些圖片鼠標右鍵的時候并沒…

CVPR 2023 | 用戶可控的條件圖像到視頻生成方法(基于Diffusion)

注1:本文系“計算機視覺/三維重建論文速遞”系列之一&#xff0c;致力于簡潔清晰完整地介紹、解讀計算機視覺&#xff0c;特別是三維重建領域最新的頂會/頂刊論文(包括但不限于 Nature/Science及其子刊; CVPR, ICCV, ECCV, NeurIPS, ICLR, ICML, TPAMI, IJCV 等)。 本次介紹的論…

使用chatGPT-4 暢聊量子物理學(二)

Omer 量子力學的主導哲學或模型或解釋是什么&#xff1f; ChatGPT 量子力學是一門描述微觀世界中粒子行為的物理學理論&#xff0c;但它的解釋和哲學觀點在學術界存在多種不同的觀點和爭議。以下是幾種主要的哲學觀點或解釋&#xff1a; 哥本哈根解釋&#xff1a;這是最為廣泛…

Windows 11清除無效、回收站、過期、緩存、補丁更新文件

Windows 11與之前的Windows版本類似&#xff0c;也需要定期清理無效、垃圾、過期、緩存文件來保持系統性能和存儲空間的優化。以下是在Windows 11中進行這些清理操作的一些建議方法&#xff1a; 磁盤清理工具 Windows 11內置了磁盤清理工具&#xff0c;可以幫助你刪除臨時文件…