1 正則表達(dá)式如果你對(duì)正則表達(dá)式還不熟悉,或是需要一些提示,那么你可以查閱https://docs.python.org/" />

国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁(yè) > 營(yíng)銷資訊 > 網(wǎng)站運(yùn)營(yíng) > 3種網(wǎng)頁(yè)抓取方法

3種網(wǎng)頁(yè)抓取方法

時(shí)間:2023-06-08 03:21:02 | 來(lái)源:網(wǎng)站運(yùn)營(yíng)

時(shí)間:2023-06-08 03:21:02 來(lái)源:網(wǎng)站運(yùn)營(yíng)

3種網(wǎng)頁(yè)抓取方法:3種抓取其中數(shù)據(jù)的方法。首先是正則表達(dá)式,然后是流行的BeautifulSoup模塊,最后是強(qiáng)大的lxml模塊。

1 正則表達(dá)式

如果你對(duì)正則表達(dá)式還不熟悉,或是需要一些提示,那么你可以查閱https://docs.python.org/2/howto/regex.html獲得完整介紹。即使你使用過(guò)其他編程語(yǔ)言的正則表達(dá)式,我依然推薦你一步一步溫習(xí)一下Python中正則表達(dá)式的寫法。
由于每章中都可能構(gòu)建或使用前面章節(jié)的內(nèi)容,因此我建議你按照類似本書代碼庫(kù)的文件結(jié)構(gòu)進(jìn)行配置。所有代碼都可以從代碼庫(kù)的code目錄中運(yùn)行,以便導(dǎo)入工作正常。如果你希望創(chuàng)建一個(gè)不同的結(jié)構(gòu),請(qǐng)注意需要變更所有來(lái)自其他章的導(dǎo)入操作(比如下述代碼中的from chp1.advanced_link_crawler)。

當(dāng)我們使用正則表達(dá)式抓取國(guó)家(或地區(qū))面積數(shù)據(jù)時(shí),首先需要嘗試匹配``元素中的內(nèi)容,如下所示。

  1. >>> import re
  2. >>> from chp1.advanced_link_crawler import download
  3. >>> url = 'http://example.python-scraping.com/view/UnitedKingdom-239'
  4. >>> html = download(url)
  5. >>> re.findall(r'(.*?)', html)
  6. ['<img />
  7. ',
  8. '244,820 square kilometres',
  9. '62,348,447',
  10. 'GB',
  11. 'United Kingdom',
  12. 'London',
  13. '<a>EU</a>
  14. ',
  15. '.uk',
  16. 'GBP',
  17. 'Pound',
  18. '44',
  19. '@# #@@|@## #@@|@@# #@@|@@## #@@|@#@ #@@|@@#@ #@@|GIR0AA',
  20. '^(([A-Z]d{2}[A-Z]{2})|([A-Z]d{3}[A-Z]{2})|([A-Z]{2}d{2} [A-Z]{
  21. 2})|([A-Z]{2}d{3}[A-Z]{2})|([A-Z]d[A-Z]d[A-Z]{2}) |([A-Z]{2}d[A-Z]
  22. d[A-Z]{2})|(GIR0AA))$',
  23. 'en-GB,cy-GB,gd',
  24. '<div><a>IE </a></div>
  25. ']
從上述結(jié)果中可以看出,多個(gè)國(guó)家(或地區(qū))屬性都使用了``標(biāo)簽。如果我們只想抓取國(guó)家(或地區(qū))面積,可以只選擇第二個(gè)匹配的元素,如下所示。

  1. >>> re.findall('(.*?)', html)[1]
  2. '244,820 square kilometres'
雖然現(xiàn)在可以使用這個(gè)方案,但是如果網(wǎng)頁(yè)發(fā)生變化,該方案很可能就會(huì)失效。比如表格發(fā)生了變化,去除了第二個(gè)匹配元素中的面積數(shù)據(jù)。如果我們只在當(dāng)下抓取數(shù)據(jù),就可以忽略這種未來(lái)可能發(fā)生的變化。但是,如果我們希望在未來(lái)某一時(shí)刻能夠再次抓取該數(shù)據(jù),就需要給出更加健壯的解決方案,從而盡可能避免這種布局變化所帶來(lái)的影響。想要該正則表達(dá)式更加明確,我們可以將其父元素``也加入進(jìn)來(lái),由于該元素具有ID屬性,所以應(yīng)該是唯一的。

  1. >>> re.findall('<label for="places_area">Area: </label>
  2. (.*?)', html)
  3. ['244,820 square kilometres']
這個(gè)迭代版本看起來(lái)更好一些,但是網(wǎng)頁(yè)更新還有很多其他方式,同樣可以讓該正則表達(dá)式無(wú)法滿足。比如,將雙引號(hào)變?yōu)閱我?hào),`標(biāo)簽之間添加多余的空格,或是變更area_label`等。下面是嘗試支持這些可能性的改進(jìn)版本。

  1. >>> re.findall('''.*?<tds>(.*?)''', html)
  2. ['244,820 square kilometres']
雖然該正則表達(dá)式更容易適應(yīng)未來(lái)變化,但又存在難以構(gòu)造、可讀性差的問(wèn)題。此外,還有很多其他微小的布局變化也會(huì)使該正則表達(dá)式無(wú)法滿足,比如在`標(biāo)簽里添加title屬性,或者tr、td`元素修改了它們的CSS類或ID。

從本例中可以看出,正則表達(dá)式為我們提供了抓取數(shù)據(jù)的快捷方式,但是該方法過(guò)于脆弱,容易在網(wǎng)頁(yè)更新后出現(xiàn)問(wèn)題。幸好,還有更好的數(shù)據(jù)抽取解決方案,比如我們將在本章介紹的其他抓取庫(kù)。

2 Beautiful Soup

Beautiful Soup

是一個(gè)非常流行的Python庫(kù),它可以解析網(wǎng)頁(yè),并提供了定位內(nèi)容的便捷接口。如果你還沒(méi)有安裝該模塊,可以使用下面的命令安裝其最新版本。

  1. pip install beautifulsoup4
使用Beautiful Soup的第一步是將已下載的HTML內(nèi)容解析為soup文檔。由于許多網(wǎng)頁(yè)都不具備良好的HTML格式,因此Beautiful Soup需要對(duì)其標(biāo)簽開合狀態(tài)進(jìn)行修正。例如,在下面這個(gè)簡(jiǎn)單網(wǎng)頁(yè)的列表中,存在屬性值兩側(cè)引號(hào)缺失和標(biāo)簽未閉合的問(wèn)題。

  1. <ul>
  2. <li>Area
  3. </li><li>Population
  4. </li></ul>
如果Population列表項(xiàng)被解析為Area列表項(xiàng)的子元素,而不是并列的兩個(gè)列表項(xiàng)的話,我們?cè)谧トr(shí)就會(huì)得到錯(cuò)誤的結(jié)果。下面讓我們看一下Beautiful Soup是如何處理的。

  1. >>> from bs4 import BeautifulSoup
  2. >>> from pprint import pprint
  3. >>> broken_html = '<ul><li>Area</li><li>Population</li></ul>
  4. '
  5. >>> # parse the HTML
  6. >>> soup = BeautifulSoup(broken_html, 'html.parser')
  7. >>> fixed_html = soup.prettify()
  8. >>> pprint(fixed_html)
  9. <ul>
  10. <li>
  11. Area
  12. </li><li>
  13. Population
  14. </li>
  15. </ul>
我們可以看到,使用默認(rèn)的html.parser并沒(méi)有得到正確解析的HTML。從前面的代碼片段可以看出,由于它使用了嵌套的li元素,因此可能會(huì)導(dǎo)致定位困難。幸運(yùn)的是,我們還有其他解析器可以選擇。我們可以安裝LXML(2.2.3節(jié)中將會(huì)詳細(xì)介紹),或使用html5lib。要想安裝html5lib,只需使用pip。

  1. pip install html5lib
現(xiàn)在,我們可以重復(fù)這段代碼,只對(duì)解析器做如下變更。

  1. >>> soup = BeautifulSoup(broken_html, 'html5lib')
  2. >>> fixed_html = soup.prettify()
  3. >>> pprint(fixed_html)
  4. <ul>
  5. <li>
  6. Area
  7. </li>
  8. <li>
  9. Population
  10. </li>
  11. </ul>
此時(shí),使用了html5libBeautifulSoup已經(jīng)能夠正確解析缺失的屬性引號(hào)以及閉合標(biāo)簽,并且還添加了標(biāo)簽,使其成為完整的HTML文檔。當(dāng)你使用lxml時(shí),也可以看到類似的結(jié)果。

現(xiàn)在,我們可以使用find()find_all()方法來(lái)定位我們需要的元素了。

  1. >>> ul = soup.find('ul', attrs={'class':'country_or_district'})
  2. >>> ul.find('li') # returns just the first match
  3. <li>Area</li>
  4. >>> ul.find_all('li') # returns all matches
  5. [<li>Area</li>
  6. , <li>Population</li>

    想要了解可用方法和參數(shù)的完整列表,請(qǐng)?jiān)L問(wèn)Beautiful Soup的官方文檔。
下面是使用該方法抽取示例網(wǎng)站中國(guó)家(或地區(qū))面積數(shù)據(jù)的完整代碼。

  1. >>> from bs4 import BeautifulSoup
  2. >>> url = 'http://example.python-scraping.com/places/view/United-Kingdom-239'
  3. >>> html = download(url)
  4. >>> soup = BeautifulSoup(html)
  5. >>> # locate the area row
  6. >>> tr = soup.find(attrs={'id':'places_area__row'})
  7. >>> td = tr.find(attrs={'class':'w2p_fw'}) # locate the data element
  8. >>> area = td.text # extract the text from the data element
  9. >>> print(area)
  10. 244,820 square kilometres
這段代碼雖然比正則表達(dá)式的代碼更加復(fù)雜,但又更容易構(gòu)造和理解。而且,像多余的空格和標(biāo)簽屬性這種布局上的小變化,我們也無(wú)須再擔(dān)心了。我們還知道即使頁(yè)面中包含了不完整的HTML,Beautiful Soup也能幫助我們整理該頁(yè)面,從而讓我們可以從非常不完整的網(wǎng)站代碼中抽取數(shù)據(jù)。

3 Lxml

Lxml

是基于libxml2這一XML解析庫(kù)構(gòu)建的Python庫(kù),它使用C語(yǔ)言編寫,解析速度比Beautiful Soup更快,不過(guò)安裝過(guò)程也更為復(fù)雜,尤其是在Windows中。最新的安裝說(shuō)明可以參考http://lxml.de/installation.html。如果你在自行安裝該庫(kù)時(shí)遇到困難,也可以使用Anaconda來(lái)實(shí)現(xiàn)。

你可能對(duì)Anaconda不太熟悉,它是由Continuum Analytics公司員工創(chuàng)建的主要專注于開源數(shù)據(jù)科學(xué)包的包和環(huán)境管理器。你可以按照其安裝說(shuō)明下載及安裝Anaconda。需要注意的是,使用Anaconda的快速安裝會(huì)將你的PYTHON_PATH設(shè)置為Conda的Python安裝位置。

和Beautiful Soup一樣,使用lxml模塊的第一步也是將有可能不合法的HTML解析為統(tǒng)一格式。下面是使用該模塊解析同一個(gè)不完整HTML的例子。

  1. >>> from lxml.html import fromstring, tostring
  2. >>> broken_html = '<ul><li>Area</li><li>Population</li></ul>
  3. '
  4. >>> tree = fromstring(broken_html) # parse the HTML
  5. >>> fixed_html = tostring(tree, pretty_print=True)
  6. >>> print(fixed_html)
  7. <ul>
  8. <li>Area</li>
  9. <li>Population</li>
  10. </ul>
同樣地,lxml也可以正確解析屬性兩側(cè)缺失的引號(hào),并閉合標(biāo)簽,不過(guò)該模塊沒(méi)有額外添加標(biāo)簽。這些都不是標(biāo)準(zhǔn)XML的要求,因此對(duì)于lxml來(lái)說(shuō),插入它們并不是必要的。

解析完輸入內(nèi)容之后,進(jìn)入選擇元素的步驟,此時(shí)lxml有幾種不同的方法,比如XPath選擇器和類似Beautiful Soup的find()方法。不過(guò),在本例中,我們將會(huì)使用CSS選擇器,因?yàn)樗雍?jiǎn)潔,并且能夠在第5章解析動(dòng)態(tài)內(nèi)容時(shí)得以復(fù)用。一些讀者可能由于他們?cè)趈Query選擇器方面的經(jīng)驗(yàn)或是前端Web應(yīng)用開發(fā)中的使用對(duì)它們已經(jīng)有所熟悉。在本章的后續(xù)部分,我們將對(duì)比這些選擇器與XPath的性能。要想使用CSS選擇器,你可能需要先安裝cssselect庫(kù),如下所示。

  1. pip install cssselect
現(xiàn)在,我們可以使用lxml的CSS選擇器,抽取示例頁(yè)面中的面積數(shù)據(jù)了。

  1. >>> tree = fromstring(html)
  2. >>> td = tree.cssselect('tr#places_area__row > td.w2p_fw')[0]
  3. >>> area = td.text_content()
  4. >>> print(area)
  5. 244,820 square kilometres



通過(guò)對(duì)代碼樹使用cssselect方法,我們可以利用CSS語(yǔ)法來(lái)選擇表格中ID為places_area__row的行元素,然后是類為w2p_fw的子表格數(shù)據(jù)標(biāo)簽。由于cssselect返回的是一個(gè)列表,我們需要獲取其中的第一個(gè)結(jié)果,并調(diào)用text_content方法,以迭代所有子元素并返回每個(gè)元素的相關(guān)文本。在本例中,盡管我們只有一個(gè)元素,但是該功能對(duì)于更加復(fù)雜的抽取示例來(lái)說(shuō)非常有用。

本文摘自:《用Python寫網(wǎng)絡(luò)爬蟲(第2版)》
作者:[德]凱瑟琳 雅姆爾(Katharine Jarmul)、[澳]理查德 勞森(Richard Lawson)
譯者:李斌




針對(duì)Python 3.6版本編寫。

提供示例完整源碼和實(shí)例網(wǎng)站搭建源碼,確保用戶能在本地成功復(fù)現(xiàn)爬取網(wǎng)站環(huán)境,并保障網(wǎng)站的穩(wěn)定性與可靠性以及代碼運(yùn)行結(jié)果的可再現(xiàn)性。

Internet上包含了許多有用的數(shù)據(jù),其中大部分是可以免費(fèi)公開訪問(wèn)的。但是,這些數(shù)據(jù)不容易使用,它們內(nèi)嵌在網(wǎng)站的架構(gòu)和樣式中,在提取時(shí)也需要多加小心。網(wǎng)絡(luò)爬取技術(shù)作為一種收集和理解網(wǎng)絡(luò)杭州量信息的方式,正變得越來(lái)越有用。

本書是使用Python 3.6的新特性來(lái)爬取網(wǎng)絡(luò)數(shù)據(jù)的入門指南。本書講解了從靜態(tài)網(wǎng)站提取數(shù)據(jù)的方法,以及如何使用數(shù)據(jù)庫(kù)和文件緩存技術(shù)來(lái)節(jié)省時(shí)間并管理服務(wù)器負(fù)載,然后介紹了如何使用瀏覽器、爬蟲和并發(fā)爬蟲開發(fā)一個(gè)更為復(fù)雜的爬蟲。

借助于PyQt和Selenium,你可以決定何時(shí)以及如何從依賴JavaScript的網(wǎng)站上爬取數(shù)據(jù),以及更好地理解在受CAPTCHA保護(hù)的復(fù)雜網(wǎng)站上提交表單的方法。本書還講解了使用Python包(比如mechanize)進(jìn)行自動(dòng)化處理的方法、使用Scrapy庫(kù)創(chuàng)建基于類的爬蟲的方法,以及如何在真實(shí)的網(wǎng)站上實(shí)施所學(xué)的爬蟲技巧。

本書最后還涵蓋了使用爬蟲對(duì)網(wǎng)站進(jìn)行測(cè)試、遠(yuǎn)程爬取技術(shù)、圖像處理以及其他相關(guān)的主題。



關(guān)鍵詞:方法

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點(diǎn)擊下載Chrome瀏覽器
關(guān)閉