外行學 Python 爬蟲 第八篇 功能優化

在前一篇中講了如何開啓多線程來加快爬蟲的爬取速度,本節主要對爬蟲爬取內容機型優化,將生產商信息單獨獨立出來作爲一張數據庫表,不再僅僅是存儲一個生產商的名稱,同時保存了生產商的網址和介紹。

解析生產商信息

針對生產商頁面的信息的解析方法請參考 外行學 Python 爬蟲 第三篇 內容解析,在這裏我們只需要按照相同的方法解析出生產商名稱、網址、簡介等信息即可,生產商數據表內容如下:

class Brands(Base, CRUDMixin):
    __tablename__ = 'brands'

    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(100), nullable=False, unique=True)
    url = Column(String(100))
    desc = Column(Text)

    materials = relationship('Materials', backref='brands')

在完成數據表和網頁信息解析相關的內容後,我們需要將生產商頁面的 url 加入爬蟲的有效 url 中,在整個程序中使用正則表達式來判斷一個 url 是否是一個有效的 url,正則表達式的規則如下:

r'https?://(www|list|item).szlcsc.com(/(catalog|brand))?(/[0-9]*)?.html'

在 python 使用 re 模塊來處理正則表達式

該表達式可以過濾出一下網址:

'https://www.szlcsc.com/catalog.html'
'https://list.szlcsc.com/catalog/542.html'
'https://item.szlcsc.com/22931.html'
'https://www.szlcsc.com/brand.html'
'https://list.szlcsc.com/brand/11442.html'

以上網址包含了元件目錄、元件列表、元件詳情、生產商列表、生產商詳情等頁面。

一下 url 校驗的函數,函數接收正則表達式和 url 兩個參數

    def check_url(self, regex, url):
        if regex is None or url is None:
            return False
        if re.match(regex, url) is None:
            return False
        return True

由於元件信息和生產商信息相互關聯,且一個生產商可以對應多個元件,因此需要先獲取生產商的信息,在獲取網頁中的 url 時,需要先對生產商的 url 進行識別,然後在識別元件的 url,相關的函數如下:

    def __find_url(self, current_url, html):
        for link in html.find_all(name='a', href=re.compile(REGEX_EXP_BRAND_LIST)):
            url = link.get('href')
            if not self.url_in_bloomfilter(url):
                if Crawler.url_queue.qsize() < Crawler.max_url_count:
                    self.url_add_bloomfilter(url)
                    Crawler.url_queue.put(url)

        if self.check_url(REGEX_EXP_CATLOG_LIST, current_url):
            if Crawler.url_queue.qsize() > Crawler.max_url_count:
                Crawler.url_queue.put(current_url)
            else:
                self.get_product_item_url(current_url)

        for link in html.find_all(name='a', href=re.compile(REGEX_EXP_ALL)):
            url = link.get('href')
            if not self.url_in_bloomfilter(url):
                if Crawler.url_queue.qsize() < Crawler.max_url_count:
                    self.url_add_bloomfilter(url)
                    Crawler.url_queue.put(url)

整個程序的執行流程

真個程序執行後,在數據庫中可以看到生產商、元件信息、元件價格等三張數據表,後面可以對着三個表的數據進行分析。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章