新聞中心
在使用Python本爬蟲采集數(shù)據(jù)時,一個很重要的操作就是如何從請求到的網(wǎng)頁中提取數(shù)據(jù),而正確定位想要的數(shù)據(jù)又是第一步操作。

創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設,劍閣企業(yè)網(wǎng)站建設,劍閣品牌網(wǎng)站建設,網(wǎng)站定制,劍閣網(wǎng)站建設報價,網(wǎng)絡營銷,網(wǎng)絡優(yōu)化,劍閣網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
本文將對比幾種 Python 爬蟲中比較常用的定位網(wǎng)頁元素的方式供大家學習:
- 傳統(tǒng) BeautifulSoup 操作
- 基于 BeautifulSoup 的 CSS 選擇器(與 PyQuery 類似)
- XPath
- 正則表達式
參考網(wǎng)頁是當當網(wǎng)圖書暢銷總榜:
http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1
我們以獲取第一頁 20 本書的書名為例。先確定網(wǎng)站沒有設置反爬措施,是否能直接返回待解析的內(nèi)容:
- 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)
仔細檢查后發(fā)現(xiàn)需要的數(shù)據(jù)都在返回內(nèi)容中,說明不需要特別考慮反爬舉措
審查網(wǎng)頁元素后可以發(fā)現(xiàn),書目信息都包含在 li 中,從屬于 class 為 bang_list clearfix bang_list_mode 的 ul 中
進一步審查也可以發(fā)現(xiàn)書名在的相應位置,這是多種解析方法的重要基礎
1. 傳統(tǒng) BeautifulSoup 操作
經(jīng)典的 BeautifulSoup 方法借助 from bs4 import BeautifulSoup,然后通過 soup = BeautifulSoup(html, "lxml") 將文本轉換為特定規(guī)范的結構,利用 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 個書名,有些書面顯得冗長可以通過正則或者其他字符串方法處理,本文不作詳細介紹
2. 基于 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 語法獲取特定內(nèi)容,基礎依舊是對元素的認真審查分析:
- 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)
3. 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("http://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)
4. 正則表達式如果對 HTML 語言不熟悉,那么之前的幾種解析方法都會比較吃力。這里也提供一種萬能解析大法:正則表達式,只需要關注文本本身有什么特殊構造文法,即可用特定規(guī)則獲取相應內(nèi)容。依賴的模塊是 re
首先重新觀察直接返回的內(nèi)容中,需要的文字前后有什么特殊:
- 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)
觀察幾個數(shù)目相信就有答案了:
書名就藏在上面的字符串中,蘊含的網(wǎng)址鏈接中末尾的數(shù)字會隨著書名而改變。
分析到這里正則表達式就可以寫出來了:
- 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 = '
- for title in re.findall(reg, response):
- print(title)
- if __name__ == '__main__':
- re_for_parse(response)
可以發(fā)現(xiàn)正則寫法是最簡單的,但是需要對于正則規(guī)則非常熟練。所謂正則大法好!
當然,不論哪種方法都有它所適用的場景,在真實操作中我們也需要在分析網(wǎng)頁結構來判斷如何高效的定位元素,最后附上本文介紹的四種方法的完整代碼,大家可以自行操作一下來加深體會
- 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("http://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 = '


咨詢
建站咨詢
