【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 ...
随机推荐
- foreachPartition来写数据库
foreachPartition,在生产环境中,通常来说,都使用foreachPartition来写数据库的 使用批处理操作(一条SQL和多组参数) 发送一条SQL语句,发送一次 一下子就批量插入10 ...
- springMVC源码学习地址
springmvc工作原理以及源码分析(基于spring3.1.0) 感谢作者 宏愿, 在此记录下,以便学习 SpringMVC源码分析(1):分析DispatcherServlet.doDispa ...
- delphi treeview checkbox
delphi treeview checkbox 最新版Berlin还没有带checkbox的treeview?
- webstorm上svn的安装使用
1.首先要下载SlikSvn网址为:https://sliksvn.com/download/ 进入该网站可以根据需要下载32位的或者64位的svn.下图为要下载的图标样式 点击下载即可. 2.在w ...
- python中split()、os.path.split()函数用法
一.Python split() 通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则仅分隔 num 个子字符串 str.split(str="", num=string ...
- WDA-6-EP系统管理/内容管理/用户管理
主要是将EP端系统管理.内容管理.用户管理相关内容进行下梳理. 1.系统管理 1.1系统前景 1.2对象锁定 解锁相关对象 2.内容管理 2.1基本介绍 门户桌面-组件: 四大内容: iViews:可 ...
- Oracle部署安装
1.用户有数据库服务器则不需要安装Oracle服务器端,若没有需要安装 https://jingyan.baidu.com/article/363872eccfb9266e4aa16f5d.html ...
- Linux命令:ssh-add
ssh-add帮助 SSH-ADD() BSD General Commands Manual SSH-ADD() NAME ssh-add — adds private key identities ...
- U3D的结构体堆分配栈分配
ST ot;//分配在栈上 ST[] arrt = new ST[2];//分配在堆上,因为数组是引用
- k8s的Deployment 滚动升级
首先定义一个Deployment,并创建它 apiVersion: apps/v1beta1 kind: Deployment metadata: name: house-live spec: rep ...