Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 日韩在线一区二区,亚洲1区2区3区4区,国产在线视频国产永久视频

          整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          WordPress生成HTML靜態(tài)化網(wǎng)站

          WordPress生成HTML靜態(tài)化網(wǎng)站

          前,我寫過一個(gè)“WordPress的靜態(tài)化方法”,使用的是一個(gè)名為cos-html-cache的插件實(shí)現(xiàn)。

          這個(gè)插件非常簡潔小巧,直接在原網(wǎng)站上生成首頁和文章頁的html文件,不過,這個(gè)插件只支持文章靜態(tài)化,不支持頁面、標(biāo)簽和分類的靜態(tài)化,之后也再?zèng)]有過更新。

          后來,我想到過利用WordPress插件導(dǎo)出全靜態(tài)化網(wǎng)站的方法,用這個(gè)方法,對于少量文章挺方便,但文章數(shù)量一旦多了,就經(jīng)常出錯(cuò)。

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

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

          wget在Windows、Linux、Mac都有,用wget下載網(wǎng)站的命令是:

          wget -m 網(wǎng)站地址

          注“愛當(dāng)程序員的我”,每天都有關(guān)于編程頭條發(fā)布


          今天講的是使用python爬取一個(gè)網(wǎng)頁上面的所有超鏈接,如果電腦里面有python的話可以動(dòng)手實(shí)驗(yàn)一下,提高一下優(yōu)越感。

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

          今天講的這個(gè)也很簡單,爬取網(wǎng)頁超鏈接,但是有前提那就是這是一張靜態(tài)的網(wǎng)頁,動(dòng)態(tài)的網(wǎng)頁有點(diǎn)難搞,小編還不是很會(huì),等學(xué)會(huì)了在分享給大家。


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

          引包

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

          首先我們寫一個(gè)獲取網(wǎng)頁源代碼的函數(shù)

          獲取網(wǎng)頁源代碼

          然后我們就要寫一個(gè)提取出網(wǎng)頁源代碼的超鏈接的函數(shù)

          獲取網(wǎng)頁超鏈接

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

          測試

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

          url.txt內(nèi)容

          我們發(fā)現(xiàn)里面有很多不是url,那個(gè)是因?yàn)樵诰帉懢W(wǎng)頁的時(shí)候使用的是相對路徑,所以會(huì)出現(xiàn)這種情況。但是這并不影響我們分析頭條首頁的超鏈接,基本上都不是本站的連接,說明頭條的廣告業(yè)務(wù)有點(diǎn)繁忙,當(dāng)然這只是小編的猜測,萬一頭條有很多的域名呢?


          結(jié)束語:

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

          點(diǎn)擊關(guān)注,了解更多關(guān)于編程的知識^O^

          如果有不懂的地方,可以留言,相互探討,相互學(xué)習(xí),共同進(jìn)步^O^

          理數(shù)據(jù)

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

          處理數(shù)據(jù)我們需要用到一個(gè)強(qiáng)大的第三方庫——BeautifulSoup !

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

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

          處理數(shù)據(jù)分為兩步:

          解析數(shù)據(jù):將網(wǎng)頁源代碼解析成 Python 能“讀懂”的格式

          提取數(shù)據(jù):將網(wǎng)頁源代碼中無關(guān)數(shù)據(jù)過濾掉,只提取出我們所需要的數(shù)據(jù)

          解析數(shù)據(jù)

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

          我們來看看如何將其網(wǎng)頁源代碼解析成 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 參數(shù),這是為了應(yīng)對豆瓣的反爬蟲機(jī)制。

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

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


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

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

          提取數(shù)據(jù)

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

          find() 方法和 find_all() 方法

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

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


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

          <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/">追風(fēng)箏的人</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/">追風(fēng)箏的人</a>,
          # <a href="https://book.douban.com/subject/25862578/">解憂雜貨店</a>,
          # <a href="https://book.douban.com/subject/1084336/">小王子</a>
          # ]

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

          除了傳入 HTML 標(biāo)簽名稱 外,這兩個(gè)方法還支持傳入 HTML 屬性 進(jìn)行篩選,返回符合條件的數(shù)據(jù)。舉個(gè)例子:

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

          class 和 id 這兩個(gè) HTML 屬性 具有很強(qiáng)的標(biāo)識性,因此是數(shù)據(jù)篩選中最常用的兩個(gè)屬性,我們要重點(diǎn)關(guān)注。

          Tips:因?yàn)?class 是 Python 中定義類的關(guān)鍵字,因此用 class_ 表示 HTML 中的 class。

          通過 id、class 等 HTML 屬性的篩選,我們就可以快速準(zhǔn)確的找到我們需要的數(shù)據(jù)。當(dāng)一個(gè)條件無法精確定位到我們想要的數(shù)據(jù)時(shí),我們還可以傳入多個(gè) HTML 屬性進(jìn)行篩選,返回同時(shí)符合這些條件的數(shù)據(jù)。

          我們再來看個(gè)例子:

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

          Tag對象

          BeautifulSoup 將 HTML 中的元素封裝成了 Tag 對象。和 BeautifulSoup 對象 一樣,Tag 對象 里也有 find() 和 find_all() 方法。因此,我們可以不斷地調(diào)用這兩個(gè)方法,一層一層地找到我們需要的數(shù)據(jù)。我們還是以前面的 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/">追風(fēng)箏的人</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 標(biāo)簽 中。但如果直接使用 soup.find_all(‘a(chǎn)’) 的話,第二行的“登錄/注冊”和第五行的“豆瓣電影”也會(huì)被獲取到,因此我們需要將這些無效數(shù)據(jù)過濾掉。

          我們分析一下不難發(fā)現(xiàn),書名在 class=“item” 的 div 標(biāo)簽 里的 a 標(biāo)簽 內(nèi)。我們只要先找到所有 class=“item” 的 div 標(biāo)簽,然后再找到其中的 a 標(biāo)簽 即可,因此我們可以像下面這樣來獲取書名的數(shù)據(jù):

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

          這樣,我們就找到了所有書名的數(shù)據(jù)。此時(shí)返回的還是 Tag 對象。如果我們只想要書名和對應(yīng)的鏈接呢?這就用到了 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)
          # 輸出:
          # 追風(fēng)箏的人 https://book.douban.com/subject/1770782/
          # 解憂雜貨店 https://book.douban.com/subject/25862578/
          # 小王子 https://book.douban.com/subject/1084336/

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


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


          CSS選擇器

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

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

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

          我們也可以直接通過標(biāo)簽名選擇對應(yīng)的元素,比如:a 表示所有的 a 元素,p 表示所有的 p 元素。

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

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

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

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

          來看個(gè)例子感受一下它們的區(qū)別:

          from bs4 import BeautifulSoup
          
          html='''
          <div class="item">
            <p class="book">小王子</p>
            <div class="hot">
              <p class="book">追風(fēng)箏的人</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">追風(fēng)箏的人</p>]
          
          print(soup.select('.item > .book'))
          # 輸出:[<p class="book">小王子</p>]

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

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

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

          靜態(tài)網(wǎng)頁爬蟲的過程

          對于靜態(tài)網(wǎng)頁爬蟲的過程,可以總結(jié)成下圖:


          我們現(xiàn)在對豆瓣top250中的前25個(gè)電影的名字以及名字進(jìn)行爬取:

          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'
          }
          
          #首先對網(wǎng)頁發(fā)出請求并獲得響應(yīng)
          req=requests.get('https://movie.douban.com/top250',headers=headers)
          #將網(wǎng)頁的源代碼形式解析
          soup=BeautifulSoup(req.text,'html.parser')
          
          #進(jìn)行元素的第一次提取
          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)

          結(jié)果:



          文章知識點(diǎn)與官方知識檔案匹配,可進(jìn)一步學(xué)習(xí)相關(guān)知識 , 免費(fèi)領(lǐng)取有關(guān)于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


          主站蜘蛛池模板: 国产香蕉一区二区精品视频| 亚洲AV成人精品日韩一区18p| 97人妻无码一区二区精品免费 | 无码一区二区三区中文字幕| 日韩美一区二区三区| 国产成人无码aa精品一区| 国产一区二区三区内射高清| 一区二区三区中文字幕| 国模精品一区二区三区| 农村乱人伦一区二区 | 无码人妻久久一区二区三区免费丨| 亚洲日本va一区二区三区 | 国产免费播放一区二区| 国产激情视频一区二区三区| 亚洲一区二区三区写真| 国产av夜夜欢一区二区三区| 亚洲日韩精品一区二区三区| 伊人色综合一区二区三区影院视频| 国产成人精品一区二区三在线观看| 久久久精品日本一区二区三区| 日本免费一区二区三区| 日韩色视频一区二区三区亚洲| 亚洲毛片αv无线播放一区| 精品无人区一区二区三区| 日韩在线观看一区二区三区| 91麻豆精品国产自产在线观看一区| 无码人妻精品一区二区| 精品人妻一区二区三区四区| 一区二区三区日韩| 国产成人一区二区三区电影网站| 久久久91精品国产一区二区三区 | 国产福利一区二区在线视频 | 日韩成人一区ftp在线播放| 日韩精品无码一区二区三区AV| 一本一道波多野结衣AV一区| 变态拳头交视频一区二区| 国产Av一区二区精品久久| 无码欧精品亚洲日韩一区| 青娱乐国产官网极品一区| 久久精品日韩一区国产二区| 无码少妇一区二区性色AV|