python爬虫系列(一)我要解析站点,我要做一个绅士、文明的爬虫。

  发布日期:   2017-09-07
  最新修改:   2020-02-09
  阅读次数:   71 次

一、前言:

  • 在决定爬取一个站点之前,我们需要了解目标站点的规模和结构,做到知己知彼。
  • 要实现该目标,我们可以通过解析站点本身提供的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()

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判断下,如此,是不是感觉我们是非常绅士的爬虫呢?
  • 本次分享就到这里,本次我们只是在做前期的一些知识储备,后面我们会一点一点,逐步完成一个爬虫。
  • 希望对正在阅读本篇文章的你有帮助。

   转载规则

《python爬虫系列(一)我要解析站点,我要做一个绅士、文明的爬虫。字》GajAngels 采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。