zoukankan      html  css  js  c++  java
  • 使用scrapy框架爬取自己的博文

      scrapy框架是个比较简单易用基于python的爬虫框架,http://scrapy-chs.readthedocs.org/zh_CN/latest/ 这个是不错的中文文档

      几个比较重要的部分:

      items.py:用来定义需要保存的变量,其中的变量用Field来定义,有点像python的字典

      pipelines.py:用来将提取出来的Item进行处理,处理过程按自己需要进行定义

      spiders:定义自己的爬虫

      爬虫的类型也有好几种:

      1)spider:最基本的爬虫,其他的爬虫一般是继承了该最基本的爬虫类,提供访问url,返回response的功能,会默认调用parse方法

      2)CrawlSpider:继承spider的爬虫,实际使用比较多,设定rule规则进行网页的跟进与处理, 注意点:编写爬虫的规则的时候避免使用parse名,因为这会覆盖继承的spider的的方法parse造成错误。   其中比较重要的是对Rule的规则的编写,要对具体的网页的情况进行分析。

      3)XMLFeedSpider 与 CSVFeedSpider 

      实际操作:

    items.py下的:

    from scrapy.item import Item, Field
    
    
    class Website(Item):
    
        headTitle = Field()
        description = Field()
        url = Field()

    spider.py下的:

    # -*- coding:gb2312 -*-
    from scrapy.contrib.spiders import CrawlSpider,Rule
    from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
    from scrapy.selector import Selector
    from dirbot.items import Website
    import sys
    import string
    sys.stdout=open('output.txt','w') #将打印信息输出在相应的位置下
    
    
    add = 0
    class DmozSpider(CrawlSpider):
    
        name = "huhu"
        allowed_domains = ["cnblogs.com"]
        start_urls = [
            "http://www.cnblogs.com/huhuuu",
        ]
    
        
        rules = (
            # 提取匹配 huhuuu/default.html?page=([w]+) 的链接并跟进链接(没有callback意味着follow默认为True)
            Rule(SgmlLinkExtractor(allow=('huhuuu/default.html?page=([w]+)', ),)),
    
            # 提取匹配 'huhuuu/p/' 的链接并使用spider的parse_item方法进行分析
            Rule(SgmlLinkExtractor(allow=('huhuuu/p/', )), callback='parse_item'),
        )
    
        def parse_item(self, response):
            global add #用于统计博文的数量
            
            print  add
            add+=1
            
            sel = Selector(response)
            items = []
    
            item = Website()
            item['headTitle'] = sel.xpath('/html/head/title/text()').extract()#观察网页对应得html源码
            item['url'] = response
            print item
            items.append(item)
            return items

    最后在相应的目录文件下运行scrapy crawl huhu

    结果:

    但是我的博文好歹有400篇左右,最后只搜出了100篇,这是什么情况

    查了一些搜出来的网页地址,很多都是2013.10 到最近更新的博文情况,没道理啊,最后注意了老的博文的网址,原来老的博文地址的结构更新的博文地址的结构不同

    现在的:http://www.cnblogs.com/huhuuu/p/3384978.html

    老的:http://www.cnblogs.com/huhuuu/archive/2012/04/10/2441060.html

    然后在rule里面加入老网页的规则,就可以把博客中没加密的博文都搜出来了

    # -*- coding:gb2312 -*-
    from scrapy.contrib.spiders import CrawlSpider,Rule
    from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
    from scrapy.selector import Selector
    from dirbot.items import Website
    import sys
    import string
    sys.stdout=open('output.txt','w') #将打印信息输出在相应的位置下
    
    
    add = 0
    class DmozSpider(CrawlSpider):
    
        name = "huhu"
        allowed_domains = ["cnblogs.com"]
        start_urls = [
            "http://www.cnblogs.com/huhuuu",
        ]
    
        
        rules = (
            # 提取匹配 huhuuu/default.html?page=([w]+) 的链接并跟进链接(没有callback意味着follow默认为True)
            Rule(SgmlLinkExtractor(allow=('huhuuu/default.html?page=([w]+)', ),)),
    
            # 提取匹配 'huhuuu/p/' 的链接并使用spider的parse_item方法进行分析
            Rule(SgmlLinkExtractor(allow=('huhuuu/p/', )), callback='parse_item'),
            Rule(SgmlLinkExtractor(allow=('huhuuu/archive/', )), callback='parse_item'), #以前的一些博客是archive形式的所以
        )
    
        def parse_item(self, response):
            global add #用于统计博文的数量
            
            print  add
            add+=1
            
            sel = Selector(response)
            items = []
    
            item = Website()
            item['headTitle'] = sel.xpath('/html/head/title/text()').extract()#观察网页对应得html源码
            item['url'] = response
            print item
            items.append(item)
            return items

    又做了一个爬取博客园首页博客的代码,其实只要修改Rule即可:

    # -*- coding:gb2312 -*-
    from scrapy.contrib.spiders import CrawlSpider,Rule
    from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
    from scrapy.selector import Selector
    from dirbot.items import Website
    import sys
    import string
    sys.stdout=open('output.txt','w') #将打印信息输出在相应的位置下
    
    
    add = 0
    class DmozSpider(CrawlSpider):
    
        name = "huhu"
        allowed_domains = ["cnblogs.com"]
        start_urls = [
            "http://www.cnblogs.com/",
        ]
    
        
        rules = (
           
            Rule(SgmlLinkExtractor(allow=('sitehome/p/[0-9]+', ),)),
    
    
            Rule(SgmlLinkExtractor(allow=('[^s]+/p/', )), callback='parse_item'),
       
        )
    
        def parse_item(self, response):
            global add #用于统计博文的数量
            
            print  add
            add+=1
            
            sel = Selector(response)
            items = []
    
            item = Website()
            item['headTitle'] = sel.xpath('/html/head/title/text()').extract()#观察网页对应得html源码
            item['url'] = response
            print item
            items.append(item)
            return items
    View Code

    参考:http://scrapy-chs.readthedocs.org/zh_CN/latest/topics/spiders.html

  • 相关阅读:
    【BZOJ2844】albus就是要第一个出场 高斯消元求线性基
    Python入门之面向对象module,library,package之间区别
    Python入门之字典的操作详解
    Python Web学习笔记之TCP/IP协议原理与介绍
    Python Web笔记之高性能网络编程
    Python Web学习笔记之面试TCP的15个问题
    Python Web学习笔记之TCP/IP、Http、Socket的区别
    Python Web学习笔记之TCP、UDP、ICMP、IGMP的解释和区别
    Python Web学习笔记之IGMP和ICMP的差别
    Python设计模式之单例模式
  • 原文地址:https://www.cnblogs.com/huhuuu/p/3706994.html
Copyright © 2011-2022 走看看