异步社区

异步社区是国内领先的IT专业图书社区,由人民邮电出版社主办,致力于优质学习内容的出版和分享。

34篇博客

网络爬虫简介(2)— 背景调研

异步社区2018-12-20 10:58
欢迎访问  网易云社区,了解更多网易技术产品运营经验。  

1.4 背景调研
在深入讨论爬取一个网站之前,我们首先需要对目标站点的规模和结构进行一定程度的了解。网站自身的robots.txt和Sitemap
文件都可以为我们提供一定的帮助,此外还有一些能提供更详细信息的外部工具,比如Google搜索和WHOIS。


1.4.1 检查 robots.txt
大多数网站都会定义robots.txt文件,这样可以让爬虫了解爬取该网站时存在哪些限制。这些限制虽然是仅仅作为建议给出,但是良好的网络公民都应当遵守这些限制。在爬取之前,检查robots.txt文件这一宝贵资源可以将爬虫被封禁的可能性降至最低,而且还能发现和网站结构相关的线索。
关于robots.txt协议的更多信息可以参见http://www.robotstxt.org。下面的代码是我们的示例文件robots.txt中的内容,可以访问
http://example.python-scraping.com/robots.txt获取。
# section 1
User-agent: BadCrawler
Disallow: /
# section 2
User-agent: *
Crawl-delay: 5
Disallow: /trap
# section 3
Sitemap: http://example.python-scraping.com/sitemap.xml


在section 1中,robots.txt文件禁止用户代理为BadCrawler的爬虫爬取该网站,不过这种写法可能无法起到应有的作用,因为恶意爬虫根本不会遵从robots.txt的要求。本章后面的一个例子将会展示如何让爬虫自动遵守robots.txt的要求。section 2规定,无论使用哪种用户代理,都应该在两次下载请求之间给出5秒的抓取延迟,我们需要遵从该建议以避免服务器过载。这里还有一个/trap链接,用于封禁那些爬取了不允许访问的链接的恶意爬虫。如果你访问了这个链接,服务器就会封禁你的IP一分钟!一个真实的网站可能会对你的IP封禁更长时间,甚至是永久封禁。不过如果这样设置的话,我们就无法继续这个例子了。section 3定义了一个Sitemap文件,我们将在下一节中了解如何检查该文件

1.4.2 检查网站地图
网站提供的Sitemap文件(即网站地图)可以帮助爬虫定位网站最新的内容,而无须爬取每一个网页。如果想要了解更多信息,可以从http://www.sitemaps.org/protocol.html获取网站地图标准的定义。许多网站发布平台都有自动生成网站地图的能力。下面是在robots.txt文件中定位到的Sitemap文件的内容。
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url><loc>http:
//example.python-scraping.com/view/Afghanistan-1</loc>
</url>
<url><loc>http://example.python-scraping.com/view/Aland-Islands-2</loc>
</url>
<url><loc>http://example.python-scraping.com/view/Albania-3</loc>
</url>
...
</urlset>


网站地图提供了所有网页的链接,我们会在后面的小节中使用这些信息,用于创建我们的第一个爬虫。虽然Sitemap文件提供了一种爬取网站的有效方式,但是我们仍需对其谨慎处理,因为该文件可能存在缺失、过期或不完整的问题。


1.4.3 估算网站大小
目标网站的大小会影响我们如何进行爬取。如果是像我们的示例站点这样只有几百个URL的网站,效率并没有那么重要;但如果是拥有数百万个网页的站点,使用串行下载可能需要持续数月才能完成,这时就需要使用第4章中介绍的分布式下载来解决了。估算网站大小的一个简便方法是检查Google爬虫的结果,因为Google很可能已经爬取过我们感兴趣的网站。我们可以通过Google搜索的site关键词过滤域名结果,从而获取该信息。我们可以从http://www.google.com/advanced_search了解到该接口及其他高级搜索参数的用法。在域名后面添加URL路径,可以对结果进行过滤,仅显示网站的某些部分。同样,你的结果可能会有所不同;不过,这种附加的过滤条件非常有用,因为在理想情况下,你只希望爬取网站中包含有用数据的部分,而不是爬取网站的每个页面。


1.4.4 识别网站所用技术
构建网站所使用的技术类型也会对我们如何爬取产生影响。有一个十分有用的工具可以检查网站构建的技术类型——detectem模块,该模块需要Python 3.5+环境以及Docker。如果你还没有安装Docker,可以遵照https://www.docker.com/products/overview中你使用的操作系统所对应的说明操作。当Docker安装好后,你可以运行如下命令。docker pull scrapinghub/splashpip install detectem上述操作将从ScrapingHub拉取最新的Docker镜像,并通过pip安装该库。为了确保不受任何更新或改动的影响,推荐使Python虚拟环境(
https://docs.python.org/3/library/venv.html)或Conda环境(https://conda.io/docs/using/envs.html),并查看项目的
ReadMe页面(https://github.com/spectresearch/detectem)。
为什么使用环境?
假设你的项目使用了早期版本的库进行开发(比如detectem),而在最新的版本中,detectem引入了一些向后不兼容的变更,造成你的项目无法正常工作。但是,你正在开发的其他项目中,可能使用了更新的版本。如
果你的项目使用系统中安装的detectem,那么当更新库以支持其他项目时,该项目就会无法运行。Ian Bicking的virtualenv为解决该问题提供了一个巧妙的解决方法,该方法通过复制系统中Python的可执行程序及其依赖到一个本地目录中,创建了一个独立的Python环境。这就能够让一个项目安装指定版本的Python库,而不依赖于外部系统。你还可以在不同的虚拟环境中使用不同的Python版本。Conda环境中使用了Anaconda的Python路径,提供了相似的功能。
detectem模块基于许多扩展模块,使用一系列请求和响应,来探测网站使用的技术。它使用了Splash,这是由ScrapingHub
开发的一个脚本化浏览器。要想运行该模块,只需使用det命令即可。$ det http://example.python-scraping.com[('jquery', '1.11.0')]我们可以看到示例网站使用了通用的JavaScript库,因此其内容很可能嵌入在HTML当中,相对来说应该比较容易抓取。
detectem仍然相当年轻,旨在成为Wappalyzer的Python对标版本,Wappalyzer是一个基于Node.js的项目,支持解析不同后端、广告网络、
JavaScript库以及服务器设置。你也可以在Docker中运行Wappalyze。首先需要下载其Docker镜像,运行如下命令。$ docker pull wappalyzer/cli然后,你可以从Docker实例中运行脚本。$ docker run wappalyzer/cli http://example.python-scraping.com输出结果不太容易阅读,不过当我们将其拷贝到JSON解析器中,可以看到检测出来的很多库和技术。
{'applications':
[{'categories': ['Javascript Frameworks'],
'confidence': '100',
'icon': 'Modernizr.png',
'name': 'Modernizr',
'version': ''},
{'categories': ['Web Servers'],
'confidence': '100',
'icon': 'Nginx.svg',
'name': 'Nginx',
'version': ''},
{'categories': ['Web Frameworks'],
'confidence': '100',
'icon': 'Twitter Bootstrap.png',
'name': 'Twitter Bootstrap',
'version': ''},
{'categories': ['Web Frameworks'],
'confidence': '100',
'icon': 'Web2py.png',
'name': 'Web2py',
'version': ''},
{'categories': ['Javascript Frameworks'],
'confidence': '100',
'icon': 'jQuery.svg',
'name': 'jQuery',
'version': ''},
{'categories': ['Javascript Frameworks'],
'confidence': '100',
'icon': 'jQuery UI.svg',
'name': 'jQuery UI',
'version': '1.10.3'},
{'categories': ['Programming Languages'],
'confidence': '100',
'icon': 'Python.png',
'name': 'Python',
'version': ''}],
'originalUrl': 'http://example.python-scraping.com',
'url': 'http://example.python-scraping.com'}


从上面可以看出,检测结果认为Python和web2py框架具有很高的可信度。我们还可以看到网站使用了前端CSS框架Twitter Bootstrap。Wappalyzer还检测到网站使用了Modernizer.js以及用于后端服务器的Nginx。由于网站只使用了JQuery和Modernizer,那么网站不太可能全部页面都是通过JavaScript加载的。而如果改用AngularJS或React构建该网站的话,此时的网站内容很可能就是动态加载的了。另外,如果网站使用了ASP.NET,那么在爬取网页时,就必须要用到会话管理和表单提交了。对于这些更加复杂的情况,我们会在第5章和第6章中进行介绍。


原文网址:https://www.epubit.com/book/detail/33225
内容来源:异步社区;版权属【人民邮电出版社 异步社区】所有,转载已获得授权;未经授权,不得以任何方式复制和传播本书内容,如需转载请联系异步社区。