008 - 爬蟲處理流程及網(wǎng)頁解析

爬蟲處理流程:

  1. 將互聯(lián)網(wǎng)上的網(wǎng)頁獲取到本地
  • 對網(wǎng)頁進(jìn)行解析
    網(wǎng)頁解析是從網(wǎng)頁中分離出我們所需要的、有價(jià)值的信息,以及新的待爬取的URL。
    網(wǎng)頁的解析的方法:
    • 正則表達(dá)式(采用模糊匹配的方式,找出我們所需要內(nèi)容)
    • BeautifulSoup(是一個可以從HTML或XML文件中提取數(shù)據(jù)的第三方Python庫), BeautifulSoup可以采用Python自帶的html.parse作為它的解析器,也可以采用lxml作為解析器。
      lxml 是Python語言解析處得XML和HTML的庫
    • XPath(XPath 是一門在 XML 文檔中查找信息的語言,XPath 可用來在 XML 文檔中對元素和屬性進(jìn)行遍歷。)
  • 對解析出來的數(shù)據(jù)進(jìn)行處理。

一、使用BeautifulSoup

安裝:

pip install beautifulsoup4

安裝lxml:

pip install lxml
解析器 使用方法 優(yōu)點(diǎn) 缺點(diǎn)
Python標(biāo)準(zhǔn)庫 BeautifulSoup(markup, “html.parser”) Python的內(nèi)置標(biāo)準(zhǔn)庫,執(zhí)行速度適中,文檔容錯能力強(qiáng) Python 2.7.3 or 3.2.2)前 的版本中文檔容錯能力差
lxml HTML 解析器 BeautifulSoup(markup, “l(fā)xml”) 速度快,文檔容錯能力強(qiáng) 需要安裝C語言庫
  1. 首先必須要導(dǎo)入 bs4 庫,創(chuàng)建BeautifulSoup對象
from bs4 import BeautifulSoup
soup = BeautifulSoup(html,'lxml')  #html為下載的網(wǎng)頁,lxml為解析器
  1. 詳細(xì)使用可以看Beautiful Soup 4.2.0 文檔
    掌握以下三個方法基本夠用:
  • find_all("tag") 搜索當(dāng)前所有的tag標(biāo)簽的集合。
  • find("tag") 返回的是一個tag標(biāo)簽。(這個方法用得少)
  • select("") 可以按標(biāo)簽名查找,用得多的是按標(biāo)簽逐層查找篩選元素。

二、使用BeautifulSoup提取網(wǎng)頁內(nèi)容的一些技巧

1、find_all()方法中放單獨(dú)的標(biāo)簽名,如a,會提取網(wǎng)頁中所有的a標(biāo)簽,這里要確保是我們所需要的鏈接a,一般都不是,需要加上條件(就是標(biāo)簽的屬性,加以限制篩選),如果這一級標(biāo)簽沒有屬性,最好往上一級找。

以糗事百科為例來說明,http://www.qiushibaike.com/text/,抓取原創(chuàng)笑話段子。

發(fā)現(xiàn)內(nèi)容都在span標(biāo)簽中,如果寫 find_all("span") 可以抓取到段子的內(nèi)容,但是還包含了網(wǎng)頁上其他span的內(nèi)容。這時我們往上一級標(biāo)簽上看,<div class="content> 就是只包含了段子內(nèi)容的標(biāo)簽。

# coding=utf-8

import requests

from bs4 import BeautifulSoup

html = requests.get('http://www.qiushibaike.com/text/').content

soup = BeautifulSoup(html,'lxml')
links = soup.find_all('div',class_='content')

for link in links:
    print link.span.get_text()

取出來的link的內(nèi)容就是div,我們?nèi)∷?code>span中的內(nèi)容就是我們需要段子的內(nèi)容。

2、select() 方法,可以按標(biāo)簽逐層查找到我們所需要的內(nèi)容,這點(diǎn)特點(diǎn)方便,就是定位,避免了單一的標(biāo)簽無法定位到我們所需要的內(nèi)容元素。

soup.select("html head title")  ##標(biāo)簽層級查找

soup.select('td  div  a')  ## 標(biāo)簽路徑 td --> div --> a

soup.select('td > div > a')

注意,以上按路徑 標(biāo)簽之間的空格 td div a,可以用>,但也要注意>與標(biāo)簽之間都有空格。推薦使用 > 的方式。

我們使用Chrome瀏覽器,右鍵copy - selector (鼠標(biāo)要放在標(biāo)簽上)


注意得到的內(nèi)容,是從#開始的,這是上面divid#表示的是id),如果按此去搜索標(biāo)簽內(nèi)容,只能得到一條內(nèi)容。

#qiushi_tag_118962045 > a > div > span

需要改一下,按照個標(biāo)簽順序去匹配搜索內(nèi)容。這里第一個div就是 有id數(shù)字的那個div

div  > a > div > span

按這個路徑去搜索時,發(fā)現(xiàn)還匹配到評論的內(nèi)容,這就是定位的問題,需要改得更準(zhǔn)確一些。

a.contentHerf > div > span

改為從a標(biāo)簽開始,并且加上它的class屬性。a.contentHerf<a class="contentHerf"在select()方法中的寫法。

# coding=utf-8

import requests
from bs4 import BeautifulSoup

html = requests.get('http://www.qiushibaike.com/text/').content
soup = BeautifulSoup(html,'lxml')
links = soup.select('a.contentHerf > div > span')

for link in links:
    print link.get_text()
    #print link.text   這樣寫可以

兩種方式抓取到糗百的段子。注意這里只抓取了一頁的內(nèi)容。


PS 可以參見之前的內(nèi)容:使用Beautiful Soup抓取結(jié)構(gòu)化數(shù)據(jù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容