【Spider】使用CrawlSpider进行爬虫时,无法爬取数据,运行后很快结束,但没有报错
在学习《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进行爬虫时,无法爬取数据,运行后很快结束,但没有报错的更多相关文章
- 利用jsoup爬虫工具,爬取数据,并利用excel导出
import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.FileInputStream; i ...
- 爬虫---scrapy全站爬取
全站爬取1 基于管道的持久化存储 数据解析(爬虫类) 将解析的数据封装到item类型的对象中(爬虫类) 将item提交给管道, yield item(爬虫类) 在管道类的process_item中接手 ...
- [python爬虫] Selenium定向爬取海量精美图片及搜索引擎杂谈
我自认为这是自己写过博客中一篇比较优秀的文章,同时也是在深夜凌晨2点满怀着激情和愉悦之心完成的.首先通过这篇文章,你能学到以下几点: 1.可以了解Python简单爬取图片的一些思路和方法 ...
- 【转载】教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神
原文:教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神 本博文将带领你从入门到精通爬虫框架Scrapy,最终具备爬取任何网页的数据的能力.本文以校花网为例进行爬取,校花网:http:/ ...
- Python使用Scrapy框架爬取数据存入CSV文件(Python爬虫实战4)
1. Scrapy框架 Scrapy是python下实现爬虫功能的框架,能够将数据解析.数据处理.数据存储合为一体功能的爬虫框架. 2. Scrapy安装 1. 安装依赖包 yum install g ...
- 爬虫实战——Scrapy爬取伯乐在线所有文章
Scrapy简单介绍及爬取伯乐在线所有文章 一.简说安装相关环境及依赖包 1.安装Python(2或3都行,我这里用的是3) 2.虚拟环境搭建: 依赖包:virtualenv,virtualenvwr ...
- 芝麻HTTP:Python爬虫实战之爬取糗事百科段子
首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致之前的代码没法用了,会导致无法输出和CPU占用过高的 ...
- Python网络爬虫与如何爬取段子的项目实例
一.网络爬虫 Python爬虫开发工程师,从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页 ...
- 爬虫学习--MOOC爬取豆瓣top250
scrapy框架 scrapy是一套基于Twisted的异步处理框架,是纯python实现的爬虫框架,用户只需要定制开发几个模块就可以轻松实现一个爬虫,用来抓取网页内容或者各种图片. scrapy E ...
随机推荐
- 13.App爬取相关库的安装(Charles,Mitmproxy,Appium)
由于App没有像浏览器一样直观的后台请求工具,主要用一些抓包技术抓取数据.(目前也在学习安装,参考书籍.) 首先呢,一些简单的接口通过Charles或mitmproxy分析,找出规律,直接用程序去抓取 ...
- mybatis二(参数处理和map封装及自定义resultMap)
.单个参数 mybatis不会做特殊处理. #{参数名/任意名}:取出参数值. .多个参数 mybatis会做特殊处理. 多个参数会被封装成 一个map. key:param1...paramN,或者 ...
- 42. oracle通过两张表的一个字段对应,update其中一张表的某个字段
update A a set a.A2 = (select b.B2 from B b where b.B1=a.A1) where exists (select 1 from B where B.B ...
- SecureCRT方向键不可用
SecureCRT方向键不可用,没有反应 选项--会话选项--终端--仿真
- putty登录显示IP
登陆服务器 cd vi .bashrc 在尾部加入如下代码 if [ "$SSH_CONNECTION" != '' -a "$TERM" != 'linux' ...
- python 可迭代对象与迭代器
生成器函数的工作原理只要 Python 函数的定义体中有 yield 关键字, 该函数就是生成器函数. 调用生成器函数时, 会返回一个生成器对象. 也就是说, 生成器函数是生成器工厂. 调用生成器函数 ...
- ACM__菜鸟之经典错误
1:多组输入与单组输入 Input contains multiple test cases. Input contains a single test case. 2: EOF=-1 while( ...
- Flex_布局和容器
1.Halo组件也称MX组件,是Flex3的独有组件(按钮.文本字段.容器等).而Flex4引入了新一代的组件,称为Spark. Flex4同时支持Halo和Spark.但是很多Halo组件都有更 ...
- 跨域(四)——document.domain
浏览器有一个合法的性质:一个页面可以设置document.domain为当前子域或比当前子域更高级的域.一般顶级就到了根域,如果设置为其他域,浏览器就会报权限错误. 利用这个性质,我们可以通过设置do ...
- 安装安卓SDK和JDK的简便方法
直接在VS的安装程序里选:使用.NET的移动开发,其中就包括了安卓SDK,JAVA SE等 另外:自己手动安装SDK时,不要选模拟器相关的东西,太大了,如果每个版本都选,安装下来上100G以上