在前一篇中講了如何開啓多線程來加快爬蟲的爬取速度,本節主要對爬蟲爬取內容機型優化,將生產商信息單獨獨立出來作爲一張數據庫表,不再僅僅是存儲一個生產商的名稱,同時保存了生產商的網址和介紹。
解析生產商信息
針對生產商頁面的信息的解析方法請參考 外行學 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)
整個程序的執行流程
真個程序執行後,在數據庫中可以看到生產商、元件信息、元件價格等三張數據表,後面可以對着三個表的數據進行分析。