在scrapy中parse函数里面xpath的内容打印不出来_如何正确的使用Scrapy ?

6c2d51b0649d26b1d6f9509a43acc380.png
本节是 《Python爬虫从入门到进阶》课程中的一节,课程购买链接(PC访问需要微信扫码) ,目前已更新80% 课程

购买课程请扫码:

42dacf95a7f195e0d42ed402d7d3afe7.png

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。只需要编写很少的代码就能实现抓取功能,另外由于它底层用了twisted,性能也非常优越。使用Scrapy框架编写的抓取代码,可读性很强,非常利于维护,是现在最流行的抓取框架。

安装

pip install scrapy SQLAlchemy

SQLAlchemy之后我们会用到

一个简单爬虫

我们写一个简单地例子,抓取开发者头条最近5天feed页面的文章地址和标题。先抓包分析下怎么抓比较好。

(略过抓包过程, 课程视频中有..)

接着我们就可以写爬虫代码了:

from 

好的习惯是先定义Item,这里每项包含标题和链接。start_urls就是要抓取的里面列表。重载了parse方法,里面做页面解析:我还是用xpath的方法。另外在parse里面我没有延伸,就是没有翻页或者解析出新的链接再抓取,一共就抓了这5个页面

接下来就是抓取,使用 runspider 就能运行了,不过头条要求使用一个正确的UA。所以在命令行用-s指定了USER_AGENT变量。另外-o表示把结果导出到toutiao.json文件中

USER_AGENT

在运行中通过DEBUG信息其实大家就可以看到抓到了什么,当然json文件里面就是最终结果。假如你的程序写的有问题,在运行过程中会抛错,看着堆栈改bug就好了。

上面就是Scrapy的一个基本用法了。可以感受到,我们写的代码非常少,就实现了一个异步的抓取和处理。说的再明确一点,你不需要等待一个任务完成,他们是一起抓取的,充分利用CPU时间,另外即使一些请求失败了,或者处理过程中出错了,其他请求还可以继续完成。

而且我这里使用ITEM定义结构,让这个项目更清晰好理解

爬虫工程

上面我们演示的是一个简单地小例子。事实上Scrapy更倾向于Django那样的的企业级用法。可以在命令行下非常容易的创建一个复杂的爬虫项目

我们看一下项目下的目录结构

# 创建一个叫做toutiao_project的项目
❯ tree toutiao_project
toutiao_project
├── scrapy.cfg
└── toutiao_project├── __init__.py├── items.py├── middlewares.py├── pipelines.py├── settings.py└── spiders├── __init__.py

scrapy.cfg是Scrapy的配置文件。item.py存放了一些抓取对象的schema,或者说Item是保存爬取到的数据的容器。 middlewares.py是Spider中间件,使用中间件可以在抓取过程中的对应事件钩子上加上额外的行为, 比如添加代理,自动登录等等。pipelines.py是项目管道,当Item在Spider中被收集之后,它将会被传递到Item Pipeline,会按照一定的顺序执行对Item的处理。常见的如去重,验证item值,将爬取结果保存到数据库中等等。上面说的scrapy.cfg是针对Scrapy框架的配置,settings.py是针对于项目本身的设置,比如用什么中间件、并发数量、UA、Pipelines等等。全部选项可以看官方文档,如果你要深入了解和使用这个框架,这些设置项都是应该了解的。spiders目录下就是具体的抓取代码

定义Item

接着我们把开发者头条的抓取的逻辑迁移到这种项目用法中。定义Item这个结构之前我们已经做过,我觉得无论你使用Scrapy的哪种方式:是一个小脚本去抓,还是一个很复杂的大项目去爬,都建议要有一个良好的schema结构,现在我们只是需要把ToutiaoItem放到items.py文件中

这种Item很像ORM的用法,对吧。每个字段是一个Field。每种获取的数据都可以写成一个这样的Item类,它要继承scrapy.Item。

添加抓取逻辑

可以在spiders子目录下创建一个文件,从items.py里面import ToutiaoItem。这里要注意,我写全了import模块路径。

代码文件的名字没有要求,关键是类中name的名字。

通过 Item Pipeline 把数据存到数据库

在之前的小例子中,我们只是把数据存在json文件中。这次我们把数据存到数据库,反正本地测试我就存进SQLite,而且由于用到SQLAlchemy,上线时直接改成MySQL或者PostgreSQL的DB_URL就好了。

顺便提一下去重,去重是一个基本的抓取优化,但是对于我们这个需求,feed里面肯定不会有重复的内容,所以就不考虑了

首先我们用SQLAlchemy写一个头条的模型

除了toutiao这个模型还写了2个功能函数,一个是连接数据库的,一个是创建表的。DB_URL在配置文件中:

here 

接着我们看pipelines.py:

里面使用session的形式,需要在process_item方法内加上添加记录的逻辑。在__init__里面获得了engine,然后通过engine创建数据库。当然这个创建数据库的步骤可以只做一次,虽然重复执行也不会有什么影响.

接着需要在settings里面指定这个pipeline:

ITEM_PIPELINES 

后面那个300表示执行的顺序, 值越小越靠前,下面说的中间件也是:同类中间件中,这个顺序值越小越先执行

项目配置

当然到这里还是不能抓取,是因为开发者头条要求我们使用一个正确的UA。所以要修改settings.py. 改一下USER_AGENT。这个ua是我个人电脑的UA。

USER_AGENT 

设置中间件

接着我们看看中间件怎么用,在Scrapy中有 2 种中间件,

  1. 下载器中间件(Downloader Middleware)
  2. Spider中间件(Middleware)

一个是下载器中间件,在request/response之间。另外一个是Spider中间件,发生在spider处理过程中。我们先看一个下载器中间件的例子。之前我们在配置文件中指定了USER_AGENT, 但是ua只有一个。这里实现随机换一个正确UA的例子。

# pip install fake_useragent

其中用到的fake-useragent这个库会下载一个数据文件,可能需要想办法去国外下载下。每次调用会随机拿一个ua,避免了重复用一个。当然大家还可以扩展思路,有代理池的话,每次代理也随机换。

看settings.py里面对应中间件的配置:

DOWNLOADER_MIDDLEWARES 

这里注意,其实scrapy里面其实已经实现了一个UserAgent的中间件,这样在settings里面指定USER_AGENT就能让抓取使用对应的ua了。不过既然我们实现了随机ua中间件,自带的那个就可以让他的执行顺序为None,让它不起作用了

Spider Middleware这种我们日常开发基本用不到,不过呢,为了演示我们这里就实现一个用logging模块记录日志的中间件,要不然scarpy默认的抓取过程debug日志很多,抓不到重点,使用这个日志中间件,可以很有针对性的了解抓取情况

import 

这样就可以把抓取的内容写入日志,同时由于我们定制了logging模块的日志格式,日志中会记录时间。基于时间和结果可以有助于未来排查问题。接着我们要改一下settings.py设置

FILE_LOGGING_ENABLED 

PS:如果不指定FILE_LOGGING_ENABLED这个中间件是不生效的。

中间件自带的其他方法其实在 startproject 时候创建的 middlewares.py 里面都有了,不了解的可以具体看看API,注意按需使用。

运行抓取

最后呢,我们就可以执行抓取了,在命令行运行:

❯ scrapy crawl toutiao

运行正常。接着来确认下程序正确性。首先看看SQLite中的数据:

".help" 

这样就完成抓取和存入数据库啦。

接着看一下日志scrapy.log,里面已经可以看到对应的记录:

{

通过LoggingSpiderMiddleware,抓取结果都被写进了日志。

好啦,这个爬虫项目就完成了,我们相对完整的体验了Scrapy的用法。

什么情况下应该用Scrapy这类框架?

大部分优秀项目能出现的原因,都是作者或者团队在对过去已有的工作模式和轮子深入之后发现问题之后提出更先进的思想,并实现出来。框架非常好,比如作为web开发者,我不能不用flask django这类web框架,而爬虫框架嘛,利用成熟的框架基本能避免常见的坑。可以写非常少的代码就能实现抓取,其中的一些细节都被框架封装了,开发者不再需要关注,专心实现业务逻辑就好了。

不过我是不推荐用框架的,我不做运维的一个重要原因是不想做一个天天翻阅软件文档的运维,运维嘛,日常一个工作是搭建环境,用人家写好的东西,按文档运行起来,最多google一些最佳实践或者解决一些报错。但是我们是不知道它怎么实现的、运行原理是什么的。你用这种框架也是,比如flask, 就是按照人家规定你的玩法填东西就好了,填多了不过是个熟练工而已。

我在12-13年底写了很多的爬虫,每个通常都会尝试一些新的技术,后来我突然意识到,当你掌握了爬虫技能,爬一个还是爬一百个区别已经不大,量已经没有意义,关键是质了。

所以,我的建议是:

  1. 如果你是新学者,没有工作安排的话,我建议从零开始不要用框架。
  2. 如果已经写过可用的爬虫,但是还不能灵活运用,更多的是多了解我上面提到的那些技术,多造轮子。
  3. 如果你已经踩过该踩的坑,灵活运用,用什么都无所谓,造轮子意义不大。这个时候用scrapy是很好的选择。

再强调一次基础。千万别把自己在某些领域的能力限制在某个框架上,会影响你未来的发展。

延伸阅读

Scrapy是一个功能很齐全的抓取框架,支持的特性、配置项等非常多,需要花很多时间学习和熟悉。这里有几个延伸阅读的链接。第一个是Scrapy创始人自己搞的scrapinghub服务中的视频学习教程。应该是市面上最好的教程之一了,大家可以看看。

  1. https://learn.scrapinghub.com/scrapy/
  2. https://doc.scrapy.org/en/latest/intro/tutorial.html

欢迎关注「爱湃森Python」服务号(微信号ipaisen)获取更多内容哟

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/552208.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

绳索受力分析的软件_【硕士论文】供热管网管道支架载荷分析与优化设计

摘 要改革开放后我国经济快速发展,随着集中供热事业的扩大,集中供暖越来越受到广大民众的欢迎,居民冬季用热为主的集中供暖面积在连年递增,已经成为主要一种供暖方式。集中供热作为城市公共服务功能中重要的一项工作,对…

python-docx 如何获取当前字号_餐饮老字号迈上“云端”

原标题:餐饮老字号迈上“云端”老字号陈麻婆豆腐旗舰店。 杨予頔 摄中新网成都10月31日电 (单鹏)临近中午,成都餐饮老字号“钟水饺”文殊院店的前台站满身穿黄色和蓝色服装的“外卖小哥”,拿到打包好的钟水饺后,他们急匆匆地转身…

进入hbase命令_Zookeeper、Hbase安装部署

zookeeper安装与配置使用xftp将压缩包传入/soft中创建zookeeper数据存放目录mkdir /soft/zookeeperchmod 766 /soft/zookeeper分别在三台服务上面依次执行 echo id > /var/zookeeper/myid 命令创建zookeeper编号的myid文件echo 1 > /soft/zookeeper/myidecho 2 > /sof…

c++new时赋初值_C高级编程精髓之内存管理,万千码农踩过的雷,大神带你走出雷区...

今天给大家分享C高级编程精华片之内存管理——欢迎跟大家一起踏进内存这片雷区,然后带大家从雷区中走出来!程序员们经常编写内存管理程序,往往提心吊胆。如果不想触雷,唯一的解决办法就是发现所有潜伏的地雷并且排除它们&#xff…

为什么用pyqt的不多_现在农村提倡用天然气和清洁煤球取暖,为何农民不爱用?看完懂了...

近几年华北很多农村响应保护环境的政策,大多数农村家庭都安装了天然气。冬季的取暖方式也从以前的烧煤取暖改成了烧天然气或清洁煤球取暖。对于安装天然气并烧天然气或清洁煤球取暖,大多数农民都很抗拒,为什么农村人不愿意烧天然气和清洁煤球…

两种参数类型_布尔参数这些缺点不能忍?不如试试枚举吧

全文共2222字,预计学习时长9分钟图源:unsplash在代码库中使用布尔标志值来管理状态机似乎听起来是个不错的办法,但事实并非如此。布尔值恐怕是很多程序员接触到的第一种数据类型,它非常简单,只有两种状态: true 和fals…

405 not allowed怎么解决_英语口语:“您拨叫的用户不在服务区”这类电话常用语怎么说...

1、空号:中文:您好!您所拨打的号码是空号,请核对后再拨。英文:Sorry! The number you dialed does not exist, please check it and dial later.2、被叫用户关机:中文:您好!您所拨打…

利用代码分别实现jdk动态代理和cglib动态代理_代理模式实现方式及优缺点对比...

作者:爱宝贝丶来源:https://my.oschina.net/zhangxufeng/blog/1633187代理模式最典型的应用就是AOP,本文结合主要讲解了代理模式的几种实现方式:静态代理和动态代理,这里动态代理又可以分为jdk代理和Cglib代理&#xf…

防抖 节流_防抖节流与前端性能优化

在我们日常的开发中经常会用到一些容易被反复触发的事件。比如:scroll、resize、鼠标事件(mousemove,mouseover等)、键盘事件(keyup、keydown)。频繁触发回调导致的大量计算会引发页面的抖动甚至卡顿。为了规避这种情况,我们需要一些手段来控制事件被触发…

惠普10代的服务器有哪些型号,英特尔官方科普:秒懂十代酷睿型号怎么认!

今日,英特尔官方微博再次放出科普:十代酷睿处理器是如何命名的?英特尔介绍,以酷睿i7-1065G7为例,“i7”为产品型号,“1065”中的“10”代表十代酷睿,“65”为CPU代号,“G7”为显卡性…

form提交后台注解拿不到数据_浏览器是如何将用户数据发送到服务器的?

今天是刘小爱学习Java的第89天。感谢你的观看,谢谢你。话不多说,开始今天的学习:在学习之前,先思考如下问题:对于浏览器来说:如何将用户数据发送到服务器呢?数据传输的格式是怎么样的呢&#xf…

proxmoxve打造云桌面_微软云电脑Cloud PC曝光:配置一般还不便宜

光纤宽带的普及和提速、5G的兴起,让云电脑、云游戏、云手机等产品和应用红火起来。而微软也正在开发一款名为Cloud PC的云端Windows操作系统,并计划2021年正式推出。据报道,Cloud PC是由Azure云服务支撑,基于虚拟桌面打造的&#…

alpine linux图形界面_跟光磊学Linux运维-Linux入门与基本使用

认识Linux用户在安装CentOS8.2时,设置过root用户的密码,同时也创建了用户guanglei。其中root用户是系统自带的管理员账户,也被称为超级用户,root用户接近系统完整的控制能力,对系统损害几乎有无限的能力。运维人员在生…

休眠 嵌入式_内幕消息:嵌入式软件挤出最低功耗模式

低功耗运行仍然是各行业应用的关键驱动因素。随着睡眠模式的增加,电源管理突然从单纯的硬件问题转移到软件开发人员必须考虑的事情上。功耗模式的最简单应用是当系统空闲时,将其置于休眠状态。然而,今天的MCU提供多种低功耗模式,进…

cnn 验证集 参与训练吗_一个简单的零基础的机器学习教程之二,字母数字验证码识别...

一.前言基于前面我发的贴子 土味程序员:一个简单的零基础的机器学习教程,Pytorch搭建Faster R-CNN目标检测平台​zhuanlan.zhihu.com一个非常震撼的目标检测的例子。上个帖子从环境安装到调试代码再到图片检测视频检测一个详细的教程,今天我来…

activiti 文档_免费、开源、多平台的PDF文档处理软件——PDFsam Basic

今天给大家推荐的是一款免费、开源、多平台支持的PDF文档处理软件——PDFsam BasicPDFsam Basic是为普通用户提供的免费开源解决方案,提供了PDF文档拆分、合并、混合、提取页面和旋转等等功能。01. 文档分割PDFsam Basic可以通过给定页码、书签级别,把PD…

@data注解不生效_你说啥什么?注解你还不会?

点击蓝色字免费订阅,每天收到这样的好信息前言:最近有不少粉丝关注本公众号。并且我已经成功开通了流量主同时会赚一点点广告费,我打算每个月把这部分钱拿出来给大家买点书刊,算是给大家一点福利吧。大家想买什么书扫描下方的加他拉你加群。最后,非常感谢大家的关注…

yearning 2. 部署_对于企业来说,在选择协同办公系统的时候,选择私有化部署的数据安全一些,还是使用云服务器比较安全?...

当然是私有化部署!因为它除了安全,还有个性化~私有化部署,简单理解就是企业自己购买或租赁服务器,或者由服务商提供免费的云资源,然后将整个系统部署在企业自有的服务器上。采用这种方式,企业就不用担心自家…

numpy 平方_Numpy的终极备忘录

作者|Rashida Nasrin Sucky 编译|VK 来源|Towards Data Science Python是开源的。对于使用python的数据科学家来说,Numpy这个库是必不可少的。其他一些基本的库,如Pandas,Scipy是建立在Numpy的基础上。所以我决定做一份备忘录。这里我包括了到…

linux HZ 值_Linux的serial串口控制台

本人大多数情况都是在调试服务器大量的linux服务器,很多情况下也不没有必要专门准备KVM(keyboard, video, mouse),甚至有些机器根本就没有显示器接口。如何调试的?闲来无事,分享一下。有些人说“ 给我个Lin…