對比四種爬蟲定位元素方法,你更愛哪個?

2021-02-20 AI科技大本營

作者 | 陳熹

來源 | 早起Python

頭圖 | 下載於視覺中國

在使用Python本爬蟲採集數據時,一個很重要的操作就是如何從請求到的網頁中提取數據,而正確定位想要的數據又是第一步操作。本文將對比幾種 Python 爬蟲中比較常用的定位網頁元素的方式供大家學習:

 1.傳統 BeautifulSoup 操作

 2.基於 BeautifulSoup 的 CSS 選擇器(與 PyQuery 類似)

 3.XPath

 4.正則表達式

參考網頁是當當網圖書暢銷總榜

http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1

我們以獲取第一頁 20 本書的書名為例,先確定網站沒有設置反爬措施,是否能直接返回待解析的內容:

import requests

url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1'
response = requests.get(url).text
print(response)


仔細檢查後發現需要的數據都在返回內容中,說明不需要特別考慮反爬舉措。

審查網頁元素後可以發現,書目信息都包含在 li 中,從屬於 class 為 bang_list clearfix bang_list_mode 的 ul 中。

進一步審查也可以發現書名在的相應位置,這是多種解析方法的重要基礎


經典的 BeautifulSoup 方法藉助 from bs4 import BeautifulSoup,然後通過 soup = BeautifulSoup(html, "lxml") 將文本轉換為特定規範的結構,利用 find系列方法進行解析,代碼如下:
import requests
from bs4 import BeautifulSoup

url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1'
response = requests.get(url).text

def bs_for_parse(response):
    soup = BeautifulSoup(response, "lxml")
    li_list = soup.find('ul', class_='bang_list clearfix bang_list_mode').find_all('li') # 鎖定ul後獲取20個li
    for li in li_list:
        title = li.find('div', class_='name').find('a')['title'] # 逐個解析獲取書名
        print(title)

if __name__ == '__main__':
    bs_for_parse(response)

成功獲取了 20 個書名,有些書面顯得冗長可以通過正則或者其他字符串方法處理,本文不作詳細介紹。基於 BeautifulSoup 的 CSS 選擇器這種方法實際上就是 PyQuery 中 CSS 選擇器在其他模塊的遷移使用,用法是類似的。關於 CSS 選擇器詳細語法可以參考:http://www.w3school.com.cn/cssref/css_selectors.asp由於是基於 BeautifulSoup 所以導入的模塊以及文本結構轉換都是一致的:
import requests
from bs4 import BeautifulSoup

url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1'
response = requests.get(url).text
        
def css_for_parse(response):
    soup = BeautifulSoup(response, "lxml") 
    print(soup)

if __name__ == '__main__':
    css_for_parse(response)

然後就是通過soup.select 輔以特定的 CSS 語法獲取特定內容,基礎依舊是對元素的認真審查分析:
import requests
from bs4 import BeautifulSoup
from lxml import html

url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1'
response = requests.get(url).text
        
def css_for_parse(response):
    soup = BeautifulSoup(response, "lxml")
    li_list = soup.select('ul.bang_list.clearfix.bang_list_mode > li')
    for li in li_list:
        title = li.select('div.name > a')[0]['title']
        print(title)

if __name__ == '__main__':
    css_for_parse(response)

XPath
XPath 即為 XML 路徑語言,它是一種用來確定 XML 文檔中某部分位置的計算機語言,如果使用 Chrome 瀏覽器建議安裝 XPath Helper 插件,會大大提高寫 XPath 的效率。之前的爬蟲文章基本都是基於 XPath,大家相對比較熟悉因此代碼直接給出:
import requests
from lxml import html

url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1'
response = requests.get(url).text

def xpath_for_parse(response):
    selector = html.fromstring(response)
    books = selector.xpath("//ul[@class='bang_list clearfix bang_list_mode']/li")
    for book in books:
        title = book.xpath('div[@class="name"]/a/@title')[0]
        print(title)

if __name__ == '__main__':
    xpath_for_parse(response)


 正則表達式如果對 HTML 語言不熟悉,那麼之前的幾種解析方法都會比較吃力。這裡也提供一種萬能解析大法:正則表達式,只需要關注文本本身有什麼特殊構造文法,即可用特定規則獲取相應內容。依賴的模塊是 re。首先重新觀察直接返回的內容中,需要的文字前後有什麼特殊:
import requests
import re

url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1'
response = requests.get(url).text
print(response)

觀察幾個數目相信就有答案了:<div><a href="http://product.dangdang.com/xxxxxxxx.html" target="_blank" title="xxxxxxx">書名就藏在上面的字符串中,蘊含的網址連結中末尾的數字會隨著書名而改變。
import requests
import re

url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1'
response = requests.get(url).text

def re_for_parse(response):
    reg = '<div class="name"><a href="http://product.dangdang.com/\d+.html" target="_blank" title="(.*?)">'
    for title in re.findall(reg, response):
        print(title)

if __name__ == '__main__':
    re_for_parse(response)

可以發現正則寫法是最簡單的,但是需要對於正則規則非常熟練。所謂正則大法好!

當然,不論哪種方法都有它所適用的場景,在真實操作中我們也需要在分析網頁結構來判斷如何高效的定位元素,最後附上本文介紹的四種方法的完整代碼,大家可以自行操作一下來加深體會。
import requests
from bs4 import BeautifulSoup
from lxml import html
import re

url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1'
response = requests.get(url).text

def bs_for_parse(response):
    soup = BeautifulSoup(response, "lxml")
    li_list = soup.find('ul', class_='bang_list clearfix bang_list_mode').find_all('li')
    for li in li_list:
        title = li.find('div', class_='name').find('a')['title']
        print(title)

def css_for_parse(response):
    soup = BeautifulSoup(response, "lxml")
    li_list = soup.select('ul.bang_list.clearfix.bang_list_mode > li')
    for li in li_list:
        title = li.select('div.name > a')[0]['title']
        print(title)

def xpath_for_parse(response):
    selector = html.fromstring(response)
    books = selector.xpath("//ul[@class='bang_list clearfix bang_list_mode']/li")
    for book in books:
        title = book.xpath('div[@class="name"]/a/@title')[0]
        print(title)

def re_for_parse(response):
    reg = '<div class="name"><a href="http://product.dangdang.com/\d+.html" target="_blank" title="(.*?)">'
    for title in re.findall(reg, response):
        print(title)

if __name__ == '__main__':
    # bs_for_parse(response)
    # css_for_parse(response)
    # xpath_for_parse(response)
    re_for_parse(response)

相關焦點

  • 四種Python爬蟲常用的定位元素方法對比,你偏愛哪一款?
    在使用Python本爬蟲採集數據時,一個很重要的操作就是如何從請求到的網頁中提取數據,而正確定位想要的數據又是第一步操作。本文將對比幾種 Python 爬蟲中比較常用的定位網頁元素的方式供大家學習。審查網頁元素後可以發現,書目信息都包含在 li 中,從屬於 class 為 bang_list clearfix bang_list_mode 的 ul 中。
  • Python爬蟲常用四種定位元素方法,收藏備用!
    初學Python時,大家最喜歡做的事可能就是爬蟲吧!使用爬蟲採集數據時,如何從請求到的網頁中提取數據?如何定位數據?來學習一下幾種 Python 爬蟲常用的定位網頁元素的方法「基於 BeautifulSoup 的 CSS 選擇器(與 PyQuery 類似)」今天來爬一爬當當網圖書暢銷總榜:
  • python爬蟲技術:如何定位網頁上的內容?xpath定位元素
    在使用python爬蟲的時候,我們需要分析網頁元素,定位我們需要的內容。那麼,如何在python爬蟲過程中定位我們需要的內容的位置呢?接下來我們就來說說xpath定位。 xpath可以定位文檔中的節點。使用xpath可以在無法通過名字和id進行定位的時候,方便高效的查找元素。
  • Python 爬蟲必殺技:XPath
    小夥伴、大夥伴們,大家好~今天要給大家介紹的是Python 爬蟲必殺技:XPath。1. 簡介一提到網絡爬蟲,就不得不提到Xpath Helper,我們常常用它來對所要提取的文本內容進行定位,詳情可參考推文《Xpath Helper助Xpath爬蟲一臂之力》。除了這一利器外,了解Xpath定位的原理及其基本用法可以大幅提高我們的爬蟲技巧。
  • Python數據科學實踐 | 爬蟲1
    前面幾章大家學習了如何利用Python處理與清洗數據,如何探索性數據分析,以及如何利用統計與機器學習方法進行建模。但是,很明顯我們忽視了一個最原始的問題:數據從何而來。沒有數據,這就好比,你學了十八般武藝,可是沒有讓你施展的地方一樣難受。大家不要忘記,提出問題,採集數據,然後才是你的十八般武藝的施展。本章將會講解Python的爬蟲模塊,目的是讓你學習的Python技術有用武之地。
  • 教你如何編寫第一個爬蟲
    因此,你需要約束自己的網絡爬蟲行為,將請求的速度限定在一個合理的範圍之內。爬取網站的時候需要限制自己的爬蟲,遵守Robots協議和約束網絡爬蟲程序的速度;在使用數據的時候必須遵守網站的智慧財產權。所以只要你合理利用就不會違法,爬蟲還是可以學的哦,畢竟爬蟲對數據分析真的非常有用,那麼爬蟲該怎麼學呢?今天來教大家編寫一個簡單的爬蟲!
  • 「爬蟲初步」十分鐘學會簡單實用XPath定位教程
    一、前言數據定位在爬蟲任務中作為重要的一環,旨在從原網頁html字符串中提取有效的信息,例如:作者名稱
  • 獨家|四元素論與四種氣質的關係:知識點 判斷方法 雷區
    最早的氣質論也許不是希波克拉底提出的,但他提出的四種氣質類型卻流經2500年的歷史長河,迄今仍然被心理學所接受。在這個傳承的過程中,四種氣質的學說又跟畢達哥拉斯的四元素論產生了結合,接著再被納入星學系統,完成了氣質-元素-星座的架構。有不少星相師前輩都描述過「氣質-元素-星座」架構,我的描述自然也有側重點。
  • python+selenium元素定位(上)
    今天主要想和大家分享下,selenium中是如何定位元素的,這塊內容包括id,name,tag name,class name,link text,partial link text,xpath,css selector八種定位方法,其對應python的方法如下圖一所示。
  • 乾貨 | 那些你不知道的爬蟲反爬蟲套路
    二、爬蟲反爬蟲技術現狀下面我們談談,爬蟲和反爬蟲分別都是怎麼做的。1、為python平反首先是爬蟲。爬蟲教程你到處都可以搜的到,大部分是python寫的。有很多網站會使用這個方法。然而這其實只是一種自欺欺人的辦法而已。只需要下一單,就可以永久洗白自己的IP,天下還有比這更便宜的生意嗎?因此,封IP,以及封IP的進階版:掃描埠再封IP,都是沒用的。根本不要考慮從IP下手,因為對手會用大量的時間考慮如何躲避IP封鎖,你幹嘛和人家硬剛呢。這沒有任何意義。那麼,下一步你會考慮到什麼?
  • 網絡爬蟲違法?扯!繼續學習我的第一個爬蟲
    網絡爬蟲的約束除了上述Robots協議之外,我們使用網絡爬蟲的時候還要對自己進行約束:過於快速或者頻密的網絡爬蟲都會對伺服器產生巨大的壓力,網站可能封鎖你的IP,甚至採取進一步的法律行動。因此,你需要約束自己的網絡爬蟲行為,將請求的速度限定在一個合理的範圍之內。
  • Python爬蟲從入門到精通(3): BeautifulSoup用法總結及多線程爬蟲爬取糗事百科
    我們還會利用requests庫和BeauitfulSoup來爬取糗事百科上的段子, 並對比下單線程爬蟲和多線程爬蟲的爬取效率。什麼是BeautifulSoup及如何安裝BeautifulSoup是一個解析HTML或XML文件的第三方庫。
  • 於雷定位日分享:幫你找到企業最佳機會的四種方法
    火種定位學會會長盤子老師為本次大會致歡迎辭,特勞特(中國)公司創始合伙人陳奇峰老師進行了關於《從認知優勢到系統領先》的主題演講。厚德戰略定位學院院長、攜手特勞特開創戰略定位課程的於雷老師結合自己十餘年的定位諮詢經驗,和與會人員分享了《尋找定位的四種核心策略》。
  • 一小時入門 Python 3 網絡爬蟲
    在講解爬蟲內容之前,我們需要先學習一項寫爬蟲的必備技能:審查元素(如果已掌握,可跳過此部分內容)。 1.我們在頁面的哪個位置點擊審查元素,瀏覽器就會為我們定位到相應的HTML位置,進而就可以在本地更改HTML信息。 再舉個小例子:我們都知道,使用瀏覽器"記住密碼"的功能,密碼會變成一堆小黑點,是不可見的。可以讓密碼顯示出來嗎?可以,只需給頁面"動個小手術"!以淘寶為例,在輸入密碼框處右鍵,點擊檢查。
  • Selenium元素定位的八種方法
    自動化一般需要四步操作:獲取元素,操作元素,獲取返回結果,斷言(返回結果與期望結果是否一致),最後自動出測試報告。Selenium提供8種元素定位的方法:id,name,class name,link text,xpath,css selector,tag name ,partial link tex。
  • requests-html:最簡單的爬蟲框架,看完你就會了
    很多朋友都聽說過Python的大名,而Python也擁有眾多的爬蟲框架,其中最簡單的莫過於requests-html了。它和著名的網絡請求庫requests是同一個作者,著重於XML數據提取,可以說是最簡單的爬蟲框架了。安裝requests-html安裝這個類庫非常簡單,直接通過pip就可以安裝了。
  • Python 爬蟲分析豆瓣 TOP250 告訴你程式設計師業餘該看什麼書?
    案例分析之外,重在梳理編寫爬蟲的邏輯和鏈路關鍵點,手把手教你形成自己編寫爬蟲的方法論。Are you ready? Let's go!審查元素,找到目標數據所在的URL審查元素,就是看構成網頁的小拼圖具體是怎麼拼的,操作起來很簡單,進入網頁後,右鍵——審查元素,默認會自動定位到我們所需要的元素位置
  • 漫談Pyspider網絡爬蟲的實踐
    總之,很早之前,我就開始規劃著寫點關於網絡爬蟲方面的文章,介紹性質的,但更重要的是,計算機以及信息科學的實踐性,所以,以一個實幹者的角度來寫,更為合適一些。在這之前,還是有必要對一些概念性的詞彙做一下梳理和科普,至少,不會讓讀者覺得突兀或者一知半解的讀著流水帳式的文字。
  • Python 爬蟲入門
    常見的加載模式學習爬蟲有必要了解網頁常見的兩種加載模式(後續爬蟲過程中,經常需要用到)。4.Elements(元素麵板):使用「元素」面板可以通過自由操縱 DOM 和 CSS 來重演您網站的布局和設計。
  • 通過xpath快速獲取頁面元素的方法
    背景在爬蟲的過程中,我們需要很準確的定位到頁面元素的位置。