原标题:数据挖掘 | 选择最合适的Python Web爬虫库
在大数据时代,丰富多样的数据环绕在我们的身边。收集数据并将数据应用于我们的项目中已经成为每一个数据科学家不可或缺的技能。互联网上关于各式各样的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,只需在终端中编写以下命令即可。
pipinstall scrapy
Collecting scrapy
Downloading Scrapy -2.4.0-py2.py3-none-any.whl ( 239kB)
|████████████████████████████████| 239kB 544kB/s
Collecting zope.interface>= 4.1.3
Downloading zope.interface -5.1.2-cp37-cp37m-win_amd64.whl ( 195kB)
|████████████████████████████████| 195kB 1.6MB/s
Collecting parsel>= 1.5.0
Downloading parsel -1.6.0-py2.py3-none-any.whl ( 13kB)
Collecting cryptography>= 2.0
Downloading cryptography -3.1.1-cp37-cp37m-win_amd64.whl ( 1.5MB)
|████████████████████████████████| 1.5MB 2.2MB/s
Collecting itemloaders>= 1.0.1
Downloading itemloaders -1.0.3-py3-none-any.whl ( 11kB)
Collecting queuelib>= 1.4.2
Downloading queuelib -1.5.0-py2.py3-none-any.whl ( 13kB)
Collecting pyOpenSSL>= 16.2.0
Downloading pyOpenSSL -19.1.0-py2.py3-none-any.whl ( 53kB)
|████████████████████████████████| 53kB 279kB/s
Collecting lxml>= 3.5.0; platform_python_implementation == "CPython"
Downloading lxml -4.5.2-cp37-cp37m-win_amd64.whl ( 3.5MB)
|████████████████████████████████| 3.5MB 720kB/s
Collecting protego>= 0.1.15
Downloading Protego -0.1.16.tar.gz ( 3.2MB)
|████████████████████████████████| 3.2MB 3.2MB/s
Collecting itemadapter>= 0.1.0
Downloading itemadapter -0.1.1-py3-none-any.whl ( 7.7kB)
Collecting Twisted>= 17.9.0
Downloading Twisted -20.3.0-cp37-cp37m-win_amd64.whl ( 3.1MB)
|████████████████████████████████| 3.1MB 3.3MB/s
Collecting w3lib>= 1.17.0
Downloading w3lib -1.22.0-py2.py3-none-any.whl ( 20kB)
Collecting cssselect>= 0.9.1
Downloading cssselect -1.1.0-py2.py3-none-any.whl ( 16kB)
Collecting PyDispatcher>= 2.0.5
Downloading PyDispatcher -2.0.5.tar.gz ( 34kB)
Collecting service-identity>= 16.0.0
Downloading service_identity -18.1.0-py2.py3-none-any.whl ( 11kB)
Requirement already satisfied: setuptools ind:program filespythonpython37libsite-packages ( fromzope.interface>= 4.1.3->scrapy) ( 47.1.0)
Collecting six>= 1.6.0
Downloading six -1.15.0-py2.py3-none-any.whl ( 10kB)
Collecting cffi!= 1.11.3,>= 1.8
Downloading cffi -1.14.3-cp37-cp37m-win_amd64.whl ( 178kB)
|████████████████████████████████| 178kB 2.2MB/s
Collecting jmespath>= 0.9.5
Downloading jmespath -0.10.0-py2.py3-none-any.whl ( 24kB)
Collecting attrs>= 19.2.0
Downloading attrs -20.2.0-py2.py3-none-any.whl ( 48kB)
|████████████████████████████████| 48kB 405kB/s
Collecting Automat>= 0.3.0
Downloading Automat -20.2.0-py2.py3-none-any.whl ( 31kB)
Collecting PyHamcrest!= 1.10.0,>= 1.9.0
Downloading PyHamcrest -2.0.2-py3-none-any.whl ( 52kB)
|████████████████████████████████| 52kB 110kB/s
Collecting constantly>= 15.1
Downloading constantly -15.1.0-py2.py3-none-any.whl ( 7.9kB)
Collecting hyperlink>= 17.1.1
Downloading hyperlink -20.0.1-py2.py3-none-any.whl ( 48kB)
|████████████████████████████████| 48kB 386kB/s
Collecting incremental>= 16.10.1
Downloading incremental -17.5.0-py2.py3-none-any.whl ( 16kB)
Collecting pyasn1-modules
Downloading pyasn1_modules -0.2.8-py2.py3-none-any.whl ( 155kB)
|████████████████████████████████| 155kB 3.3MB/s
Collecting pyasn1
Downloading pyasn1 -0.4.8-py2.py3-none-any.whl ( 77kB)
|████████████████████████████████| 77kB 693kB/s
Collecting pycparser
Downloading pycparser -2.20-py2.py3-none-any.whl ( 112kB)
|████████████████████████████████| 112kB 2.2MB/s
Collecting idna>= 2.5
Downloading idna -2.10-py2.py3-none-any.whl ( 58kB)
|████████████████████████████████| 58kB 609kB/s
Using legacy setup.py install forprotego, since package 'wheel'isnotinstalled.
Using legacy setup.py install forPyDispatcher, since package 'wheel'isnotinstalled.
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 forprotego ... done
Running setup.py install forPyDispatcher ... done
Successfully installed Automat -20.2.0PyDispatcher -2.0.5PyHamcrest -2.0.2Twisted -20.3.0attrs -20.2.0cffi -1.14.3constantly -15.1.0cryptography -3.1.1cssselect -1.1.0hyperlink -20.0.1idna -2.10incremental -17.5.0itemadapter -0.1.1itemloaders -1.0.3jmespath -0.10.0lxml -4.5.2parsel -1.6.0protego -0.1.16pyOpenSSL -19.1.0pyasn1 -0.4.8pyasn1-modules -0.2.8pycparser -2.20queuelib -1.5.0scrapy -2.4.0service-identity -18.1.0six -1.15.0w3lib -1.22.0zope.interface -5.1.2
WARNING: You are using pip version 20.1.1; however, version 20.2.3isavailable.
You should consider upgrading via the 'd:program filespythonpython37python.exe -m pip install --upgrade pip'command.
(向左滑动可查看完整代码,下同)
一旦成功安装了Scrapy,就可以通过输入以下命令运行Scrapy shell:
Scrapyshell
当您运行此命令时,您将看到如下内容:
2020-10-1515: 37: 01[scrapy.utils.log] INFO: Scrapy 2.4.0started (bot: scrapybot)
2020-10-1515: 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 172020, 18: 58: 18) [MSC v .190064bit (AMD64)], pyOpenSSL 19.1.0(OpenSSL 1.1.1h 22Sep 2020), cryptography 3.1.1, Platform Windows -10-10.0.18362-SP0
2020-10-1515: 37: 01[scrapy.utils.log] DEBUG: Using reactor: twisted.internet.selectreactor.SelectReactor
2020-10-1515: 37: 01[scrapy.crawler] INFO: Overridden settings:
{ 'DUPEFILTER_CLASS': 'scrapy.dupefilters.BaseDupeFilter',
'LOGSTATS_INTERVAL': 0}
2020-10-1515: 37: 01[scrapy.extensions.telnet] INFO: Telnet Password: e600a89bca2b5510
2020-10-1515: 37: 01[scrapy.middleware] INFO: Enabled extensions:
[ 'scrapy.extensions.corestats.CoreStats',
'scrapy.extensions.telnet.TelnetConsole']
2020-10-1515: 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-1515: 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-1515: 37: 06[scrapy.middleware] INFO: Enabled item pipelines:
[]
2020-10-1515: 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
[s] item {}
[s] settings
[s] Useful shortcuts:
[s] fetch(url[, redirect= True]) Fetch URL andupdate local objects (by default, redirects are followed)
[s] fetch(req) Fetch a scrapy.Request andupdate local objects
[s] shelp Shell help ( printthis help)
[s] view(response) View response ina browser
你可以使用Scrapy shell来运行简单的命令,例如,你可以使用fetch函数来获取网站的HTML内容。因此,假设我想取回这本书的网站那么我可以直接在shell实现。
fetch("http://books.toscrape.com/")
>>> fetch( "http://books.toscrape.com/")
2020-10-1515: 39: 35[scrapy.core.engine] INFO: Spider opened
2020-10-1515: 39: 41[scrapy.core.engine] DEBUG: Crawled ( 200) (referer: None)
现在,您可以使用view方法在默认浏览器中打开这个HTML文件。或者你可以打印出页面的HTML源代码。
>>> print(response.text)
All products | Books to Scrape - Sandbox
......
(因篇幅原因我们仅展示部分的爬取数据结果)
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发挥出良好的爬取能力。在终端中编写以下命令进行安装。
pipinstall 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解析器。在终端中编写以下命令进行安装。
pipinstall 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,完全由Java编写,可以运行于任何支持Java的浏览器上。在终端中编写以下命令进行安装。
pipinstall selenium
为项目使用正确的库可以节省大量的时间和精力,这对于项目的成功至关重要。这需要我们深入了解每个爬虫库的优缺点,从而引导我们在未来的项目中选择和使用最适合的爬虫。
写在后面:因近期在学习爬虫技术,有幸看到这篇关于Python爬虫库选择的文章,在不同应用场景中如何选择更合适的爬虫库来提高效率非常重要,通过这篇文章可以了解现今最火的5个Python爬虫库合适应用场景,从而提高数据爬取效率。
指导老师
https://towardsdatascience.com/choose-the-best-python-web-scraping-library-for-your-application-91a68bc81c4f返回搜狐,查看更多
责任编辑: