整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          WordPress生成HTML靜態化網站

          WordPress生成HTML靜態化網站

          前,我寫過一個“WordPress的靜態化方法”,使用的是一個名為cos-html-cache的插件實現。

          這個插件非常簡潔小巧,直接在原網站上生成首頁和文章頁的html文件,不過,這個插件只支持文章靜態化,不支持頁面、標簽和分類的靜態化,之后也再沒有過更新。

          后來,我想到過利用WordPress插件導出全靜態化網站的方法,用這個方法,對于少量文章挺方便,但文章數量一旦多了,就經常出錯。

          后來,我看到有人在cos-html-cache插件的基礎上又開發了一個插件,名叫Super Static Cache,我用了一下,發現其BUG較多,但Rewrite模式是可以正常使用的,在這個模式下,可以將首頁、文章頁、單頁、分類頁、Tag頁都生成靜態化文件,并保存在一個名為super-static-cache的目錄下,直接復制這個目錄即可得到一個靜態化網站。

          因此,一個更簡單的生成靜態化網站的方法來了,先在網站安裝Super Static Cache,之后運行一個抓取網站的工具,這類工具很多,例如wget、sitemaps生成器之類的,把整個網站抓一遍(wget還能多生成一份),即可在super-static-cache的目錄獲取到網站的靜態化Html文件。

          wget在Windows、Linux、Mac都有,用wget下載網站的命令是:

          wget -m 網站地址

          注“愛當程序員的我”,每天都有關于編程頭條發布


          今天講的是使用python爬取一個網頁上面的所有超鏈接,如果電腦里面有python的話可以動手實驗一下,提高一下優越感。

          爬蟲在實際生活中還是十分常見的,比如說國內最大的爬蟲——百度。所以說爬蟲做的好就可以賺錢了。

          今天講的這個也很簡單,爬取網頁超鏈接,但是有前提那就是這是一張靜態的網頁,動態的網頁有點難搞,小編還不是很會,等學會了在分享給大家。


          首先我們需要引入我們要用的包,這里我們使用了python里面自帶的包

          引包

          urllib.request是python操作url的包,re是python正則表達式的包

          首先我們寫一個獲取網頁源代碼的函數

          獲取網頁源代碼

          然后我們就要寫一個提取出網頁源代碼的超鏈接的函數

          獲取網頁超鏈接

          接下來我們就可以測試一下了

          測試

          我們就可以去看看url.txt里面的東西了

          url.txt內容

          我們發現里面有很多不是url,那個是因為在編寫網頁的時候使用的是相對路徑,所以會出現這種情況。但是這并不影響我們分析頭條首頁的超鏈接,基本上都不是本站的連接,說明頭條的廣告業務有點繁忙,當然這只是小編的猜測,萬一頭條有很多的域名呢?


          結束語:

          如果喜歡這篇頭條,一定要收藏喲^O^

          點擊關注,了解更多關于編程的知識^O^

          如果有不懂的地方,可以留言,相互探討,相互學習,共同進步^O^

          理數據

          前面我們說過了通過 requests 庫獲取數據,這里我們要說如何處理數據

          處理數據我們需要用到一個強大的第三方庫——BeautifulSoup !

          “美味的湯,綠色的濃湯,在熱氣騰騰的蓋碗里裝!誰不愿意嘗一嘗,這樣的好湯?晚餐用的湯,美味的湯!”

          BeautifulSoup 庫的名字取自劉易斯·卡羅爾在《愛麗絲夢游仙境》里的同名詩歌。就像它在仙境中的說法一樣,BeautifulSoup 嘗試化平淡為神奇。它通過定位 HTML 標簽來格式化和組織復雜的網頁源代碼,用簡單易用的 Python 對象為我們展現出 HTML 結構信息。

          處理數據分為兩步:

          解析數據:將網頁源代碼解析成 Python 能“讀懂”的格式

          提取數據:將網頁源代碼中無關數據過濾掉,只提取出我們所需要的數據

          解析數據

          我們以豆瓣讀書 Top250 為例,它的網址是:https://book.douban.com/top250。

          我們來看看如何將其網頁源代碼解析成 BeautifulSoup 對象:

          import requests
          from bs4 import BeautifulSoup
          
          headers={
            'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'
          }
          res=requests.get('https://book.douban.com/top250', headers=headers)
          soup=BeautifulSoup(res.text, 'html.parser')

          Tips:相比之前我們添加 headers 參數,這是為了應對豆瓣的反爬蟲機制。

          我們通過 from bs4 import BeautifulSoup 語句導入 BeautifulSoup,然后使用 BeautifulSoup(res.text, 'html.parser') 語句將網頁源代碼的字符串形式解析成了 BeautifulSoup 對象。

          創建 BeautifulSoup 對象時需要傳入兩個參數,第一個參數是要解析的 HTML 文本,即網站源代碼的字符串形式(res.text)。第二個參數是 解析HTML 的解析器,html.parser 是 Python 中內置的解析器,較為簡單方便.


          我們將網頁源代碼解析成了 BeautifulSoup 對象,如果我們將他打印出來會發現竟然和原來的網頁源代碼(也就是 res.text)一模一樣!既然都一樣,我們何苦費這么大力將網頁源代碼解析成 BeautifulSoup 對象 呢?

          相比字符串,BeautifulSoup 對象 里有很多強大的方法和屬性。通過這些方法和屬性,我們就能方便快捷地提取出我們所需要的數據。

          提取數據

          BeautifulSoup 對象 里的方法和屬性有很多,我們這里只提及其中最常用的一些,這些足以應付大多數場景。

          find() 方法和 find_all() 方法

          BeautifulSoup 對象 里的 find() 和 find_all() 是我們提取數據最常用的兩個方法。借助它們,我們可以過濾掉 HTML 頁面里的無用數據,輕松地找到我們需要的數據。

          我們來看一下 find() 和 find_all() 的作用和區別:


          我們可以通過例子來更好地理解他們:
          假設我們獲取到的網頁源代碼如下:

          <div class="content">
            <a href="https://douban.com">登錄/注冊</a>
            <h1>豆瓣讀書 Top 250</h1>
            <div class="artile">
              <a href="https://movie.douban.com">豆瓣電影</a>
              <div class="item">
                <a href="https://book.douban.com/subject/1770782/">追風箏的人</a>
              </div>
              <div class="item">
                <a href="https://book.douban.com/subject/25862578/">解憂雜貨店</a>
              </div>
              <div class="item">
                <a href="https://book.douban.com/subject/1084336/">小王子</a>
              </div>
            </div>
          </div>
          soup=BeautifulSoup(res.text, 'html.parser')
          print(soup.find('a'))
          # 輸出:<a href="https://douban.com">登錄/注冊</a>
          print(soup.find_all('a'))
          # 輸出:[
          # <a href="https://douban.com">登錄/注冊</a>,
          # <a href="https://movie.douban.com">豆瓣電影</a>,
          # <a href="https://book.douban.com/subject/1770782/">追風箏的人</a>,
          # <a href="https://book.douban.com/subject/25862578/">解憂雜貨店</a>,
          # <a href="https://book.douban.com/subject/1084336/">小王子</a>
          # ]

          它倆的用法基本一樣,都是傳入 HTML 標簽名稱,返回符合該 HTML 標簽的數據。區別是 find() 方法只返回第一個符合條件的標簽,而 find_all() 方法返回所有符合條件的標簽列表。他們的返回值分別是 BeautifulSoup 中的 Tag 對象 和由 Tag 對象組成的列表。(后面會提到)

          除了傳入 HTML 標簽名稱 外,這兩個方法還支持傳入 HTML 屬性 進行篩選,返回符合條件的數據。舉個例子:

          # 查找 id='doubanapp-tip' 的 div 標簽
          soup.find('div', id='doubanapp-tip')
          # 查找所有 class='rating_nums' 的 span 標簽
          soup.find_all('span', class_='rating_nums')

          class 和 id 這兩個 HTML 屬性 具有很強的標識性,因此是數據篩選中最常用的兩個屬性,我們要重點關注。

          Tips:因為 class 是 Python 中定義類的關鍵字,因此用 class_ 表示 HTML 中的 class。

          通過 id、class 等 HTML 屬性的篩選,我們就可以快速準確的找到我們需要的數據。當一個條件無法精確定位到我們想要的數據時,我們還可以傳入多個 HTML 屬性進行篩選,返回同時符合這些條件的數據。

          我們再來看個例子:

          # 查找 id='doubanapp-tip' 且 class='rating_nums' 的 div 標簽
          soup.find('div', id='doubanapp-tip', class_='rating_nums')

          Tag對象

          BeautifulSoup 將 HTML 中的元素封裝成了 Tag 對象。和 BeautifulSoup 對象 一樣,Tag 對象 里也有 find() 和 find_all() 方法。因此,我們可以不斷地調用這兩個方法,一層一層地找到我們需要的數據。我們還是以前面的 HTML 代碼為例提取其中的書名:

          <div class="content">
            <a href="https://douban.com">登錄/注冊</a>
            <h1>豆瓣讀書 Top 250</h1>
            <div class="books">
              <a href="https://movie.douban.com">豆瓣電影</a>
              <div class="item">
                <a href="https://book.douban.com/subject/1770782/">追風箏的人</a>
              </div>
              <div class="item">
                <a href="https://book.douban.com/subject/25862578/">解憂雜貨店</a>
              </div>
              <div class="item">
                <a href="https://book.douban.com/subject/1084336/">小王子</a>
              </div>
            </div>
          </div>

          我們可以看到,書名在 a 標簽 中。但如果直接使用 soup.find_all(‘a’) 的話,第二行的“登錄/注冊”和第五行的“豆瓣電影”也會被獲取到,因此我們需要將這些無效數據過濾掉。

          我們分析一下不難發現,書名在 class=“item” 的 div 標簽 里的 a 標簽 內。我們只要先找到所有 class=“item” 的 div 標簽,然后再找到其中的 a 標簽 即可,因此我們可以像下面這樣來獲取書名的數據:

          # 找到所有 class_='item' 的 div 標簽
          items=soup.find_all('div', class_='item')
          for i in items:
            # 找到 class_='item' 的 div 標簽中的 a 標簽
            print(i.find('a'))
          # 輸出:
          # <a href="https://book.douban.com/subject/1770782/">追風箏的人</a>
          # <a href="https://book.douban.com/subject/25862578/">解憂雜貨店</a>
          # <a href="https://book.douban.com/subject/1084336/">小王子</a>

          這樣,我們就找到了所有書名的數據。此時返回的還是 Tag 對象。如果我們只想要書名和對應的鏈接呢?這就用到了 Tag 對象 的 text 屬性和 HTML 屬性名取值。

          items=soup.find_all('div', class_='item')
          for i in items:
            tag=i.find('a')
            # 獲取 text 屬性
            name=tag.text
            # 獲取 href 屬性值
            link=tag['href']
            print(name, link)
          # 輸出:
          # 追風箏的人 https://book.douban.com/subject/1770782/
          # 解憂雜貨店 https://book.douban.com/subject/25862578/
          # 小王子 https://book.douban.com/subject/1084336/

          我們通過 Tag 對象 的 text 屬性拿到了 a 標簽里的文字內容,即 追風箏的人 等。然后我們通過和字典取值一樣的方式,將 HTML 屬性名 作為鍵,得到了對應屬性的值。這里是以 href 屬性為例,其他的 HTML 屬性也同樣可以。


          我們來總結一下 Tag 對象 的常用屬性和方法:


          CSS選擇器

          有沒有什么方法可以直接就找到我們需要的數據,而不用多次查找嗎?

          答案是肯定的,需要用到 CSS 選擇器。

          在 CSS 選擇器中,# 代表 id,. 代表 class。比如:#login 表示 id=‘login’ 的所有元素,.item 表示 class=‘item’ 的所有元素。

          我們也可以直接通過標簽名選擇對應的元素,比如:a 表示所有的 a 元素,p 表示所有的 p 元素。

          它們也可以組合在一起,選擇同時符合條件的元素,比如:a#login 表示所有 id=‘login’ 的 a 元素,p.item 表示所有 class=‘item’ 的 p 元素,#login.item 表示所有 id=‘login’ 且 class=‘item’ 的元素,.item.book 表示所有 class 同時為 item 和 book 的元素。

          需要注意的是,選擇同時符合條件的元素,選擇器之間不能有空格,如果寫成 .item .book 就是另一個意思了。這是新的知識點——子元素選擇。

          當兩個選擇器之間加了空格,表示子元素選擇。還是以 .item .book 為例,它表示選擇所有 class=‘item’ 的元素里面 class=‘book’ 的元素,即嵌套在 class=‘item’ 的元素里面 class=‘book’ 的元素。

          這個嵌套可以是任意層級的,只要在里面就行,不要求直接嵌套在第一層。如果只需要直接嵌套在第一層符合條件的元素,可以用 > 分隔。比如:.item > .book。

          來看個例子感受一下它們的區別:

          from bs4 import BeautifulSoup
          
          html='''
          <div class="item">
            <p class="book">小王子</p>
            <div class="hot">
              <p class="book">追風箏的人</p>
            </div>
          </div>'''
          
          soup=BeautifulSoup(html, 'html.parser')
          
          print(soup.select('.item.book'))
          # 輸出:[]
          
          print(soup.select('.item .book'))
          # 輸出:[<p class="book">小王子</p>, <p class="book">追風箏的人</p>]
          
          print(soup.select('.item > .book'))
          # 輸出:[<p class="book">小王子</p>]

          了解了 CSS 選擇器的基本語法后,我們來看看如何在 BeautifulSoup 中使用。

          BeautifulSoup 對象 有一個 select() 方法,我們將 CSS 選擇器 傳進去即可直接找到我們需要的元素。上面查找在 class=“item” 的 div 標簽 里的 a 標簽 的代碼就可以這樣寫:

          items=soup.select('div.item a')
          for i in items:
            name=i.text
            link=i['href']
            print(name, link)
          # 輸出:
          # 追風箏的人 https://book.douban.com/subject/1770782/
          # 解憂雜貨店 https://book.douban.com/subject/25862578/
          # 小王子 https://book.douban.com/subject/1084336/

          靜態網頁爬蟲的過程

          對于靜態網頁爬蟲的過程,可以總結成下圖:


          我們現在對豆瓣top250中的前25個電影的名字以及名字進行爬取:

          import requests
          from bs4 import BeautifulSoup
          
          headers={
              'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.41 Safari/537.36 Edg/101.0.1210.32'
          }
          
          #首先對網頁發出請求并獲得響應
          req=requests.get('https://movie.douban.com/top250',headers=headers)
          #將網頁的源代碼形式解析
          soup=BeautifulSoup(req.text,'html.parser')
          
          #進行元素的第一次提取
          result1=soup.select('.item .pic')
          
          num=0
          for i in result1:
              num +=1
              name=i.select('a img')[0]['alt']
              link=i.select('a')[0]['href']
              print(num,' ',name,link)

          結果:



          文章知識點與官方知識檔案匹配,可進一步學習相關知識 , 免費領取有關于java面試題材料和講解!


          原文出處:https://blog.csdn.net/zyb18507175502/article/details/124636025?spm=1001.2100.3001.7377&utm_medium=distribute.pc_feed_blog_category.none-task-blog-classify_tag-5-124636025-null-null.nonecase&depth_1-utm_source=distribute.pc_feed_blog_category.none-task-blog-classify_tag-5-124636025-null-null.nonecase


          主站蜘蛛池模板: 在线观看日韩一区| 天堂一区二区三区精品| 久久人妻内射无码一区三区| 国内精品视频一区二区三区八戒| 99久久精品国产一区二区成人| 国产精品电影一区| 亚洲午夜一区二区三区| 亚洲AV成人一区二区三区观看| 国产日本亚洲一区二区三区| 久久无码人妻一区二区三区午夜| 国模吧一区二区三区| 亚洲午夜精品一区二区公牛电影院 | 久久久99精品一区二区| 香蕉免费看一区二区三区| 久99精品视频在线观看婷亚洲片国产一区一级在线 | 免费观看日本污污ww网站一区| 国产在线不卡一区| 99国产精品一区二区| 精品无码av一区二区三区| 伊人无码精品久久一区二区| 痴汉中文字幕视频一区| 国产内射999视频一区| 蜜桃AV抽搐高潮一区二区| 无码人妻精品一区二| 国产精品分类视频分类一区| 精品午夜福利无人区乱码一区| 一本AV高清一区二区三区| 一本大道东京热无码一区| 一区二区三区在线播放视频| 中文字幕日韩精品一区二区三区| 少妇激情一区二区三区视频 | 精品国产一区二区三区在线观看 | 亚洲国产一区在线| 国产精品被窝福利一区 | 国产在线第一区二区三区| 久久精品亚洲一区二区三区浴池| 视频一区在线播放| 麻豆高清免费国产一区| 精品国产高清自在线一区二区三区| 国模无码视频一区| 在线观看午夜亚洲一区|