網絡爬蟲--10.使用正則表達式的爬蟲

文章目錄

  • 一. 前言
  • 二. 第一步:獲取數據
  • 三. 第二步:篩選數據
  • 四. 第三步:保存數據
  • 五. 第四步:實現循環抓取

一. 前言

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

下面我們一起嘗試一下爬取內涵段子網站: 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規律找到了,要想爬取所有的段子,只需要修改一個參數即可。 下面我們就開始一步一步將所有的段子爬取下來吧。

二. 第一步:獲取數據

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

這里我們統一定義一個類,將url請求作為一個成員方法處理。

我們創建一個文件,叫duanzi_spider.py

然后定義一個Spider類,并且添加一個加載頁面的成員方法

class Duanzi_spider():def __init__(self):self.url = "http://www.neihan8.com/article/list_5_%s.html"self.headers = {"User_Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleW\ebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36","Accept-Encoding":None,"Accept-Language": "zh-CN,zh;q=0.8"}def load_page(self,url):'''可以復用的頁面請求方法'''response = requests.get(url,timeout=10,headers=self.headers)if response.status_code==200:print(response.request.headers)return response.content.decode("gbk")else:raise ValueError("status_code is:",response.status_code)

程序正常執行的話,我們會在屏幕上打印了內涵段子第一頁的全部html代碼。 但是我們發現,html中的中文部分顯示的可能是亂碼 。
注意 :對于每個網站對中文的編碼各自不同,所以html.decode(‘gbk’)的寫法并不是通用寫法,根據網站的編碼而異

三. 第二步:篩選數據

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

import re

然后, 在我們得到的response中進行篩選匹配。

我們需要一個匹配規則:

我們可以打開內涵段子的網頁,鼠標點擊右鍵 " 查看源代碼 " 你會發現每條段子的內容大致如下

<a href="/article/44959.html"><b>回家奔喪</b></a></h4><div class="f18 mb20">一老太太跋山涉水來到部隊,看望她的孫子,<br />警衛問:“她找誰?”老太說:“找xx,”警衛打完電話說:<br />“xx三天前說她他奶奶過世,回家奔喪去了,奔喪去了,去了。。”</div>
def get_content(self,html):'''  根據網頁內容,同時匹配標題和段子內容'''pattern = re.compile(r'<a\shref="/article/\d+\.html">(.*?)</a>.*?<div\sclass="f18 mb20">(.*?)</div>', re.S)t = pattern.findall(html)result = []for i in t:temp = []for j in i:j = re.sub(r"[<b>|</b>|<br />|<br>|<p>|</p>|\\u3000|\\r\\n|\s]","",j)j = j.replace("&ldqo;",'"').replace("&helli;","...").replace("&dqo;",'"').strip()# j = re.sub(r"[&ldqo;|&dqo;]","\"",j)?# j = re.sub(r"…","...",j)temp.append(j)print(temp)result.append(temp)return result

這里需要注意一個是re.S是正則表達式中匹配的一個參數。

如果 沒有re.S 則是 只匹配一行 有沒有符合規則的字符串,如果沒有則下一行重新匹配。

如果 加上re.S 則是將 所有的字符串 將一個整體進行匹配,findall 將所有匹配到的結果封裝到一個list中。

ok程序寫到這,我們再一次執行一下。

Power@PowerMac ~$ python duanzi_spider.py

我們第一頁的全部段子,不包含其他信息全部的打印了出來。
你會發現段子中有很多 < p> , </ p> 很是不舒服,實際上這個是html的一種段落的標簽。
在瀏覽器上看不出來,但是如果按照文本打印會有

出現,那么我們只需要把我們不希望的內容去掉即可了。

我們可以如下簡單修改一下 get_content().

j = re.sub(r"[< b>|</ b>|< br />|< br>|< p>|</ p>|\u3000|\r\n|\s]","",j)
j = j.replace("&ldqo;",’"’).replace("&helli;","…").replace("&dqo;",’"’).strip()

四. 第三步:保存數據

我們可以將所有的段子存放在文件中。比如,我們可以將得到的每個item不是打印出來,而是存放在一個叫 duanzi.txt 的文件中也可以。

def save_content(self,content):myFile = open("./duanzi.txt", 'a')for temp in content:myFile.write("\n"+temp[0]+"\n"+temp[1]+"\n")myFile.write("-----------------------------------------------------")myFile.close()

然后我們實現保存的方法 ,當前頁面的所有段子就存在了本地的duanzi.txt文件中。

五. 第四步:實現循環抓取

接下來我們就通過參數的傳遞對page進行疊加來遍歷 內涵段子吧的全部段子內容。

同時也通過這個run方法實現整個程序的主要邏輯

def run(self):i = 1while True:html = self.load_page(self.url%i)result = self.get_content(html)print ("按回車繼續...")print ("輸入 quit 退出")command = input()if (command == "quit"):breaki+=1

最后,我們執行我們的代碼,完成后查看當前路徑下的duanzi.txt文件,里面已經有了我們要的內涵段子。

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

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

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

相關文章

一對一 一對多 多對多

一對一 例如&#xff0c;學校里一個班級只有一個正班長&#xff0c;而一個班長只在一個班中任職&#xff0c;則班級與班長之間具有一對一聯系。 一對多 例如&#xff0c;一個班級中有若干名學生&#xff0c;而每個學生只在一個班級中學習&#xff0c;則班級與學生之間具有一…

Mac下的Jenkins安裝

安裝方式 1&#xff09;通過命令行安裝 brew install jenkins&#xff0c;可能會遇到先更新 brew 的情況 https://brew.sh/index_zh-cn&#xff1b; 2&#xff09;通過 pkg 安裝&#xff0c;官方網址&#xff1a;https://jenkins.io/ 安裝完成后&#xff0c;會自動打開瀏覽器…

Order By 排序條件中帶參數的寫法(Oracle數據庫、MyBatis)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 sortWay 是參數。 當sortWay 為 llpx 就 ORDER BY FORMAT ASC&#xff0c;為 btypx 就ORDER BY BID DESC &#xff0c;為 zhpx 就 ORDE…

拼湊代碼與編程

拼湊代碼與編程&#xff08;Hacking Vs. Programming&#xff09;之間有什么不同&#xff1f;我聽說過的一個觀點是駭客可以在短時間內編許多代碼&#xff0c;但是一旦發生變更&#xff0c;這些代碼就要完全重寫。而程序員也許會花更多的時間來編碼&#xff0c;但發生變化的時候…

實體間的聯系

&#xff08;1&#xff09;兩個實體型之間的聯系&#xff1a; ①一對一聯系&#xff08;1∶1&#xff09; ②一對多聯系&#xff08;1∶n&#xff09; ③多對多聯系&#xff08;m∶n&#xff09; &#xff08;2&#xff09;兩個以上的實體型之間的聯系&#xff1a; 一般地…

【文章】孝心無價 作者:畢淑敏

我不喜歡一個苦孩子求學的故事。家庭十分困難&#xff0c;父親逝去&#xff0c;弟妹嗷嗷待哺&#xff0c;可他大學畢業后&#xff0c;還要堅持讀研究生&#xff0c;母親只有去賣血……我以為那是一個自私的學子。求學的路很漫長&#xff0c;一生一世的事業&#xff0c;何必太在…

git源碼安裝

安裝依賴yum -y install perl-ExtUtils-MakeMaker tcl libcurl-devel curl-devel expat-devel yum-y install gettext-devel openssl-devel zlib-devel libcurl4-openssl-dev xmlto yum -y install asciidoc docbook2X openjade texinfo perl-XML-SAX nss curlcd /usr/bin…

chrome 開啟 JSONview 方法,讓json數據格式化顯示

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 在瀏覽器上作接口測試的時候看到json 格式的數據是密密麻麻的一片&#xff0c;眼睛都花了.. 如&#xff1a; 設置下chrome 瀏覽器就好了…

聯系的度

聯系的度&#xff1a;參與聯系的實體型的數目 2個實體型之間的聯系度為2&#xff0c;也稱為二元聯系&#xff1b; 3個實體型之間的聯系度為3&#xff0c;稱為三元聯系&#xff1b; N個實體型之間的聯系度為N&#xff0c;也稱為N元聯系

Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate

安裝jsonpath&#xff1a;>pip install jsonpath 報錯&#xff1a;Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host‘pypi.org’, port443): Max retries exceeded with url: /simple/p…

百度貼吧10億量級LAMP架構分享

導讀&#xff1a;天下武功&#xff0c;唯快不破。對日益激烈的互聯網競爭你所擁有的利器就是快&#xff01;本文來自百度貼吧的LAMP解決方案介紹&#xff0c;摘錄至此旨在研究分享&#xff0c;看看其是如何全面支持快速迭代的。 文章內容如下&#xff1a; 貼吧是功能性產品&a…

python基礎-PyYaml操作yaml文件

yaml語法 格式 它的基本語法規則如下 大小寫敏感 使用縮進表示層級關系 縮進時不允許使用Tab鍵&#xff0c;只允許使用空格。 縮進的空格數目不重要&#xff0c;只要相同層級的元素左側對齊即可 YAML 支持的數據結構有三種 1、對象&#xff1a;鍵值對的集合&#xff0c;又稱為映…

N1CTF 塞題vote分析

N1CTF 塞題vote分析&#xff1a;這個題是一個uaf的漏洞題&#xff0c;我們先看看漏洞&#xff08;如下圖&#xff09;&#xff0c;這兩部分是很明顯的對比的啊。當單獨的一個count數組的數據和堆里的數據相同時候&#xff0c;就會釋放堆&#xff0c;堆釋放后的count還會有指針指…

String.valueOf()方法與toString()方法的區別

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 兩者都是把ObJect對象轉化為String 類型。 2.string.valueof()方法有作非空判斷&#xff0c;在內部也是調用的toString()方法&#…

網絡爬蟲--11.XPath和lxml

文章目錄一. XML1. XML 和 HTML 的區別2. XML文檔示例3. HTML DOM 模型示例4. XML的節點關系二. 什么是XPath&#xff1f;1. 選取節點2. 謂語&#xff08;Predicates&#xff09;3. 選取未知節點4. 選取若干路徑5. XPath的運算符三. lxml庫1. 初步使用2. 文件讀取四. XPath實例…

實體與屬性間的劃分原則

為了簡化E-R圖的處置&#xff0c;現實世界的事物能作為屬性對待的&#xff0c;盡量作為屬性對待。 兩條準則&#xff1a; &#xff08;1&#xff09;作為屬性&#xff0c;不能再具有需要描述的性質。屬性必須是不可分的數據項&#xff0c;不能包含其他屬性。 &#xff08;2&…

編程開發之--java多線程學習總結(5)

4、對繼承自Runnable的線程進行鎖機制的使用 package com.lfy.ThreadsSynchronize;import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;public class TicketSellSolution4 implements Runnable {private static int num 50;//創建一個…

軟件測試不是一個功能

今天在工作中我對一個同事說&#xff0c;PyDev 2.5.0現在對TDD&#xff08;測試驅動開發&#xff09;提供了很酷的支持了。我并不是一個對TDD很癡迷的倡導者&#xff0c;對其它事物也一樣&#xff0c;但仍不免激起了一場討論。這個家伙&#xff0c;讓我們暫叫他約翰&#xff0c…

Linux 操作系統基礎知識

1.操作系統總體介紹 ?CPU&#xff1a; 就像人的大腦&#xff0c;主要負責相關事情的判斷以及實際處理的機制。查詢指令&#xff1a; cat /proc/cpuinfo?內存&#xff1a; 大腦中的記憶區塊&#xff0c;將皮膚、眼睛等所收集到的信息記錄起來的地方&#xff0c;以供CPU進行判斷…

Transaction 那點事兒,Spring事務管理

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Transaction 也就是所謂的事務了&#xff0c;通俗理解就是一件事情。從小&#xff0c;父母就教育我們&#xff0c;做事情要有始有終&…