应课程需要写了几天爬虫,一开始使用requests+bs4的技术路线,但是速度不是很理想而且不能暂停,通过查阅资料,发现scrapy正是我需要的

做一下简短的记录:

首先应该毫不犹豫的scrapy startproject  gnspider;scrapy genspider gnspider http://www.chinanews.com;

然后定义items文件,写下我们希望爬虫下载的内容

紧接着去测试gnspider能否请求到网页

gnspider的写法

  1. class GnspiderSpider(scrapy.Spider):
  2.  
  3.   name = gnspider
  4.  
  5.   #从seed页开始,放入start_urls = []
  6.  
  7.   #seed页很多,则可以在def start_requests(self):重定义scrapy.Request(url),并返回由其组成的请求列表,即retuen [scrapy.Request(url),scrapy.Request(url),.....]
  8.  
  9.   def parse(self,response):
  10.  
  11.     #response是我们需要的网页的响应,我们通过css选择器或者xpath进行定位标签元素,这一步是最关键的,快速定位是必须的
  12.      response.css("div.content_list ul li div.dd_bt a::attr(href)").extract() #由于本科时了解过css,这里二话不说就用cssSelector,extract()是为了提取内容,结束提取则extract(),未结束则接着找标签。
  13.  
  14.     response.css("div.left_zw p::text").extract()
  15.  
  16.     content_list=response.xpath('//div[@id=\"artibody\"]/p/text()').extract()
  17.  
  18.     big_urls=sel.xpath('//div[@id=\"tab01\"]/div/h3/a/@href').extract()    #'http://news.sina.com.cn/guide'
  19.     big_titles=sel.xpath("//div[@id=\"tab01\"]/div/h3/a/text()").extract()
  20.     second_urls =sel.xpath('//div[@id=\"tab01\"]/div/ul/li/a/@href').extract()
  21.     second_titles=sel.xpath('//div[@id=\"tab01\"]/div/ul/li/a/text()').extract()
  22.  
  23.     divs = response.xpath("//div[@id='J_ItemList']/div[@class='product']/div")
  24.  
  25.     div.xpath("p[@class='productPrice']/em/@title")[0].extract()
  26.  
  27.     div.xpath("p[@class='productTitle']/a/@title")[0].extract()
  28.  
  29.     div.xpath("p[@class='productTitle']/a/@href")[0].extract()
  30.  
  31.     
  32.  
  33.     item["SHOP_NAME"] = div.xpath("li[1]/div/a/text()")[0].extract()
  34.     item["SHOP_URL"] = div.xpath("li[1]/div/a/@href")[0].extract()
  35.     item["COMPANY_NAME"] = div.xpath("li[3]/div/text()")[0].extract().strip()
  36.     item["COMPANY_ADDRESS"] = div.xpath("li[4]/div/text()")[0].extract().strip(
  37.  
  38.     #对于每个链接进行请求,这里我想强调的是meta这个参数,可以帮助我们将一级页面上爬到的内容传递到二级页面上,通过response.meta这个字典进行传递,非常方便我们对item进行组装
  39.  
  40.     for li in lis:
  41.  
  42.       yield scrapy.Request(li,callback = self.parse_detail,meta={"cate":cate})
  43.  
  44.   def parse_detail(self,response): #解析二级页面
  45.  
  46.     #经常我们爬取的是一个列表
  47.  
  48.     str1 = “”.join(lis) #split方法中不带参数时,表示分割所有换行符、制表符、空格。
  49.  
  50.     str1 = replace(" ","").replace("\u3000","")
  51.  
  52.     return item

写gnspider的时候一定不要一口气写完,一定要一个函数一个函数的测,首先保证地址写对了,其次保证标签选对了,最后保证item组装好了,我把它称为爬虫三段式

既然爬到了内容就应该存下来留个纪念,通过pipelines定义存储方式,在这里使用文件存储

  1. class MyspiderPipeline(object):
  2.   # def open_spider(self,spider):#针对爬虫
  3.   # self.f = open('gn.txt','a')
  4.  
  5.   # def close_spider(self,spider):
  6.   # self.f.close()
  7.  
  8.   def process_item(self, item, spider):#针对item
  9.     self.f = open(cate[item["CATEGORY"]] + '.txt','a')    #注意文件操作,防止乱码
  10.     line = str(dict(item)["CONTENT"]) + '\n'
  11.     self.f.write(line)
  12.     self.f.close()
  13.     return item

最后别忘了在配置文件中启用pipelines

总结如下:

简单爬虫三步走,1.定义items,2.parse页面,3.pipelines定义存储方式

其中parse页面又分为三步1.写对网址,2.找到标签,3.组装item

scrapy还提供了暂停功能:开始爬虫时使用命令  scrapy crawl gnspider  -s JOBDIR=supplement/auto

暂停时使用ctrl + c

再次启动时还使用命令  scrapy crawl gnspider -s JOBDIR=supplement/auto

当爬取大量数据时推荐写多个爬虫,同时进行,可使电脑资源发挥最大效果

爬完结束提示信息如下

简单总结scrapy使用方法的更多相关文章

  1. 简单的scrapy实战:爬取腾讯招聘北京地区的相关招聘信息

    简单的scrapy实战:爬取腾讯招聘北京地区的相关招聘信息 简单的scrapy实战:爬取腾讯招聘北京地区的相关招聘信息 系统环境:Fedora22(昨天已安装scrapy环境) 爬取的开始URL:ht ...

  2. R语言:用简单的文本处理方法优化我们的读书体验

    博客总目录:http://www.cnblogs.com/weibaar/p/4507801.html 前言 延续之前的用R语言读琅琊榜小说,继续讲一下利用R语言做一些简单的文本处理.分词的事情.其实 ...

  3. CSharpGL(40)一种极其简单的半透明渲染方法

    CSharpGL(40)一种极其简单的半透明渲染方法 开始 这里介绍一个实现半透明渲染效果的方法.此方法极其简单,不拖累渲染速度,但是不能适用所有的情况. 如下图所示,可以让包围盒显示为半透明效果. ...

  4. 简单工厂VS工厂方法

    前言: GOF经典的23种设计模式在IT界现已被广为流传.由于比较长时间没有用了,个人对于不同模式与模式之间的区别也渐渐模糊,故开始重温设计模式的思想.也希望更给对设计模式感兴趣的朋友些许的启发. - ...

  5. Simple Factory vs. Factory Method vs. Abstract Factory【简单工厂,工厂方法以及抽象工厂的比较】

    I ran into a question on stackoverflow the other day that sort of shocked me. It was a piece of code ...

  6. 结合实例分析简单工厂模式&工厂方法模式&抽象工厂模式的区别

    之前写过一篇关于工厂模式(Factory Pattern)的随笔,里面分析了简单工厂模式,但对于工厂方法和抽象工厂的分析较为简略.这里重新分析分析三者的区别,工厂模式是java设计模式中比较简单的一个 ...

  7. Java设计模式之简单工厂、工厂方法和抽象工厂

    在前面的学习中(参见前面的博客),我们学到了很多OO原则: 封装变化 多用组合,少用继承 针对接口/超类编程,不针对实现编程 松耦合 开闭原则 让我们从一个简单的类开始,看看如何将之改造成符合OO原则 ...

  8. 最简单的 RabbitMQ 监控方法 - 每天5分钟玩转 OpenStack(158)

    这是 OpenStack 实施经验分享系列的第 8 篇. 先来看张图:这是 Nova 的架构图,我们可以看到有两个组件处于架构的中心位置:数据库和Queue.数据库保存状态信息,而几乎所有的 nova ...

  9. Java实现一个简单的加密解密方法

    Crypto是Java语言写的一个简单的加密解密方法. 使用方法: 加密方法 String cipherte=Enande.encrypt(content, pass): 解密方法 Enande.de ...

随机推荐

  1. I/O复用(select)——回声服务器端/客户端

    一.select 使用select函数可以将多个文件描述符集中到一起统一监视,监视事件如下: 是否存在待读取数据. 是否可传输无阻塞传输数据. 是否发生异常. 将关心上述3种事件的文件描述发分别注册到 ...

  2. 【内存泄漏】 C/C++内存泄漏及其检测工具

    对于一个c/c++程序员来说,内存泄漏是一个常见的也是令人头疼的问题.已经有许多技术被研究出来以应对这个问题,比如 Smart Pointer,Garbage Collection等.Smart Po ...

  3. 架构之路:nginx与IIS服务器搭建集群实现负载均衡(三)

    参考网址:https://blog.csdn.net/zhanghan18333611647/article/details/50811980 [前言] 在<架构之路:nginx与IIS服务器搭 ...

  4. spoj1811

    题解: 后缀自动机 先把A的后缀自动机建好 然后用B再上面跑 如果不能转移就跳fail 如果可以就到下一个可行状态 代码: #include<bits/stdc++.h> using na ...

  5. OOP ⑴

    1.面向对象 类和对象的关系 类是我们在生活中,对身边的一系列事物,进行的不自觉的分类! 只是脑海中的一个印象! 在现实生活中,不存在! 存在的是我们这个印象的具体反映! 对象:用来描述客观事物的一个 ...

  6. OO第四次课程总结分析

    OO第四次课程总结分析 测试与正确性论证的效果差异及优缺点 测试,即使用测试样例来验证我们的程序是否能完成相应功能的过程.测试数据的产生基于前置条件和后置条件,通过执行测试数据检查方法输出是否满足需求 ...

  7. SpringBoot document notes

    图片拷贝不过来,直接从github上下载 . 链接: https://github.com/DFX339/SpringBootDocumentNotes.git Create a example po ...

  8. java 实现简单的顺序栈

    package com.my; import java.util.Arrays; /** * 顺序栈 * @author wanjn * */ public class ArrayStack { pr ...

  9. 【转载】Maven中的BOM概念

    1.概述 1.1.什么是 BOM? BOM stands for Bill Of Materials. A BOM is a special kind of POM that is used to c ...

  10. HTML--思维导图

    HTML--思维导图