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

轉載請註明出處https://www.cnblogs.com/alexlee666/p/10180519.html,謝謝! 文中圖片來自於個人簡書博客。

1、 爬蟲用途和本質:html

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


2、什麼時候使用爬蟲框架?

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


3、 爬蟲系統基礎框架:

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

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

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

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

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

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

工做流程以下圖所示:url

圖3-1. 簡單爬蟲框架執行流程.jpg


4、經常使用的爬蟲框架:

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

Scrapy框架

PySpider框架

Crawley框架

Portia框架

Newspaper框架

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

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

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


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

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

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

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

圖5-1. 國家地區查詢首頁.png

查詢‘中國’的頁面(以中國爲例)以下圖所示:
圖5-2. 中國國旗.png

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

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

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

圖5-3. 各國家的url位置.png

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

圖5-4. 國旗圖片所在的位置.png

⚠️:圖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,還支持一些第三方的解析器:

圖5-5. beautifulsoup支持的解析器種類.png

所以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.cnblogs.com/alexlee666/p/10180519.html。謝謝支持

相關文章
相關標籤/搜索