Python Scrapy 爬取论文以及解决Unhandled error in Deferred问题

前言

最近由于要调研一些机器学习方面的最新研究技术,故需要看一些相关方面的论文,这里就简单写了一个爬虫脚本,非常简单,使用的是Scrapy 框架

在实践的过程中遇到Unhandled error in Deferred错误,网上大多给出的答案是说由于pypiwin32的问题,可以我的pypiwin32是没有问题的,可就是一直Unhandled error in Deferred错误,很无语呀,最后我发现自己一直是屏蔽Log信息运行的即

scrapy crawl arxiv --nolog

于是乎就定位不到具体错在哪里,所以如果你也遇到相同情况还是看一下log吧

scrapy crawl arxiv

我的情况是最后定位到是piplines.py文件出错啦,具体原因下面看,总之我想说的是,遇到Unhandled error in Deferred问题的时候,也许是piplines.py出错啦,应该定位检查一下的

本文适合刚入门同学

采用的是循序渐进的方式进行演示,直到最终目的,对Scrapy的各个文件作用都进行了演示对比

全部代码:https://github.com/Mryangkaitong/python_Crawler/tree/master/MolMachineLearning

 推荐:

入门博客:https://www.runoob.com/w3cnote/scrapy-detail.html

Scrapy英文文档:https://doc.scrapy.org/en/latest/topics/spiders.html

Scrapy中文文档:https://oner-wv.gitbooks.io/scrapy_zh/content/?q=

先给一下整体的脉络把控:

items.py : 是数据结构,类似一个字典

spiders文件夹下的arxiv.py  : 是爬虫文件,具体的名字可以根据自己的需要进行定义

pipelines.py :管道文件,负责对爬取的数据进行处理包括过滤,保存,下载等等

settings.py : 配置文件,其中比较关键的作用是是激活管道文件的运行

正文

要爬取的网站是https://arxiv.org/list/cs.LG/recent

下载的很简单啦,笔者这里使用的是anaconda

conda install Scrapy

安装好后,打开cmd ,输入scrapy 测试一下:

下面开始我们的小项目:

第一阶段

首先创建一个叫做MolMachineLearning的项目

scrapy startproject MolMachineLearning

创建好后进去到我们项目的文件夹下

cd MolMachineLearning

其下目录结构大概是这样:

接着我们就开始生成爬虫文件:

scrapy genspider arxiv "arxiv.org"

可以看到在spiders文件夹下已经生成好了我们的爬虫文件

编写数据结构items.py

 

编写爬虫文件arxiv.py

当然了,我们可以创建多个spiders

可以使用

scrapy list

来查看我们已经创建了的那些spiders

我们这里手动将start_urls改为我们目标的网址:

然后改写parse部分:

关于这里的Xpath怎么写,可以去看一下教程,或者还有一个方法,就是直接打开chome浏览器的开发工具下的elements

右键想要得到的Xpath处,选择Copy下的 Copy XPath即可得到

 

到此我们就算编写好爬虫文件啦!!

接着编写pipelines.py文件

这部分遇到两个问题:

开始的时候笔者是这样写的(错误的):

对比前后有两个不同,首先open的地方没有加上r

其次使用了utf8编码

导致的错误如下:

如果不加r那么路径会翻译转移字符\

第二个加了utf8后,笔者发现最后生成的txt文件中什么都没有,即数据没有写进txt文件中,去掉编码就可以啦,具体原因还不太清楚。

最后配置settings.py

这个的目的就是激活pipelines.py文件中的process_item函数执行,如果不配置,那么实际上pipelines.py是不会运行的

最后就是运行就可以啦:

scrapy crawl arxiv --nolog

 

注意是在如下目录下打开cmd运行的

结果:

第二阶段:

现在我们在第一阶段提取了论文题目,接下来要完成的目标是下载这些论文,框架的话还是和上面一样,这里简单说一下不同点吧:

一 :增加了一个url字段

items.py和arxiv.py修改如下

二 :使用了文件下载器FilesPipeline

pipelines.py修改如下

需要强调的是这里重写了一个类DownloadPapersPipeline,其重载了FilesPipeline,同时需要注意的是:

for paper_url in item['url']:

这句话中item['url']并不是我们理解的是由好多urls组成的,而是一个个单独的,所以在arxiv.py提取url字段的时候特意给其加了一个列表的形式,即如果不加这里[],那么比如对于一个url:https://arxiv.org/pdf/1904.05876.pdf,经过for paper_url in item['url']后提取出来的就是h啦,加上列表[https://arxiv.org/pdf/1904.05876.pdf],那么提取出来的就是正确的url啦,具体原因就是:pipelines.py文件是管道文件,它的执行不是等爬虫文件(arxiv)执行完,Item保存了所有数据,而是爬虫程序处理完一条数据后就会送到管道文件执行,所以送过去的是一条数据(理解有误,还望指正),总之想说的就是加[]

三 :设置配置文件

激活管道中相应的该类,同时设置pdf保存文件的路径。

运行结果:

会看到多了一个full文件,打开该文件:

已经下载好我们的文件啦,但是现在还有一个问题就是文件名不是我们想要的形式

我们可以利用我们提取的name字段来命名,需要注意的是:在win环境下文件名命名中是不允许有/ \ : * ? " < > |符号的,而从上面的例子中可以看到我们的论文题目中显然有的有冒号,于是我们要去掉这些特殊符号,方法多多,笔者这里用的就是re模块,不多解释啦,不是本文重点,感兴趣的可以百度一下

修改pipelines.py如下:

运行结果:

 

第三阶段:

如果你是想看看机器学习在各个领域的应用或者最近发表的机器学习文章有哪些?其实上面的例子就已经满足啦,可是假如我们只想获取某一方向的机器学习论文呢?那么我们就不得不进行一下筛选啦,假设我们现在只想要和深度学习有关的文章那么我们可以筛选题目中含有Deep的,当然了,为了使范围更广,我们可以多加关键字,比如通常CNN和RNN依据LSTM等等都是深度学习方面的论文,接下来我们就来干这件事情:

piplines.py修改如下:

可以看到,这里仅仅增加了红色框的部分,只有满足的item才会被返回,否则丢弃

settings.py修改如下:

需要说明的是:和之前对比,这里的又300 1 变为1和300 其实数字本身无多大意义,关键是相对大小,数字越小运行的优先级越高,这里将MolmachinelearningPipeline的优先级高于DownloadPapersPipeline即MolmachinelearningPipeline先运行,由于其内部实现了对item的过滤,过滤掉的数据之后不再传输给其他管道程序,所以MolmachinelearningPipeline中的item是过滤后的Item,达到我们的目的

运行结果:

结果下载的就只有深度学习方面的论文啦,注意这里是否能够精确的定位到你想要的论文的关键在于re模块正则化的应用,和爬虫本身并没有多大关系,为此这里不多这方面的解释啦

第四阶段:

做到这里,其实还没有结束,我们上面爬取的其实仅仅是一个页面的数据

而我们是想把最近的347篇都爬下来,怎么办呢?最通常的做法就是递归爬取

即在爬虫文件下的parse函数下加上

 urls = response.xpath('你的页数部分Xpath/@href').extract()
    for url in urls:
        yield Request(url, callback=self.parse)

但是笔者这里比较特殊:

会发现这里并不是全部显示,中间还有...,导致解析出来后是..,得不到这部分论文,解决的方法比较多,首先该网站做的比较好,可以通过点击more来增大步数,想这样:

还有就是点击all,即全部显示,这时候我们看一下其网址:

https://arxiv.org/list/cs.LG/pastweek?show=347

其实按月进行分割的

爬虫文件修改如下:

运行结果:

结束语:

其实即使全部下载下来也才300来篇,没有必要进行筛选,但是一旦数据量多了起来,其实第四阶段所做的事情还是很有必要的,这里之所以这么做是想尽可能的展现Scrapy的用法。

本文的主要目的:

通过本demo展现一下简单的框架:再写一遍很重要

items.py : 是数据结构,类似一个字典

spiders文件夹下的arxiv.py  : 是爬虫文件,具体的名字可以根据自己的需要进行定义

pipelines.py :管道文件,负责对爬取的数据进行处理包括过滤,保存,下载等等

settings.py : 配置文件,其中比较关键的作用是是激活管道文件的运行

 

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python爬虫Scrapy是一种用于爬取网站数据的工具。它可以自动化地从网站上获取数据,并将其存储在本地或远程服务器上。Scrapy使用Python编写,具有高效、灵活和可扩展的特点,可以处理大量数据和复杂的网站结构。使用Scrapy可以快速地获取所需的数据,从而为数据分析和挖掘提供支持。 ### 回答2: Python爬虫是一种快速、高效的网络爬虫工具,它利用Python语言及其强大的第三方库实现自动化爬取互联网信息的过程。而Scrapy是一个Python爬虫框架,可以帮助我们快速构建持续性的爬虫应用程序。 基于Scrapy框架的爬虫程序设计,首先需要明确自己的目标:确定目标网站、确定目标页面、确定目标信息。其次,在编写程序之前,我们需要构建好爬虫的数据模型,包括目标页面的结构、目标信息的抽取规则等。Scrapy框架的核心就是Spider,将会快速地处理目标页面,解析数据并且提取出所需信息。这些信息可以经过清洗、存储和分析等处理过程,最终达到我们的预期需求。 爬虫程序的主要步骤是: 1.创建一个Scrapy项目,包括spider、items、pipelines等。 2.定义spider,包括start_urls、parse等。 3.定义item,表示解析结果的结构。 4.定义pipeline,用于处理抓取到的数据。 5.运行爬虫程序并保存数据。 在使用Scrapy进行网络爬虫时,需要遵守相关法律法规,尊重目标网站的利益和知识产权,不进行违法、违规的操作,同时遵守robots.txt协议等规定,如不得爬取不允许抓取的页面。 总之,对于想要进行网络数据采集的人来说,Scrapy是一个非常强大的Python爬虫框架。它支持异步IO和协程等功能,可以快速、高效地提取目标数据。但是,使用Scrapy时需要遵循规则,合理利用,不进行违法、违规操作。 ### 回答3: Scrapy是基于Python语言的爬虫框架,它可以更好的帮我们实现爬取网站的任务。scrapy提供了一整套爬虫流程和一些基本机制,比如:异步处理,中间件机制,数据管道,数据解析等等。这些机制可以帮我们更加简便和高效地进行网络爬取任务。 使用Scrapy爬取网站有以下几个步骤: 1. 安装Scrapy框架 我们需要提前安装好PythonScrapy框架。安装Scrapy比较方便,可以通过pip来安装,命令为:pip install scrapy。 2. 创建scrapy爬虫工程 我们需要使用scrapy startproject 项目名的命令来创建项目,并进入到项目的工程目录来创建爬虫内容,命令为:scrapy genspider 爬虫名 域名。 3. 配置scrapy爬虫的设置 进入到Scrapy工程目录,找到settings.py文件,修改里面的文件配置,包括:User-Agent,爬虫间隔时间,ip代理池设置等等。 4. 配置scrapy爬虫的项 在Spider中定义需要爬取的网站信息,包括URL地址和需要获取的数据。 5. 实现URL地址的解析 在Spider中写解析函数,对爬虫获取到的URL进行解析,获取需要的数据内容。 6. 爬虫启动 最后,使用命令scrapy crawl 爬虫名,启动爬虫爬取的URL资源会被输出进行。如果爬虫爬取的URL过多,那么可以使用命令scrapy crawl 爬虫名 -o 文件名.格式名来保存爬虫获取到的数据内容。 总的来说,Scrapy是一个快速高效的爬虫框架,有着多种策略来处理不同种类的爬虫需求。使用Scrapy进行爬虫的开发,不仅能够为我们省去很多重复性工作,还能够提高我们的开发效率和爬虫的运行效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值