1. 程式人生 > >爬蟲系統基礎框架 & 何時使用爬蟲框架?& requests庫 + bs4來實現簡單爬蟲

爬蟲系統基礎框架 & 何時使用爬蟲框架?& requests庫 + bs4來實現簡單爬蟲

www ica try 藍色 scrapy 定時 調度器 find use

轉載請註明出處https://www.jianshu.com/p/88f920936edc,謝謝!

一、 爬蟲用途和本質:

網絡爬蟲顧名思義即模仿???在網絡上爬取數據,網絡爬蟲的本質是一段自動抓取網頁信息的計算機程序。爬蟲實現方式:模仿瀏覽器訪問互聯網的過程,下載指定url網頁的數據,然後解析並處理得到感興趣的、有價值的數據。


二、何時使用爬蟲框架?

針對不同的爬蟲需求,爬蟲的實現途徑也不相同。對於比較大型或復雜的需求需要使用爬蟲框架,因為框架便於管理和擴展等;而對於一般比較小型或簡單的爬蟲需求,那麽使用框架就有點大材小用了,目前通常直接使用requests庫 + bs4便可滿足需求(requests與python request模塊不是一回事,requests是一個基於urllib3的第三方庫,bs4即python beautfilsoup組件)。


三、 爬蟲系統基礎框架:

一個爬蟲系統的基礎框架通常包含調度器scheduler、URL管理器manager、URL下載器downloader、URL解析器parser、應用application共5個模塊。當然還可以根據任務的需求在基礎框架的基礎上添加擴展模塊,比如監控模塊、定時啟動模塊等。5個基礎模塊的功能如下:

調度器scheduler:負責協調各模塊

url管理器manager:管理待爬取和已爬取的網頁url

下載器downloader:根據url去爬取對應的網頁數據,將網頁數據轉換成一個字符串(html文檔等),常用的下載器包括urllib3、requests等

解析器parser:解析下載器下載得到的字符串,常用的解析器包括html.parser(Python自帶的)、beautifulsoup(第三方插件)

應用程序application:分析感興趣的、有價值的數據

工作流程如下圖所示:

技術分享圖片


四、常用的爬蟲框架:

前面已經提到過,爬蟲框架適用於比較大型或復雜需求的爬蟲,因為框架便於管理和擴展等。目前常用的幾種爬蟲框架包括:

Scrapy框架

PySpider框架

Crawley框架

Portia框架

Newspaper框架

尤其Scrapy框架和PySpider框架是比較受歡迎的爬蟲框架。

Scrapy框架官方:https://scrapy.org/

PySpider框架官方:http://docs.pyspider.org


五、requests庫 + bs4來實現簡單爬蟲

下面使用requests庫 + bs4來實現簡單爬蟲並附上源碼:

5.1 先明確要爬取的目標數據:

http://country.911cha.com/首頁如下圖所示:

技術分享圖片

查詢‘中國’的頁面(以中國為例)如下圖所示:
技術分享圖片

要爬取的目標數據:各國對應頁面的國旗圖片(如圖5-2中的五星紅旗,大圖)並保存到本地目錄。

5.2 查看網頁源碼-分析圖片所在的路徑:

step 1. 要爬取國家A的國旗,首先需要知道國家A對應的url,分析“國家地區查詢首頁http://country.911cha.com/”的源碼可知,國家A的url保存在圖5-3所示的位置(比如中國就是CHN.html):

技術分享圖片

step 2. 獲取到國家A的url後就可以使用下載器requests來爬取網頁內容了,但是要獲取網頁內容中的國旗圖片還需要知道該圖片在該網頁內容中所在的位置。分析國家A對應的網頁(以中國為例)發現,國旗圖片的位置如圖5-4所示(選中的那行):

技術分享圖片

??:圖5-4中的simg/199.gif是另一個小圖(位於藍色字體國家名的下方),非目標圖片。

到目前為止,就已經知道了國家A對應的url和國家A頁面中國旗圖片所在的位置,接下來就可以編寫代碼完成如下工作:

1. 使用requests下載網頁數據

2. 使用beautifulsoup解析網頁數據

3. 使用urllib根據指定的圖片路徑和本地保存路徑下載圖片


代碼內容:


import requests

import urllib.request

from bs4 import BeautifulSoup

# 首頁url

url = ‘http://country.911cha.com/‘

# requests下載器下載主頁數據

html = requests.get(url)

# beautifulsoup解析主頁數據

soup = BeautifulSoup(html.text, "lxml")

# 定位到‘ul’-無序列表(其中每個ul標簽都包含了一個countryGroup,比如圖5-1中的A組(按國家名拼音排序))

countries = soup.find_all(‘ul‘, class_="l4 pt8 pb8")

# 創建一個空list,裏面元素是(imgUrl, imgName)

html_countryName_Arr = list()

# 遍歷每個countryGroup

for countryGroup in countries:

    # 遍歷countryGroup中的每個國家

    for country in countryGroup.children:

       # 這裏遍歷的原因是一個國家對應一個list:  <li><a href="ECU.html" target="_blank" class="f14">厄瓜多爾</a></li>        

        for x in country:

            # 讀取其中的href和text內容並添加到 html_countryName_Arr中

            html_countryName_Arr.append((x.get("href"), x.text))

# 逐個構建每個國家對應的url和image下載路徑

for name_html in html_countryName_Arr:

    print("(name, html): " + str(name_html))

    countryUrl = url + name_html[0]

    countryHtml = requests.get(countryUrl)

    countrySoup = BeautifulSoup(countryHtml.text, "lxml")

    # 查找每個國家頁面中的img標簽

    for imgTag in countrySoup.find_all(‘img‘):

        # 定位國旗圖片的標簽

        if ‘alt‘ in imgTag.attrs and ‘align‘ in imgTag.attrs:

            if ‘國旗‘ in imgTag.get("alt"):

                imgName = imgTag.get("alt")

                imgSourceUrl = ‘%s%s‘ % (url, imgTag.get("src"))

                print(imgSourceUrl)

                imgSavePath = ‘/Users/ycaha/PYTHON_LEARNING/nationFlags/%s.jpg‘%imgName

                print(imgSavePath)

                # 下載國旗圖片到本地路徑

                urllib.request.urlretrieve(imgSourceUrl, imgSavePath)

代碼分析:

requests:下載器,html = requests.get(url)根據url下載網頁數據;type(html)是<class ‘requests.models.Response‘>

BeautifulSoup:解析器,BeautifulSoup(html.text, "lxml")創建<class ‘bs4.BeautifulSoup‘>實例;其中html.text是獲取response的內容,數據格式為string,查看html.text方法如下:

def text(self):
  """Content of the response, in unicode... """

BeautifulSoup支持Python標準庫中的HTML解析器html.parser,還支持一些第三方的解析器:

技術分享圖片

因此BeautifulSoup(html.text, "lxml")的功能是:使用lxml解析器來解析html文本,並返回beautifulsoup實例,該實例是指定url網頁數據的另一種表現形式,接下來可以通過分析該實例的屬性attributes來獲取所需要的數據內容。

if ‘alt‘ in imgTag.attrs and ‘align‘ in imgTag.attrs:*
            if ‘國旗‘ in imgTag.get("alt"):*
                imgName = imgTag.get("alt")*
                imgSourceUrl = ‘%s%s‘ % (url, imgTag.get("src"))*

這段代碼用來定位屬性alt包含‘國旗’的圖片並將其下載到本地路徑。通過這種if條件定位國旗圖片的原因在於國旗圖片所在的標簽內容為:

<p >
    <img src="bimg/199.gif" alt="中國國旗" align="right" class="pl8 pb8" /><strong ><font class="blue f24" >中國</font></strong>
</p >

soup.find_all(‘img‘)用來尋找html中所有標簽為img對象,再尋找img對象中包含屬性alt的img對象,再尋找屬性alt中包含‘國旗’的img對象,最後使用urllib.request.urlretrieve(imgpath, savepath)將符合條件的圖片下載到本地。


水平有限,有錯誤還請大家指正!轉載請註明出處,https://www.jianshu.com/p/88f920936edc,謝謝!

爬蟲系統基礎框架 & 何時使用爬蟲框架?& requests庫 + bs4來實現簡單爬蟲