在学习《python爬虫开发与项目实践》的时候有一个关于CrawlSpider的例子,当我在运行时发现,没有爬取到任何数据,以下是我敲的源代码:
import scrapy
from UseScrapyProject.items import UsescrapyprojectItem
from scrapy.spiders import CrawlSpider
from scrapy.spiders import Rule
from scrapy.linkextractors import LinkExtractor
from scrapy.crawler import CrawlerProcess
from scrapy import Selector from scrapy.utils.project import get_project_settings class SpiderUserCrawlSpider(CrawlSpider):
name ="secondSpider"
allow_domains=['cnblogs.com']
start_urls=['http://www.cnblogs.com/qiyeboy/default.html?page=1']
links = LinkExtractor(allow="/qiyeboy/default.html?page=\d{1,}") #rules是CrawlSpider比scrapy.Spider新增的参数
rules = (
Rule(link_extractor=links,follow=True,callback="parse_item"),
)
#Rule的回调函数
def parse_item(self,response):
papers=response.xpath(".//*[@class='day']")
#从每篇文章中抽取数据
for paper in papers:
date=paper.xpath(".//*[@class='dayTitle']/a/text()").extract()[0]
title = paper.xpath(".//*[@class='postTitle']/a/text()").extract()[0]
content = paper.xpath(".//*[@class='postCon']/div/text()").extract()[0]
url = paper.xpath(".//*[@class='postTitle']/a/@href").extract()[0]
# 把抽取到的数据结构化
item = UsescrapyprojectItem(date=date, title=title, content=content, url=url) request = scrapy.Request(url=url, callback=self.parse_body)
request.meta['item'] = item # 将item暂存
yield request next_page=Selector(response).re(u'<a href="(\S*)">下一页</a>')
if next_page:#如果存在下一页
#返回一个请求,url参数是下一页的地址,callback是回调的函数(这里的是把下一页的响应返回到parse函数继续抽取信息)
yield scrapy.Request(url=next_page[0],callback=self.parse) def parse_body(self,response):
item=response.meta['item']
body=response.xpath('.//*[@class="postBody"]')
item['image_urls']=body.xpath('.//img/@src').extract()
yield item if __name__ == '__main__':
# settings = get_project_settings() # 启动爬虫方法一
process=CrawlerProcess({
'USER_AGENT':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
})
process.settings = get_project_settings()
process.crawl(SpiderUserCrawlSpider)
# 如果有多个Spider,可以写多几个
#process.crawl(SecondTestSpider)
process.start() 上面是spider的源代码,一直没有爬取到结果,断点调试的时候发现根本没有跑进parse_item,网上查了很久,很多人表示callback不能使用默认的parse,可是我这里已经是parse_item了
然后尝试重新给parse_item取了别的名字,仍然是不行
直到看见某帖子里有人提到没有匹配到连接所以没有爬到数据,于是,就去检查LinkExtractor(allow="/qiyeboy/default.html?page=\d{1,}")中的正则表达式,
果然,当我使用Regex Match Tracer 2.1去验证的时候发现这个表达式发现果然是没法匹配到http://www.cnblogs.com/qiyeboy/default.html?page=1的链接。
再次检查发现表达式的问号没有转义
当改为
links = LinkExtractor(allow="/qiyeboy/default.html\?page=\d{1,}")
就能正常爬取数据,并保存为json,以及下载图片

【Spider】使用CrawlSpider进行爬虫时,无法爬取数据,运行后很快结束,但没有报错的更多相关文章

  1. 利用jsoup爬虫工具,爬取数据,并利用excel导出

    import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.FileInputStream; i ...

  2. 爬虫---scrapy全站爬取

    全站爬取1 基于管道的持久化存储 数据解析(爬虫类) 将解析的数据封装到item类型的对象中(爬虫类) 将item提交给管道, yield item(爬虫类) 在管道类的process_item中接手 ...

  3. [python爬虫] Selenium定向爬取海量精美图片及搜索引擎杂谈

    我自认为这是自己写过博客中一篇比较优秀的文章,同时也是在深夜凌晨2点满怀着激情和愉悦之心完成的.首先通过这篇文章,你能学到以下几点:        1.可以了解Python简单爬取图片的一些思路和方法 ...

  4. 【转载】教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神

    原文:教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神 本博文将带领你从入门到精通爬虫框架Scrapy,最终具备爬取任何网页的数据的能力.本文以校花网为例进行爬取,校花网:http:/ ...

  5. Python使用Scrapy框架爬取数据存入CSV文件(Python爬虫实战4)

    1. Scrapy框架 Scrapy是python下实现爬虫功能的框架,能够将数据解析.数据处理.数据存储合为一体功能的爬虫框架. 2. Scrapy安装 1. 安装依赖包 yum install g ...

  6. 爬虫实战——Scrapy爬取伯乐在线所有文章

    Scrapy简单介绍及爬取伯乐在线所有文章 一.简说安装相关环境及依赖包 1.安装Python(2或3都行,我这里用的是3) 2.虚拟环境搭建: 依赖包:virtualenv,virtualenvwr ...

  7. 芝麻HTTP:Python爬虫实战之爬取糗事百科段子

    首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致之前的代码没法用了,会导致无法输出和CPU占用过高的 ...

  8. Python网络爬虫与如何爬取段子的项目实例

    一.网络爬虫 Python爬虫开发工程师,从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页 ...

  9. 爬虫学习--MOOC爬取豆瓣top250

    scrapy框架 scrapy是一套基于Twisted的异步处理框架,是纯python实现的爬虫框架,用户只需要定制开发几个模块就可以轻松实现一个爬虫,用来抓取网页内容或者各种图片. scrapy E ...

随机推荐

  1. Android开发中常见的设计模式(二)——Builder模式

    了解了单例模式,接下来介绍另一个常见的模式--Builder模式. 那么什么是Builder模式呢.通过搜索,会发现大部分网上的定义都是 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建 ...

  2. 读取配置文件properties的几种方式

    介绍几种读取方式:参考:https://www.cnblogs.com/sebastian-tyd/p/7895182.html .基于ClassLoder读取配置文件 注意:该方式只能读取类路径下的 ...

  3. jqGrid 获取多级标题表头

    1.jgGrid没有提供此方法获取如下标题 2.实现代码 getHeaders:function(){ var headers=[],temptrs=[]; //select the group he ...

  4. Mysql 储存引擎

    查看当前版本支持哪些储存引擎 mysql> show engines; InnoDB 支持事务机制 : 保证操作安全性 行级锁定 : 开销大,加锁慢:会出现死锁:锁定粒度最小,发生锁冲突的概率最 ...

  5. <基础> PHP 进阶之 类型转换

    引用官方的解释 PHP 在变量定义中不需要(或不支持)明确的类型定义:变量类型是根据使用该变量的上下文所决定的.也就是说,如果把一个 string 值赋给变量$var,$var 就成了一个 strin ...

  6. NB-IoT移远BC95使用小结

    移远-BC95-测试前准备 1.  设备连接主串口,串口调试助手波特率使用9600,选择对应的端口号.在串口调试助手上输入AT发送,查看是否有OK返回. 如果想修改波特可以通过下面的AT来修改 AT+ ...

  7. J2SE 8的流库 --- 生成流

    本文介绍了如何产生J2SE 8的流, 包括基本类型的流IntStream, LongStream, DoubleStream . 展现流的方法 public static <T> void ...

  8. Tomcat的相关配置问题

    Tomcat的目录结构bin ---  存放启动和关闭tomcat的脚本文件 conf --- 存放tomcat的各种配置文件  (主要有server.xml,context.xml,web.xml) ...

  9. Error: Apache shutdown unexpectedly --解决

    原因1:端口占用,百度可解决 原因2: 配置的启动目录不存在~~~ 解决 修改默认目录:

  10. UNITY优化资料收集

    U3D手册: Optimizing garbage collection in Unity games https://zhuanlan.zhihu.com/p/25306993 https://gi ...