python爬虫系列(一)我要解析站点,我要做一个绅士、文明的爬虫。
目录
一、前言:
- 在决定爬取一个站点之前,我们需要了解目标站点的规模和结构,做到知己知彼。
- 要实现该目标,我们可以通过解析站点本身提供的robots.txt 和Sitemap文件。
robots.txt:
- 大多数网站都会定义robots.txt文件,通过该文件告知即将要爬取本站的爬虫需要注意哪些事项,虽然该文件只是作为建议被提出,但是我们作为一只有绅士的爬虫,理应听取他人的建议。(本人站点就深受爬虫的残害,所以建议大家爬取个人的博客站点时,尽量把频率降低。)
Sitemap:
- 即站点地图的意思,网站提供的Sitemap文件可以帮助爬虫定位网站最新的内容,这样就不用每个网页都去爬取,减少不必要的资源浪费。
- 所以Sitemap更多的是帮助爬虫去更有针对性的抓取站点的数据。
- 如果你是做SEO,这个就是很必要的了,应为它能让百度或者google站点加快收录你的数据。
二、文件获取:
- 说了这么多,这个robots.txt文件要怎么获取呢?
获取robots.txt
- 我们可以使用urllib库提供的robotparser来获取和解析我们的robots.txt文件
RobotFileParser是robotparser提供的一个类,主要使用该类的set_url来设置robots.txt的绝对url路径,然后调用read()即可读取robots.txt文件。
- 方法详解:
- 1、set_url(url) :设置请求robots.txt文件的url
- 2、read();请求并读取robots.txt文件
- 3、mtime():获取最新抓取的时间
- 4、can_fetch(user_agent, url):检测某代理是否可访问指定的url
- 5、crawl_delay(user_agent):检测某代理请求一次后的延迟值
- 6、request_rate(user_agent):检测某代理的请求频率
- 7、modified()设置robots.txt最后被修改的时间为当前时间
-
示例代码
from urllib import robotparser,parse; import time url = "http://baidu.com"; rp = robotparser.RobotFileParser(); purl =parse.urljoin(url, '/robots.txt'); print('请求的url:%s'%purl); rp.set_url(purl); rp.read(); #返回robots.txt最后被抓取的时间 fetched_time = rp.mtime() x = time.localtime(fetched_time) t =time.strftime('%Y-%m-%d %H:%M:%S',x) print('最后被抓取的时间:%s'%t); user_agent1 = "Baiduspider"; user_agent2 = "Badlebot"; print("代理(%s)%s"%(user_agent1,rp.can_fetch(user_agent1, url))); print("代理(%s)%s"%(user_agent2,rp.can_fetch(user_agent2, url))); #返回爬取应该设置的延迟值,如果该代理无效或者robots.txt没有相关规定,返回None print(rp.crawl_delay(user_agent2)); #request_rate 返回请求的频率,如果未设置或者代理无效,同样返回None print(rp.request_rate(user_agent1)) #设置robots.txt最后被修改的时间为当前时间 rp.modified()
-
结果输出如下:
请求的url:http://baidu.com/robots.txt 最后被抓取的时间:2017-09-06 12:10:26 代理(Baiduspider)True 代理(Badlebot)False None None
-
我们可以直接访问http://baidu.com/robots.txt看下文件里面的内容(这里截取一部分):
User-agent: Baiduspider Disallow: /baidu Disallow: /s? Disallow: /ulink? Disallow: /link?
User-agent: Googlebot Disallow: /baidu Disallow: /s? Disallow: /shifen/ Disallow: /homepage/ Disallow: /cpro Disallow: /ulink? Disallow: /link?
User-agent: MSNBot Disallow: /baidu Disallow: /s? Disallow: /shifen/ Disallow: /homepage/ Disallow: /cpro Disallow: /ulink? Disallow: /link?
- OK,如此我们就完成了robots.txt文件的获取及解析,后面我们在抓取站点时,每次抓取都先调用can_fetch判断下,如此,是不是感觉我们是非常绅士的爬虫呢?
- 本次分享就到这里,本次我们只是在做前期的一些知识储备,后面我们会一点一点,逐步完成一个爬虫。
- 希望对正在阅读本篇文章的你有帮助。