scrapy的简单学习

来源:互联网 发布:淘宝开店 营业执照 编辑:程序博客网 时间:2024/05/12 14:16

scrapy
功能很强大,但我学习的是入门级别的
http://docs.pythontab.com/scrapy/scrapy0.24/topics/selectors.html中文官方文档
http://blog.csdn.net/qq_30242609/article/details/52810840 参考博客教程
http://blog.csdn.net/column/details/younghz-scrapy.html 参考博客教程(比较有深度)
安装过程比较麻烦。。。因为此包是比较高级的包,它是在很多包的基础之上工作的
安装过程参考http://cuiqingcai.com/1052.html
下面是scrapy的工作原理
这里写图片描述
这是实例解释
这里写图片描述
这里写图片描述
在命令提示符下创建scrapy项目之后自动生成1-4文件
这里以我写的爬贴吧贴子为例,但是有个未解决问题,这里爬下来的每个页面之间是们没有顺序的。。。
1 是写爬虫的

2是写数据的
类型于这样,定义想要获取的内容

    class StiebaItem(scrapy.Item):        # define the fields for your item here like:        # name = scrapy.Field()        comment=scrapy.Field()        name=scrapy.Field()

但是我写的爬虫里面并没有调用它。。。因为我只需要评论直接写入文件就好了
3是处理获得数据的
类型于这样。。。也可以写入数据库什么的。。我同样没有用到

    def process_item(self, item, spider):        file = open("item.txt", "a")  # 以追加的方式打开文件,不存在则创建        item_string = str(item).decode("unicode_escape").encode('utf-8')        file.write(item_string)        file.write('\n')        file.close()

4是写入固定不变的配置的,例如Header,并且添加才能用pipelines文件

ITEM_PIPELINES = {'stieba.pipelines.StiebaPipeline': 300}

5是我添加的,加入一行代码,替换掉在命令行内启动,运行时直接选择这个文件就行了

from scrapy import cmdlinecmdline.execute("scrapy crawl sstieba".split())

以下是我第一个用scrapy写的小代码
在spiders文件夹下添加tieba_spider.py文件

#coding=utf-8from scrapy.spider import Spiderfrom scrapy.selector import Selectorfrom scrapy import Requestfrom stieba.items  import StiebaItemimport reclass TiebaSpider(Spider):    name = 'sstieba'#执行命令的时候的爬虫的名字    allowed_domains=['tieba.baidu.com']#限制访问的域名,可以多个     start_urls=['http://tieba.baidu.com/f?kw=%E7%9F%B3%E5%AE%B6%E5%BA%84%E5%B8%82%E7%9F%BF%E5%8C%BA%E4%B8%AD%E5%AD%A6&fr=index']#开始的地址    def start_requests(self):#这是重写的方法 不需要手动调用        print 'kaishi'        yield Request(self.start_urls[0],callback=self.aparse,)#多线程,请求    def aparse(self, response):        print 'pachong'        selector = Selector(response)        print selector,'zheli'        tiezi_urls=selector.xpath('//div[@class="threadlist_title pull_left j_th_tit "]/a/@href')        tieba_page=selector.xpath('//span[@class="pagination-current pagination-item "]/following-sibling::a[1]/@href').extract()        print tieba_page,'xiayiye'        print tiezi_urls        for tiezi_url in tiezi_urls:            url='http://tieba.baidu.com'+str(tiezi_url.extract())            print '贴吧地址',url            yield Request(url,callback=self.page)        if tieba_page[0]:            yield Request(tieba_page[0], callback=self.aparse)            print 'tiebaxiayiye',tieba_page[0]    def page(self,response):        selector = Selector(response)        item = StiebaItem()#没用上 也可以用这里来处理所得的内容        name = selector.xpath('//h1[@class="core_title_txt  "]/@title').extract()[0]        od = open('item.txt', 'a')        od.write(name.encode('utf-8')+'\n')        page=selector.xpath('//span[@class="red"]/text()').extract()[1].encode('utf-8')        print response.url,page        for i in range(1,int(page)+1):            yield Request(response.url+'?pn='+str(i),callback=self.tiezi_parse)    def tiezi_parse(self,response):        selector=Selector(response)        od = open('item.txt', 'a')        pilus=selector.xpath('//div[@class="d_post_content j_d_post_content  clearfix"]').extract()        for pilu  in pilus:            pilua=pilu.encode('utf-8')            reg=re.compile('arfix">            (.*)</div>')            pilub=re.findall(reg,pilua)            pasl=re.sub(r'<br>', '',pilub[0])            print pasl            od.write(pasl+'\n')

其实其他文件不用做改动就能运行了。。。
在我的理解scrapy与我之前学习的大跃进就是创建工程了,不再是单个文件实现各种功能了
还有就是速度比bs快的多,因为它是多线程的,资源使用率提高很多速度就变快了
其它的优势还有很多,不过由于我学的太浅了,还没有体会出来

0 0