爬蟲設計中,H5頁面是指使用HTML5技術構建的網頁。以下是幾個關于H5的爬蟲設計示例:
python復制代碼import requests from bs4 import BeautifulSoup url='http://example.com' # 目標H5頁面的URL response=requests.get(url) soup=BeautifulSoup(response.text, 'html.parser') # 使用BeautifulSoup解析H5頁面的內容 # ...
首先,確保已經安裝了Scrapy框架。然后,創建一個新的Scrapy項目,并在spiders目錄下創建一個新的爬蟲文件,例如h5_spider.py。在爬蟲文件中,可以使用Scrapy提供的API來爬取H5頁面。
python復制代碼import scrapy class H5Spider(scrapy.Spider): name='h5' allowed_domains=['example.com'] # 允許爬取的域名 start_urls=['http://example.com'] # 起始URL def parse(self, response): # 使用response對象處理H5頁面的內容 # ...
對于動態加載的H5頁面,使用常規的爬蟲方法可能無法獲取完整的內容。在這種情況下,可以使用Selenium模擬瀏覽器的行為來獲取完整的H5頁面。首先,確保已經安裝了Selenium庫。然后,使用以下代碼示例:
python復制代碼from selenium import webdriver from selenium.webdriver.chrome.options import Options import time url='http://example.com' # 目標H5頁面的URL chrome_options=Options() chrome_options.add_argument('--headless') # 在后臺運行瀏覽器,不彈出窗口 driver=webdriver.Chrome(options=chrome_options) # 創建瀏覽器實例 driver.get(url) # 打開目標頁面 time.sleep(2) # 等待頁面加載完成,根據實際情況調整等待時間 html=driver.page_source # 獲取完整的H5頁面內容 driver.quit() # 關閉瀏覽器實例 # 處理獲取到的H5頁面內容 # ...
這些示例展示了使用不同方法來爬取H5頁面的基本思路。根據具體的頁面結構和需求,你可能需要進一步調整代碼以處理頁面內容
種抓取其中數據的方法。首先是正則表達式,然后是流行的BeautifulSoup模塊,最后是強大的lxml模塊。
如果你對正則表達式還不熟悉,或是需要一些提示,那么你可以查閱https://docs.python.org/2/howto/regex.html獲得完整介紹。即使你使用過其他編程語言的正則表達式,我依然推薦你一步一步溫習一下Python中正則表達式的寫法。
由于每章中都可能構建或使用前面章節的內容,因此我建議你按照類似本書代碼庫的文件結構進行配置。所有代碼都可以從代碼庫的code目錄中運行,以便導入工作正常。如果你希望創建一個不同的結構,請注意需要變更所有來自其他章的導入操作(比如下述代碼中的from chp1.advanced_link_crawler)。
當我們使用正則表達式抓取國家(或地區)面積數據時,首先需要嘗試匹配``元素中的內容,如下所示。
>>> import re >>> from chp1.advanced_link_crawler import download >>> url='http://example.python-scraping.com/view/UnitedKingdom-239' >>> html=download(url) >>> re.findall(r'(.*?)', html) ['<img /> ', '244,820 square kilometres', '62,348,447', 'GB', 'United Kingdom', 'London', '<a>EU</a> ', '.uk', 'GBP', 'Pound', '44', '@# #@@|@## #@@|@@# #@@|@@## #@@|@#@ #@@|@@#@ #@@|GIR0AA', '^(([A-Z]d{2}[A-Z]{2})|([A-Z]d{3}[A-Z]{2})|([A-Z]{2}d{2} [A-Z]{ 2})|([A-Z]{2}d{3}[A-Z]{2})|([A-Z]d[A-Z]d[A-Z]{2}) |([A-Z]{2}d[A-Z] d[A-Z]{2})|(GIR0AA))$', 'en-GB,cy-GB,gd', '<div><a>IE </a></div> ']
從上述結果中可以看出,多個國家(或地區)屬性都使用了``標簽。如果我們只想抓取國家(或地區)面積,可以只選擇第二個匹配的元素,如下所示。
>>> re.findall('(.*?)', html)[1] '244,820 square kilometres'
雖然現在可以使用這個方案,但是如果網頁發生變化,該方案很可能就會失效。比如表格發生了變化,去除了第二個匹配元素中的面積數據。如果我們只在當下抓取數據,就可以忽略這種未來可能發生的變化。但是,如果我們希望在未來某一時刻能夠再次抓取該數據,就需要給出更加健壯的解決方案,從而盡可能避免這種布局變化所帶來的影響。想要該正則表達式更加明確,我們可以將其父元素``也加入進來,由于該元素具有ID屬性,所以應該是唯一的。
>>> re.findall('<label for="places_area">Area: </label> (.*?)', html) ['244,820 square kilometres']
這個迭代版本看起來更好一些,但是網頁更新還有很多其他方式,同樣可以讓該正則表達式無法滿足。比如,將雙引號變為單引號,`標簽之間添加多余的空格,或是變更area_label`等。下面是嘗試支持這些可能性的改進版本。
>>> re.findall('''.*?<tds>(.*?)''', html) ['244,820 square kilometres']
雖然該正則表達式更容易適應未來變化,但又存在難以構造、可讀性差的問題。此外,還有很多其他微小的布局變化也會使該正則表達式無法滿足,比如在`標簽里添加title屬性,或者tr、td`元素修改了它們的CSS類或ID。
從本例中可以看出,正則表達式為我們提供了抓取數據的快捷方式,但是該方法過于脆弱,容易在網頁更新后出現問題。幸好,還有更好的數據抽取解決方案,比如我們將在本章介紹的其他抓取庫。
Beautiful Soup
是一個非常流行的Python庫,它可以解析網頁,并提供了定位內容的便捷接口。如果你還沒有安裝該模塊,可以使用下面的命令安裝其最新版本。
pip install beautifulsoup4
使用Beautiful Soup的第一步是將已下載的HTML內容解析為soup文檔。由于許多網頁都不具備良好的HTML格式,因此Beautiful Soup需要對其標簽開合狀態進行修正。例如,在下面這個簡單網頁的列表中,存在屬性值兩側引號缺失和標簽未閉合的問題。
<ul> <li>Area </li><li>Population </li></ul>
如果Population列表項被解析為Area列表項的子元素,而不是并列的兩個列表項的話,我們在抓取時就會得到錯誤的結果。下面讓我們看一下Beautiful Soup是如何處理的。
>>> from bs4 import BeautifulSoup >>> from pprint import pprint >>> broken_html='<ul><li>Area</li><li>Population</li></ul> ' >>> # parse the HTML >>> soup=BeautifulSoup(broken_html, 'html.parser') >>> fixed_html=soup.prettify() >>> pprint(fixed_html) <ul> <li> Area </li><li> Population </li> </ul>
我們可以看到,使用默認的html.parser并沒有得到正確解析的HTML。從前面的代碼片段可以看出,由于它使用了嵌套的li元素,因此可能會導致定位困難。幸運的是,我們還有其他解析器可以選擇。我們可以安裝LXML(2.2.3節中將會詳細介紹),或使用html5lib。要想安裝html5lib,只需使用pip。
pip install html5lib
現在,我們可以重復這段代碼,只對解析器做如下變更。
>>> soup=BeautifulSoup(broken_html, 'html5lib') >>> fixed_html=soup.prettify() >>> pprint(fixed_html) <ul> <li> Area </li> <li> Population </li> </ul>
此時,使用了html5lib的BeautifulSoup已經能夠正確解析缺失的屬性引號以及閉合標簽,并且還添加了和標簽,使其成為完整的HTML文檔。當你使用lxml時,也可以看到類似的結果。
現在,我們可以使用find()和find_all()方法來定位我們需要的元素了。
>>> ul=soup.find('ul', attrs={'class':'country_or_district'}) >>> ul.find('li') # returns just the first match <li>Area</li> >>> ul.find_all('li') # returns all matches [<li>Area</li> , <li>Population</li>
想要了解可用方法和參數的完整列表,請訪問Beautiful Soup的官方文檔。
下面是使用該方法抽取示例網站中國家(或地區)面積數據的完整代碼。
>>> from bs4 import BeautifulSoup >>> url='http://example.python-scraping.com/places/view/United-Kingdom-239' >>> html=download(url) >>> soup=BeautifulSoup(html) >>> # locate the area row >>> tr=soup.find(attrs={'id':'places_area__row'}) >>> td=tr.find(attrs={'class':'w2p_fw'}) # locate the data element >>> area=td.text # extract the text from the data element >>> print(area) 244,820 square kilometres
這段代碼雖然比正則表達式的代碼更加復雜,但又更容易構造和理解。而且,像多余的空格和標簽屬性這種布局上的小變化,我們也無須再擔心了。我們還知道即使頁面中包含了不完整的HTML,Beautiful Soup也能幫助我們整理該頁面,從而讓我們可以從非常不完整的網站代碼中抽取數據。
Lxml
是基于libxml2這一XML解析庫構建的Python庫,它使用C語言編寫,解析速度比Beautiful Soup更快,不過安裝過程也更為復雜,尤其是在Windows中。最新的安裝說明可以參考http://lxml.de/installation.html。如果你在自行安裝該庫時遇到困難,也可以使用Anaconda來實現。
你可能對Anaconda不太熟悉,它是由Continuum Analytics公司員工創建的主要專注于開源數據科學包的包和環境管理器。你可以按照其安裝說明下載及安裝Anaconda。需要注意的是,使用Anaconda的快速安裝會將你的PYTHON_PATH設置為Conda的Python安裝位置。
和Beautiful Soup一樣,使用lxml模塊的第一步也是將有可能不合法的HTML解析為統一格式。下面是使用該模塊解析同一個不完整HTML的例子。
>>> from lxml.html import fromstring, tostring >>> broken_html='<ul><li>Area</li><li>Population</li></ul> ' >>> tree=fromstring(broken_html) # parse the HTML >>> fixed_html=tostring(tree, pretty_print=True) >>> print(fixed_html) <ul> <li>Area</li> <li>Population</li> </ul>
同樣地,lxml也可以正確解析屬性兩側缺失的引號,并閉合標簽,不過該模塊沒有額外添加和標簽。這些都不是標準XML的要求,因此對于lxml來說,插入它們并不是必要的。
解析完輸入內容之后,進入選擇元素的步驟,此時lxml有幾種不同的方法,比如XPath選擇器和類似Beautiful Soup的find()方法。不過,在本例中,我們將會使用CSS選擇器,因為它更加簡潔,并且能夠在第5章解析動態內容時得以復用。一些讀者可能由于他們在jQuery選擇器方面的經驗或是前端Web應用開發中的使用對它們已經有所熟悉。在本章的后續部分,我們將對比這些選擇器與XPath的性能。要想使用CSS選擇器,你可能需要先安裝cssselect庫,如下所示。
pip install cssselect
現在,我們可以使用lxml的CSS選擇器,抽取示例頁面中的面積數據了。
>>> tree=fromstring(html) >>> td=tree.cssselect('tr#places_area__row > td.w2p_fw')[0] >>> area=td.text_content() >>> print(area) 244,820 square kilometres
通過對代碼樹使用cssselect方法,我們可以利用CSS語法來選擇表格中ID為places_area__row的行元素,然后是類為w2p_fw的子表格數據標簽。由于cssselect返回的是一個列表,我們需要獲取其中的第一個結果,并調用text_content方法,以迭代所有子元素并返回每個元素的相關文本。在本例中,盡管我們只有一個元素,但是該功能對于更加復雜的抽取示例來說非常有用。
本文摘自:《用Python寫網絡爬蟲(第2版)》
作者:[德]凱瑟琳 雅姆爾(Katharine Jarmul)、[澳]理查德 勞森(Richard Lawson)
譯者:李斌
針對Python 3.6版本編寫。
提供示例完整源碼和實例網站搭建源碼,確保用戶能在本地成功復現爬取網站環境,并保障網站的穩定性與可靠性以及代碼運行結果的可再現性。
Internet上包含了許多有用的數據,其中大部分是可以免費公開訪問的。但是,這些數據不容易使用,它們內嵌在網站的架構和樣式中,在提取時也需要多加小心。網絡爬取技術作為一種收集和理解網絡上海量信息的方式,正變得越來越有用。
本書是使用Python 3.6的新特性來爬取網絡數據的入門指南。本書講解了從靜態網站提取數據的方法,以及如何使用數據庫和文件緩存技術來節省時間并管理服務器負載,然后介紹了如何使用瀏覽器、爬蟲和并發爬蟲開發一個更為復雜的爬蟲。
借助于PyQt和Selenium,你可以決定何時以及如何從依賴JavaScript的網站上爬取數據,以及更好地理解在受CAPTCHA保護的復雜網站上提交表單的方法。本書還講解了使用Python包(比如mechanize)進行自動化處理的方法、使用Scrapy庫創建基于類的爬蟲的方法,以及如何在真實的網站上實施所學的爬蟲技巧。
本書最后還涵蓋了使用爬蟲對網站進行測試、遠程爬取技術、圖像處理以及其他相關的主題。
TML5 對于初學者甚至是非程序員來說都有著十足的吸引力。實際上,只要你訪問網站,就會和 HTML 打交道。如果能夠熟悉一些關鍵的編程技巧,當你對網站做一些細節調整或優化基本的 Web 元素時就能節省大量的時間(甚至是金錢)。因此,本文精選了 10 個對于 Web 開發者來說非常實用的 HTML 編程技巧,而且它們不需要花太多時間精力就可以輕松掌握。
1. 可與本地緩存媒體資源交互
HTML5 FileSystem API 一開始被認為是 AppCache 的替代方案,用來實現資產的動態緩存。但是你知道嗎,其實你還可以用它來實現與用戶本地設備上存儲文件的交互。
例如,你可以在應用中添加以下功能:
注意:FileSystem API 僅被 Chrome 支持。
如果你想嘗試離線存儲功能,還可以參考以下資源和代碼教程:
2. 進行自動表單驗證
對于網站安全性和流暢的用戶體驗來說,表單驗證非常重要。所以我們應該讓用戶更輕松地在你的網站上輸入各種正確類型的值。
在 HTML5 中有幾種新的輸入類型可用,這些類型已經打包進了預定義的驗證功能:
但當你需要用戶提供某些標準輸入未指定的數據時(例如一個包含特殊字符的用戶名),往往就會出問題了。這就是“pattern”屬性派上用場的時候。
Pattern 可讓你定義自定義規則,然后使用正則表達式(RegEx)驗證表單輸入。RegEx 指定了<input>元素值將要檢查的表達式。
下面是一個添加新規則的示例。例如,你要指定密碼不應超過 15 個字符,并且只能包含小寫字母:
<form action="/action_page.php">
Password: <input?type="password"?name="pw"?pattern="[a-z].{1,15,}">
<input?type="submit">
</form>
為了更好地說明規則,你還可以添加一條自定義消息,告訴用戶為什么他們輸入的密碼不符合要求。只需再加上一行來自定義彈出消息即可:
<form action="/action_page.php">
Password: <input?type="password"?name="pw"?pattern="[a-z].{1,15,}"?title="One to fifteen characters, lowercase only".>>
<input?type="submit">
</form>
3. 為 HTML5 代碼元素創建縮寫
Emmet[4] 是一個很好用的文本編輯器插件,可以簡化你的 HTML/CSS 編碼流程。這個工具使用的語法類似于 CSS 的選擇器,可讓你為標準 HTML 代碼元素創建各種縮寫。
下面是一個例子。如果你輸入:
div#header>h1.logo>a{website}
則會收到:
<div?id="header">
<h1?class="logo"><a?href="">website</a></h1>
</div>
你可以使用 cheat sheet[5] 中的多種已有組合,也可以為任意 HTML 標簽創建自定義組合,然后按 Tab 或 Ctrl + E 將其添加到文本編輯器中。我自己是一名從事了多年開發的web前端老程序員,目前辭職在做自己的web前端私人定制課程,去年我花了一個月整理了一份最適合2019年學習的web前端學習干貨,各種框架都有整理,送給每一位前端小伙伴,想要獲取的可以關注我的頭條號并在后臺私信我:前端,即可免費獲取。
4. 實現更優的視頻傳輸
使用 video 標簽,可以將支持視頻播放的媒體播放器無縫嵌入到網頁中。
你可以選擇:
此外,你必須為視頻指定“控件”(例如播放、暫停和音量調節),否則用戶將沒有任何控件可用。這里的示例代碼如下:
<video width="768"?height="432"?autoplay>
<source?src="video.mp4"?type="video/mp4">
</video>
為了進一步改善觀看體驗,你還可以嘗試使用以下屬性:
你可以在這個 HTML 速查表 [7] 中找到更多使用方便的多媒體文件標簽。
5. 改善圖像的顯示方式
<picture>標簽有助于優化圖像的顯示方式。
它通常用于:
示例:
<picture>
<source?media="(min-width: 846px)"?srcset="img_1.jpg">
<source?media="(min-width: 300 px)"?srcset="img_2.jpg">
<img?src="img_3.jpg"?alt="logo">
</picture>
<picture>標簽包含兩個附加子元素:
要啟用其他樣式選項,請將以下屬性添加到<source>元素:
<img>元素可用來確保在不支持<picture>元素的瀏覽器中正確顯示圖像。
6. 提升首屏頁面的加載速度
如果你希望你的網站在搜索結果中獲得靠前的排名,并提供出色的用戶體驗,那么就需要重點關注頁面的加載速度。
但是,要在 Google Page Insights 中拿到高分并不是那么容易。雖然這一工具的確會標出你的網站上應該修復的內容,但是對于從頭開始對網站進行編碼的人們并沒有提供明確的優化指導。
谷歌對于首屏設計的官方建議 [8] 有些含糊不清:
所以我們來將其分解為更可操作的幾個步驟:
然后再次運行檢查任務,看看是否還有需要修復的內容。
7. 網站加速
只要將 .zip 文件而不是 index.html 文件發送給瀏覽器,就可以節省大量帶寬和下載時間。
圖片來自 betterexplained[11]
要設置 .gzip 壓縮,你需要在 web 主機 / 服務器上找到 htaccess 文件,并使用以下代碼對其進行修改:
<ifModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include?file?.(html?|txt|css|js|php|pl)$
mod_gzip_item_include handler ^cgi-script$
mod_gzip_item_include mime ^text/.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_exclude mime ^image/.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</ifModule>
如果這樣做不起作用,請參考下面這些針對不同 web 服務器類型的教程:
8. 利用 Microdata 進行 SEO
你可以使用 microdata 將額外的上下文編入網頁。然后,網絡爬蟲就可以從你的頁面中渲染微數據,并為用戶提供更好的瀏覽體驗,以更高的精確性對你的網站建立索引并為其提供更準確的搜索結果排名。
簡而言之,Microdata 由名稱 / 值(name/value)對組成,每一個項目(item)定義一組命名的屬性(property)。
9. 使用 HTML5 本地存儲代替 Cookie
Local Storage(也稱為 DOM 存儲)使你可以在本地存儲用戶數據,這樣就無需通過 HTTP 網絡請求發送數據了。它可以節省帶寬并提升數據存儲能力。看起來不錯吧?
但是有一個重要的警告:本地存儲僅能保存在客戶端,而 cookie 既可以保存在服務器端也可以在客戶端。因此,如果你的網站使用了服務器端的 Cookie 來基于已知的用戶首選項自定義內容,則遷移到本地存儲可能就需要重大的架構更改工作了。
但在比較簡單的情況下(例如你使用 Cookie 來存儲一些基本設置),本地存儲可能是一個很好的替代品,尤其是在網絡連接質量較差的區域。另外請記住,本地存儲對于高敏感數據(例如財務信息)可能不是理想的選擇,并且建議你對本地存儲的所有數據都進行額外的加密。
Jenkov 詳細介紹了如何設置和配置 HTML5 本地存儲 [13]。
10. 編寫有編號項目的降序列表
文章最后介紹一個非常簡單的技巧:你可以使用<reversed>屬性添加降序列表替代升序列表。
下面是一個示例代碼片段:
<ol?reversed>
<li>Ready</li>
<li>Set</li>
<li>Go!</li>
</ol>
聽起來可能沒有多大意義,但是當你想在頁面中添加一些時髦的樣式時,它可能就會派上用場了。
小結
現在你應該掌握了這 10 個新的 HTML5 技巧和竅門,它們應該可以幫助你構建更快、更人性化和更有吸引力的網站。不過千萬要記得,在開始實驗之前先對你的網站進行備份!
原文鏈接:https://mp.weixin.qq.com/s/qtQZUvsnIn0nsFbG51lQQw
作者:前端工匠
*請認真填寫需求信息,我們會在24小時內與您取得聯系。