简单总结scrapy使用方法
应课程需要写了几天爬虫,一开始使用requests+bs4的技术路线,但是速度不是很理想而且不能暂停,通过查阅资料,发现scrapy正是我需要的
做一下简短的记录:
首先应该毫不犹豫的scrapy startproject gnspider;scrapy genspider gnspider http://www.chinanews.com;
然后定义items文件,写下我们希望爬虫下载的内容
紧接着去测试gnspider能否请求到网页
gnspider的写法
class GnspiderSpider(scrapy.Spider): name = “gnspider” #从seed页开始,放入start_urls = [] #seed页很多,则可以在def start_requests(self):重定义scrapy.Request(url),并返回由其组成的请求列表,即retuen [scrapy.Request(url),scrapy.Request(url),.....] def parse(self,response): #response是我们需要的网页的响应,我们通过css选择器或者xpath进行定位标签元素,这一步是最关键的,快速定位是必须的
response.css("div.content_list ul li div.dd_bt a::attr(href)").extract() #由于本科时了解过css,这里二话不说就用cssSelector,extract()是为了提取内容,结束提取则extract(),未结束则接着找标签。 response.css("div.left_zw p::text").extract() content_list=response.xpath('//div[@id=\"artibody\"]/p/text()').extract() big_urls=sel.xpath('//div[@id=\"tab01\"]/div/h3/a/@href').extract() #'http://news.sina.com.cn/guide'
big_titles=sel.xpath("//div[@id=\"tab01\"]/div/h3/a/text()").extract()
second_urls =sel.xpath('//div[@id=\"tab01\"]/div/ul/li/a/@href').extract()
second_titles=sel.xpath('//div[@id=\"tab01\"]/div/ul/li/a/text()').extract() divs = response.xpath("//div[@id='J_ItemList']/div[@class='product']/div") div.xpath("p[@class='productPrice']/em/@title")[0].extract() div.xpath("p[@class='productTitle']/a/@title")[0].extract() div.xpath("p[@class='productTitle']/a/@href")[0].extract() item["SHOP_NAME"] = div.xpath("li[1]/div/a/text()")[0].extract()
item["SHOP_URL"] = div.xpath("li[1]/div/a/@href")[0].extract()
item["COMPANY_NAME"] = div.xpath("li[3]/div/text()")[0].extract().strip()
item["COMPANY_ADDRESS"] = div.xpath("li[4]/div/text()")[0].extract().strip( #对于每个链接进行请求,这里我想强调的是meta这个参数,可以帮助我们将一级页面上爬到的内容传递到二级页面上,通过response.meta这个字典进行传递,非常方便我们对item进行组装 for li in lis: yield scrapy.Request(li,callback = self.parse_detail,meta={"cate":cate}) def parse_detail(self,response): #解析二级页面 #经常我们爬取的是一个列表 str1 = “”.join(lis) #split方法中不带参数时,表示分割所有换行符、制表符、空格。 str1 = replace(" ","").replace("\u3000","") return item
写gnspider的时候一定不要一口气写完,一定要一个函数一个函数的测,首先保证地址写对了,其次保证标签选对了,最后保证item组装好了,我把它称为爬虫三段式
既然爬到了内容就应该存下来留个纪念,通过pipelines定义存储方式,在这里使用文件存储
class MyspiderPipeline(object):
# def open_spider(self,spider):#针对爬虫
# self.f = open('gn.txt','a') # def close_spider(self,spider):
# self.f.close() def process_item(self, item, spider):#针对item
self.f = open(cate[item["CATEGORY"]] + '.txt','a') #注意文件操作,防止乱码
line = str(dict(item)["CONTENT"]) + '\n'
self.f.write(line)
self.f.close()
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使用方法的更多相关文章
- 简单的scrapy实战:爬取腾讯招聘北京地区的相关招聘信息
简单的scrapy实战:爬取腾讯招聘北京地区的相关招聘信息 简单的scrapy实战:爬取腾讯招聘北京地区的相关招聘信息 系统环境:Fedora22(昨天已安装scrapy环境) 爬取的开始URL:ht ...
- R语言:用简单的文本处理方法优化我们的读书体验
博客总目录:http://www.cnblogs.com/weibaar/p/4507801.html 前言 延续之前的用R语言读琅琊榜小说,继续讲一下利用R语言做一些简单的文本处理.分词的事情.其实 ...
- CSharpGL(40)一种极其简单的半透明渲染方法
CSharpGL(40)一种极其简单的半透明渲染方法 开始 这里介绍一个实现半透明渲染效果的方法.此方法极其简单,不拖累渲染速度,但是不能适用所有的情况. 如下图所示,可以让包围盒显示为半透明效果. ...
- 简单工厂VS工厂方法
前言: GOF经典的23种设计模式在IT界现已被广为流传.由于比较长时间没有用了,个人对于不同模式与模式之间的区别也渐渐模糊,故开始重温设计模式的思想.也希望更给对设计模式感兴趣的朋友些许的启发. - ...
- 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 ...
- 结合实例分析简单工厂模式&工厂方法模式&抽象工厂模式的区别
之前写过一篇关于工厂模式(Factory Pattern)的随笔,里面分析了简单工厂模式,但对于工厂方法和抽象工厂的分析较为简略.这里重新分析分析三者的区别,工厂模式是java设计模式中比较简单的一个 ...
- Java设计模式之简单工厂、工厂方法和抽象工厂
在前面的学习中(参见前面的博客),我们学到了很多OO原则: 封装变化 多用组合,少用继承 针对接口/超类编程,不针对实现编程 松耦合 开闭原则 让我们从一个简单的类开始,看看如何将之改造成符合OO原则 ...
- 最简单的 RabbitMQ 监控方法 - 每天5分钟玩转 OpenStack(158)
这是 OpenStack 实施经验分享系列的第 8 篇. 先来看张图:这是 Nova 的架构图,我们可以看到有两个组件处于架构的中心位置:数据库和Queue.数据库保存状态信息,而几乎所有的 nova ...
- Java实现一个简单的加密解密方法
Crypto是Java语言写的一个简单的加密解密方法. 使用方法: 加密方法 String cipherte=Enande.encrypt(content, pass): 解密方法 Enande.de ...
随机推荐
- laravel基于Bootstrap的成功和失败的提示信息和验证提示信息
message.blade.php <!-- 成功提示框 --> @if(Session::has("success")) <div class="al ...
- 【oracle】oracle REGEXP_SUBSTR分割字符串
REGEXP_SUBSTR的使用:通过REGEXP_SUBSTR进行数据分割: , LEVEL, 'i') AS STR FROM DUAL CONNECT BY LEVEL <= LENGTH ...
- JAVA项目之苹果IAP内购JAVA服务器验证流程详解
1.前言 本博客是经历过多个项目检验的, 绝对真实, 适应于对苹果iap内购稍微有些了解的JAVA开发人员, 认真看, 定能完美解决苹果内购问题. 苹果IAP内购支付实际上是"将客户端支 ...
- PHP开发者的Linux学习之路
谈起一个高效动态网站的构建,那就不得不提到LAMP,即Linux操作系统.Apache网络服务器.Mysql数据库.Perl.PHP或Python编程语言等开源产品所组成的网站架构框架,其最大的优势是 ...
- TModalResult 和 MessageBox 返回值
//其实是对应的{ TModalResult values } const mrNone = ; mrOk = idOk; mrCancel = idCancel; mrAbort = idAbort ...
- Spring Boot + Druid 监控数据库(三)
Druid可以做什么? 1) 可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助. 2) 替换DBC ...
- intelij idea常用设置
1.genneral设置 2.自动导包 3.设置显示行号和方法分隔符 4.忽略大小写提示代码 比如:输入str会让其提示String 5.去掉单行显示类,让idea多行显示,容易找到类 6.设置字体及 ...
- SQL-20 查找员工编号emp_no为10001其自入职以来的薪水salary涨幅值growth
题目描述 查找员工编号emp_no为10001其自入职以来的薪水salary涨幅值growthCREATE TABLE `salaries` (`emp_no` int(11) NOT NULL,`s ...
- SpringMVC 接受页面传递参数
一共是五种传参方式: 一:直接将请求参数名作为Controller中方法的形参 public String login (String username,String password) : 解 ...
- countdownlatch 和 CyclicBarrier 和 Semaphore
cdl用的是aqs,共享的是aqs那个volatile的state,阻塞线程列表用的也是aqs的 cb用的是reentrantlock+condition,当然rel用的也是aqs不过不同的是用的是互 ...