在大數據時代,豐富多樣的數據環繞在我們的身邊。收集數據並將數據應用於我們的項目中已經成為每一個數據科學家不可或缺的技能。網際網路上關於各式各樣的Python爬蟲庫的使用教程比比皆是,而如何在具體的應用場景中選擇效率最高且合適的庫是我們初學爬蟲時不可避免要遇見的難題。
Python提供了許多用於爬取web的常用庫,例如Scrapy, Beautiful Soup, Requests, Urllib, and Selenium等,可以肯定的是還有大量已經存在,此外考慮到Python如今受歡迎的程度,更多的庫也會陸續誕生。在本文中,將對剛才提到的5個庫進行概述,由於篇幅原因僅通過代碼實現Scrapy以及對應的最佳應用程式和案例。對於本文的其餘部分,我將闡釋每個庫在不同層面上特點。
1.Scrapy
Scrapy是目前最流行的Python Web爬蟲庫之一, 但Scrapy是一個開源框架,意味著它不僅僅是一個庫,還是一個具有完整系統性的web爬蟲工具。Scrapy最初旨在構建可自動爬取數據的網絡爬蟲,使它能夠用於監視和挖掘數據以及自動化系統的測試。
相較於其他的Python爬蟲庫,它在CPU和內存方面的性能優勢也非常明顯,但Scrapy的缺點在於安裝過程和使之正常運行於設備上可能有點繁瑣。
Overview and installation概述和安裝:
啟動Scrapy之前您需要確保運行的是python3或更高版本,如果是安裝Scrapy,只需在終端中編寫以下命令即可。
Collecting scrapy
Downloading Scrapy-2.4.0-py2.py3-none-any.whl (239 kB)
|████████████████████████████████| 239 kB 544 kB/s
Collecting zope.interface>=4.1.3
Downloading zope.interface-5.1.2-cp37-cp37m-win_amd64.whl (195 kB)
|████████████████████████████████| 195 kB 1.6 MB/s
Collecting parsel>=1.5.0
Downloading parsel-1.6.0-py2.py3-none-any.whl (13 kB)
Collecting cryptography>=2.0
Downloading cryptography-3.1.1-cp37-cp37m-win_amd64.whl (1.5 MB)
|████████████████████████████████| 1.5 MB 2.2 MB/s
Collecting itemloaders>=1.0.1
Downloading itemloaders-1.0.3-py3-none-any.whl (11 kB)
Collecting queuelib>=1.4.2
Downloading queuelib-1.5.0-py2.py3-none-any.whl (13 kB)
Collecting pyOpenSSL>=16.2.0
Downloading pyOpenSSL-19.1.0-py2.py3-none-any.whl (53 kB)
|████████████████████████████████| 53 kB 279 kB/s
Collecting lxml>=3.5.0; platform_python_implementation == "CPython"
Downloading lxml-4.5.2-cp37-cp37m-win_amd64.whl (3.5 MB)
|████████████████████████████████| 3.5 MB 720 kB/s
Collecting protego>=0.1.15
Downloading Protego-0.1.16.tar.gz (3.2 MB)
|████████████████████████████████| 3.2 MB 3.2 MB/s
Collecting itemadapter>=0.1.0
Downloading itemadapter-0.1.1-py3-none-any.whl (7.7 kB)
Collecting Twisted>=17.9.0
Downloading Twisted-20.3.0-cp37-cp37m-win_amd64.whl (3.1 MB)
|████████████████████████████████| 3.1 MB 3.3 MB/s
Collecting w3lib>=1.17.0
Downloading w3lib-1.22.0-py2.py3-none-any.whl (20 kB)
Collecting cssselect>=0.9.1
Downloading cssselect-1.1.0-py2.py3-none-any.whl (16 kB)
Collecting PyDispatcher>=2.0.5
Downloading PyDispatcher-2.0.5.tar.gz (34 kB)
Collecting service-identity>=16.0.0
Downloading service_identity-18.1.0-py2.py3-none-any.whl (11 kB)
Requirement already satisfied: setuptools in d:\program files\python\python37\lib\site-packages (from zope.interface>=4.1.3->scrapy) (47.1.0)
Collecting six>=1.6.0
Downloading six-1.15.0-py2.py3-none-any.whl (10 kB)
Collecting cffi!=1.11.3,>=1.8
Downloading cffi-1.14.3-cp37-cp37m-win_amd64.whl (178 kB)
|████████████████████████████████| 178 kB 2.2 MB/s
Collecting jmespath>=0.9.5
Downloading jmespath-0.10.0-py2.py3-none-any.whl (24 kB)
Collecting attrs>=19.2.0
Downloading attrs-20.2.0-py2.py3-none-any.whl (48 kB)
|████████████████████████████████| 48 kB 405 kB/s
Collecting Automat>=0.3.0
Downloading Automat-20.2.0-py2.py3-none-any.whl (31 kB)
Collecting PyHamcrest!=1.10.0,>=1.9.0
Downloading PyHamcrest-2.0.2-py3-none-any.whl (52 kB)
|████████████████████████████████| 52 kB 110 kB/s
Collecting constantly>=15.1
Downloading constantly-15.1.0-py2.py3-none-any.whl (7.9 kB)
Collecting hyperlink>=17.1.1
Downloading hyperlink-20.0.1-py2.py3-none-any.whl (48 kB)
|████████████████████████████████| 48 kB 386 kB/s
Collecting incremental>=16.10.1
Downloading incremental-17.5.0-py2.py3-none-any.whl (16 kB)
Collecting pyasn1-modules
Downloading pyasn1_modules-0.2.8-py2.py3-none-any.whl (155 kB)
|████████████████████████████████| 155 kB 3.3 MB/s
Collecting pyasn1
Downloading pyasn1-0.4.8-py2.py3-none-any.whl (77 kB)
|████████████████████████████████| 77 kB 693 kB/s
Collecting pycparser
Downloading pycparser-2.20-py2.py3-none-any.whl (112 kB)
|████████████████████████████████| 112 kB 2.2 MB/s
Collecting idna>=2.5
Downloading idna-2.10-py2.py3-none-any.whl (58 kB)
|████████████████████████████████| 58 kB 609 kB/s
Using legacy setup.py install for protego, since package 'wheel' is not installed.
Using legacy setup.py install for PyDispatcher, since package 'wheel' is not installed.
Installing collected packages: zope.interface, six, w3lib, lxml, cssselect, parsel, pycparser, cffi, cryptography, jmespath, itemadapter, itemloaders, queuelib, pyOpenSSL, protego, attrs, Automat, PyHamcrest, constantly, idna, hyperlink, incremental, Twisted, PyDispatcher, pyasn1, pyasn1-modules, service-identity, scrapy
Running setup.py install for protego ... done
Running setup.py install for PyDispatcher ... done
Successfully installed Automat-20.2.0 PyDispatcher-2.0.5 PyHamcrest-2.0.2 Twisted-20.3.0 attrs-20.2.0 cffi-1.14.3 constantly-15.1.0 cryptography-3.1.1 cssselect-1.1.0 hyperlink-20.0.1 idna-2.10 incremental-17.5.0 itemadapter-0.1.1 itemloaders-1.0.3 jmespath-0.10.0 lxml-4.5.2 parsel-1.6.0 protego-0.1.16 pyOpenSSL-19.1.0 pyasn1-0.4.8 pyasn1-modules-0.2.8 pycparser-2.20 queuelib-1.5.0 scrapy-2.4.0 service-identity-18.1.0 six-1.15.0 w3lib-1.22.0 zope.interface-5.1.2
WARNING: You are using pip version 20.1.1; however, version 20.2.3 is available.
You should consider upgrading via the 'd:\program files\python\python37\python.exe -m pip install --upgrade pip' command.
(向左滑動可查看完整代碼,下同)
一旦成功安裝了Scrapy,就可以通過輸入以下命令運行Scrapy shell:
當您運行此命令時,您將看到如下內容:
2020-10-15 15:37:01 [scrapy.utils.log] INFO: Scrapy 2.4.0 started (bot: scrapybot)
2020-10-15 15:37:01 [scrapy.utils.log] INFO: Versions: lxml 4.5.2.0, libxml2 2.9.5, cssselect 1.1.0, parsel 1.6.0, w3lib 1.22.0, Twisted 20.3.0, Python 3.7.9 (tags/v3.7.9:13c94747c7, Aug 17 2020, 18:58:18) [MSC v.1900 64 bit (AMD64)], pyOpenSSL 19.1.0 (OpenSSL 1.1.1h 22 Sep 2020), cryptography 3.1.1, Platform Windows-10-10.0.18362-SP0
2020-10-15 15:37:01 [scrapy.utils.log] DEBUG: Using reactor: twisted.internet.selectreactor.SelectReactor
2020-10-15 15:37:01 [scrapy.crawler] INFO: Overridden settings:
{'DUPEFILTER_CLASS': 'scrapy.dupefilters.BaseDupeFilter',
'LOGSTATS_INTERVAL': 0}
2020-10-15 15:37:01 [scrapy.extensions.telnet] INFO: Telnet Password: e600a89bca2b5510
2020-10-15 15:37:01 [scrapy.middleware] INFO: Enabled extensions:
['scrapy.extensions.corestats.CoreStats',
'scrapy.extensions.telnet.TelnetConsole']
2020-10-15 15:37:06 [scrapy.middleware] INFO: Enabled downloader middlewares:
['scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware',
'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware',
'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware',
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware',
'scrapy.downloadermiddlewares.retry.RetryMiddleware',
'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware',
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware',
'scrapy.downloadermiddlewares.redirect.RedirectMiddleware',
'scrapy.downloadermiddlewares.cookies.CookiesMiddleware',
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware',
'scrapy.downloadermiddlewares.stats.DownloaderStats']
2020-10-15 15:37:06 [scrapy.middleware] INFO: Enabled spider middlewares:
['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware',
'scrapy.spidermiddlewares.offsite.OffsiteMiddleware',
'scrapy.spidermiddlewares.referer.RefererMiddleware',
'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware',
'scrapy.spidermiddlewares.depth.DepthMiddleware']
2020-10-15 15:37:06 [scrapy.middleware] INFO: Enabled item pipelines:
[]
2020-10-15 15:37:06 [scrapy.extensions.telnet] INFO: Telnet console listening on 127.0.0.1:6023
[s] Available Scrapy objects:
[s] scrapy scrapy module (contains scrapy.Request, scrapy.Selector, etc)
[s] crawler <scrapy.crawler.Crawler object at 0x000001F735489F48>
[s] item {}
[s] settings <scrapy.settings.Settings object at 0x000001F735583CC8>
[s] Useful shortcuts:
[s] fetch(url[, redirect=True]) Fetch URL and update local objects (by default, redirects are followed)
[s] fetch(req) Fetch a scrapy.Request and update local objects
[s] shelp() Shell help (print this help)
[s] view(response) View response in a browser
你可以使用Scrapy shell來運行簡單的命令,例如,你可以使用fetch函數來獲取網站的HTML內容。因此,假設我想取回這本書的網站那麼我可以直接在shell實現。
fetch("http://books.toscrape.com/")
>>> fetch("http://books.toscrape.com/")
2020-10-15 15:39:35 [scrapy.core.engine] INFO: Spider opened
2020-10-15 15:39:41 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://books.toscrape.com/> (referer: None)
現在,您可以使用view方法在默認瀏覽器中打開這個HTML文件。或者你可以列印出頁面的HTML原始碼。
>>> print(response.text)
<!DOCTYPE html>
<!--[if lt IE 7]> <html lang="en-us" class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html lang="en-us" class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html lang="en-us" class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html lang="en-us" class="no-js"> <!--<![endif]-->
<head>
<title>
All products | Books to Scrape - Sandbox
</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<meta name="created" content="24th Jun 2016 09:29" />
<meta name="description" content="" />
<meta name="viewport" content="width=device-width" />
<meta name="robots" content="NOARCHIVE,NOCACHE" />
<!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
<!--[if lt IE 9]>
<script src="//html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link rel="shortcut icon" href="static/oscar/favicon.ico" />
.
(因篇幅原因我們僅展示部分的爬取數據結果)
view(response)print(response.text)當然,我們並不因為需要通過瀏覽器打開網頁才能爬取數據而反感,而且你很可能需要從HTML文本中獲得一些特定的信息,通常是使用CSS選擇器完成的,注意在開始之前,你需要檢查你想要獲取的網頁的結構,這樣你才能使用正確的CSS選擇器。
When to use Scarpy?什麼時候使用Scarpy?
Scrapy的最佳使用情況是當您想要進行大規模web抓取或多重自動化測試時,因為Scrapy具有非常良好的結構,從而擁有更好的靈活性和對特定應用的適應性。此外,Scrapy項目的組織方式使其更容易維護和擴展。但如果只是一個小規模的項目,或者你僅僅想爬取一個或幾個網頁,我建議你避免使用Scrapy,因為在這種情況下,Scarpy會使事情過於複雜而不會有任何便利和優勢。
2.Requests
Requests是一個非常簡單的採用Apache2 Licensed開源協議的HTTP庫 ,Request允許用戶向HTTP伺服器發送請求,並以HTML或是JSON的相應形式獲得響應,客戶同時可向伺服器發送POST請求來進行修改或添加操作。通過精心設計的API使得Requests發揮出良好的爬取能力。在終端中編寫以下命令進行安裝。
下面我們從幾個角度比較一下Requests和Scrapy,Requests是頁面級的爬蟲庫,重點在於頁面的下載能力,Requests操作簡單,但是相比於Scrapy來說並發性考慮不足,性能較差。Scrapy是網站級爬蟲框架,並發性良好,性能較高。總體來看,如果開發輕量級項目,或者需要深度定製屬性,那麼使用Requests爬蟲庫是明智的選擇,如果項目規模大,或是需要實現高並發,使用Scrapy框架會體驗更好。
3.Urllib
Urllib是Python內置的網絡協議請求庫,這意味著我們不需要單獨安裝它,Urllib允許開發者從HTTP或FTP協議打開和解析信息。Urllib同樣提供了一些處理url的方法模塊:
urllib.request:請求模塊
它是用來模擬發送請求,就像在瀏覽器裡輸入網址點擊跳轉一樣,需要輸入URL地址。
urllib.error:異常處理模塊
當請求出現錯誤時,調用該模塊函數會攔截這些異常,通過重試或其他操作確保程序不會意外終止。
urllib.parse :解析模塊
解析模塊定義了url的標準接口,實現url的各種抽取。
urllib.robotparser:robots.txt解析模塊
介紹urllib.robotparser模塊之前先來說說Robots協議,全稱「網絡爬蟲排除標準(Robots Exclusion Protocol)」,網站會通過該協議告訴搜尋引擎頁面抓取的權限,從而知道頁面是否可以抓取。
urllib.robotparser模塊在爬取網站時,會首先查詢此網站根目錄下是否存在robots.txt,若存在,便會按照txt來確定訪問的範圍,若txt文件不存在,可爬取所有沒被加密的頁面。Urllib比Requests稍微複雜一些,但是如果你想要更好的控制爬取請求,Urllib是更好的選擇。
4.Beautiful Soup
Beautiful Soup是一個Python內置庫,用於從XML和HTML文件中提取信息。我們可以將Beautiful Soup看作為一個解析器庫。
Beautiful Soup用來解析HTML比較簡單,API非常人性化,支持CSS選擇器和Python標準庫中的HTML解析器同時也支持XML的XML解析器。在終端中編寫以下命令進行安裝。
pip install beautifulsoup4如果你看到這裡,恭喜你已經具備使用爬蟲爬取數據的能力了。我們可以利用Urllib或Requests從網頁中獲取HTML文本,然後使用Beautiful Soup來清理它。
什麼時候使用Beautiful Soup?
如果你剛剛開始接觸爬蟲或是Python,那麼Beautiful Soup是比較的不錯的選擇,當你爬取非結構化文檔時,Beautiful Soup便會展現出它的優勢。但如果你正在參與開發一個大規模的項目,Beautiful Soup便不再是明智的選擇,隨著項目規模的擴大,Beautiful Soup將會變得難以維護。
5.Selenium
Selenium是一套完整的web應用程式測試系統,包含了測試錄製、編寫、運行和測試的並行處理。你可以使用它打開一個網頁,單擊一個按鈕,然後獲得結果。Selenium的核心Selenium Core基於JsUnit,完全由Javascript編寫,可以運行於任何支持Javascript的瀏覽器上。在終端中編寫以下命令進行安裝。
為項目使用正確的庫可以節省大量的時間和精力,這對於項目的成功至關重要。這需要我們深入了解每個爬蟲庫的優缺點,從而引導我們在未來的項目中選擇和使用最適合的爬蟲。
寫在後面:因近期在學習爬蟲技術,有幸看到這篇關於Python爬蟲庫選擇的文章,在不同應用場景中如何選擇更合適的爬蟲庫來提高效率非常重要,通過這篇文章可以了解現今最火的5個Python爬蟲庫合適應用場景,從而提高數據爬取效率。
指導老師
長按二維碼關注我們
歡迎關注微信公眾號「沈浩老師」
原文連結:
https://towardsdatascience.com/choose-the-best-python-web-scraping-library-for-your-application-91a68bc81c4f