1. 检查robots.txt
大多数网站会准备一个 robot.txt 的文件,用来告知爬虫,我的站点有哪些限制。在爬去网站前,可以通过分析 robot.txt 文件来降低被封的几率,同时发现网站的结构。更多关于 robot.txt 的资料请参考:www.robotstxt.org。下面的代码是案例 robot.txt 文件内容,可以从链接:http://example.webscraping.com/robots.txt 获取。
# section 1
User-agent: BadCrawler
Disallow: /
# section 2
User-agent: *
Crawl-delay: 5
Disallow: /trap
# section 3
Sitemap: http://example.webscraping.com/sitemap.xml
在 section 1 中,robots.txt 使用 user agent BadCrawler 告知爬虫不要爬去该网站。但是这个东西形同虚设,有很多怕中可以直接直接按照 robotsbsite.txt 中给出的结构自动爬去整个站点。
在Section 2中, 为了防止使服务器过载,为所有 User-Agents 的下载请求设置了一个5秒的爬虫延迟。 Section 2中还声明了一个陷阱链接,/trap,一旦有爬虫访问了这个链接,服务器会短时间内或永久禁掉你的IP。
在 Section 3中,定义了一个Sitemap文件,会在下一节详解。
2. 检查 Sitemap
网站提供 Sitemap 文件来帮助爬虫们定位网站更新的内容,否则需要爬取每个页面。关于 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.webscraping.com/view/Afghanistan-1
</loc></url>
<url><loc>http://example.webscraping.com/view/Aland-Islands-2
</loc></url>
<url><loc>http://example.webscraping.com/view/Albania-3</loc>
</url>
...
</urlset>
Sitemap 提供了每个链接的URL信息,提高爬虫的爬去效率,但是 Sitemap 中的信息往往会出现丢失或不完整的情况。
3. 评估网站的规模
网站的规模决定了我们爬取的方式,如果只有你百个URL,那么效率就不是首要考虑的问题了。如果网站有百万级别的页面,全部爬取可能要花掉数月的时间。这个问题的解决办法,可以考虑并发下载或者分布式下载。
最快的评估方式,就是参考谷歌的爬虫,谷歌爬虫已经爬过了我们感兴趣的大部分站点。我们可以通过site关键字过滤出指定站点的相关信息。关于谷歌的高级检索功能,参考谷歌高级搜索页面的内容。
下面是我们使用谷歌查询站点的检索语句:site:example.webscraping.com
图中看出,谷歌给出的评估:该站点大约有200个URL,这个结果和实际结果相近,但是据我观察,对于大些的网站,谷歌的评估大多不是很准确。我们通过细化site关键词,缩小检索范围,比如使用关键词 site:example.webscraping.com/view 检索出了所有国家相关页面。这样可以根据我们需要的数据,有针对性的爬取站点。
4. 查看目标站点使用的技术
目标站点搭建使用的技术也觉定了我们爬取的方式。我们可以通过buildwith模块来查看目标站的技术清单,该模块的安装方式:
pip install builtwith
模块接收一个目标站URL作为参数,并返回站点使用的技术清单,例如:
>>> import builtwith
>>> builtwith.parse('http://example.webscraping.com')
{u'javascript-frameworks': [u'jQuery', u'Modernizr', u'jQuery UI'],
u'programming-languages': [u'Python'],
u'web-frameworks': [u'Web2py', u'Twitter Bootstrap'],
u'web-servers': [u'Nginx']}
我们看到 example website 使用了 Web2py Python Web 框架以及一些常见的 JS 库,因此他的内容大多是嵌入HTML中,意味着我们可以直接爬取需要的数据。如果站点使用了 AngularJS,以为这它的内容是动态加载的。或者网站使用了 ASP.NET,那么爬取过程就需要用到 sessions 和 form submissions。关于 Dynamic Content 和 Interacting with Forms 回头我们再具体讨论。
下面看另外一个网站的查询结果:
>>> import builtwith
>>> builtwith.parse('http://www.jianshu.com')
{u'javascript-frameworks': [u'Modernizr'], u'web-frameworks': [u'Ruby on Rails'], u'programming-languages': [u'Ruby'], u
'web-servers': [u'Nginx']}
5. 查看目标站点的归属信息
有些站点的所有者,对自己站点设定了苛刻的爬取规则,对于此类目标,我们应该尽可能保守的开展工作。因此需要实现了解目标站的归属信息。这里,我们使用Python包装类模块 python-whois 来查询所需信息,首先安装这个工具:
pip install python-whois
下面是使用这个模块来查询站点 csnd.net 的 WHOIS 响应:
>>> import whois
>>> print whois.whois('appspot.com')
{
...
"name_servers": [
"NS1.GOOGLE.COM",
"NS2.GOOGLE.COM",
"NS3.GOOGLE.COM",
"NS4.GOOGLE.COM",
"ns4.google.com",
"ns2.google.com",
"ns1.google.com",
"ns3.google.com"
],
"org": "Google Inc.",
"emails": [
"abusecomplaints@markmonitor.com",
"dns-admin@google.com"
]
}
我们看到,这个域名归属于谷歌,这个就是谷歌的 App Engine service 站点。 爬去这个站点的时候需要小心,因为谷歌经常会封掉爬这个站点的爬虫。
下面是优快云的 WHOIS 信息:
>>> import whois
>>> print whois.whois('youkuaiyun.com')
{
"updated_date": [
"2014-11-26 00:00:00",
"2015-01-28 23:17:54"
],
"status": "clientTransferProhibited https://icann.org/epp#clientTransferProhibited",
"name": "Beijing Chuangxin Lezhi Co.ltd",
"dnssec": "Unsigned",
"city": "Beijng",
"expiration_date": [
"2017-03-11 00:00:00",
"2017-03-11 05:00:00"
],
"zipcode": "100016",
"domain_name": "youkuaiyun.com",
"country": "CN",
"whois_server": "whois.networksolutions.com",
"state": "Beijing",
"registrar": "NETWORK SOLUTIONS, LLC.",
"referral_url": "http://networksolutions.com",
"address": "B3-2-1 ZHaowei Industry Park",
"name_servers": [
"NS3.DNSV3.COM",
"NS4.DNSV3.COM"
],
"org": "Beijing Chuangxin Lezhi Co.ltd",
"creation_date": [
"1999-03-11 00:00:00",
"1999-03-11 05:00:00"
],
"emails": [
"abuse@web.com",
"Jiangtao@youkuaiyun.com"
]
}