笔者最近对scrapy的学习可谓如火如荼,虽然但是,即使是一整天地学习下来也会有中间两三个小时的“无效学习”,不是笔者开小差,而是掉进了深坑出不来。

在此,给各位分享一下作为一名Scrapy框架的初学者,笔者在学习过程中遇到的各个大坑和小技巧吧。

1. user_agent

这个,在某些网站看来这无关要紧(比如笔者的网站—— 代码的边城 ),但对某些设定了反爬机制的网站来说,这是你的蜘蛛开门遇到的拦路虎。如果没有提前设定好这个参数,那你的蜘蛛连网站都进不去。

不仅网站进不去,而且它还不报错。试问,一个满心壮志,准备在互联网上靠他的蜘蛛大展宏图的人,如果遇到了这样的事,那将是多么的心灰意冷。所以,笔者在这里分享之前的文章,有对此的解决方案,欢迎浏览 点此跳转

2. ROBOTSTXT_OBEY

跟上面的user_agent一样,这也是一个在settings.py里面设定好的参数值。我们通过scrapy固定语句新建项目后就会发现,settings.py里面这条被点亮的,且默认值为True的语句。

这意味着我们的Spider会遵守robots.txt的规则。 简单来说,robots.txt 是遵循 Robot 协议的一个文件,它保存在网站的服务器中,它的作用是,告诉搜索引擎爬虫,本网站哪些目录下的网页不希望你进行爬取收录。在Scrapy启动后,会在第一时间访问网站的 robots.txt 文件,然后决定该网站的爬取范围。

但我们的爬虫一般来说都没什么节操,也知道不会怎么遵守这条语句,所以在新建好项目的时候,我们就直接把这个配置,设置为False!直接在遇到问题前解决问题!

3. allowed_domains

在我们新建好项目之后,会在你的爬虫文件里出现这条语句

start_urls 一般指的是你的Spider的初始链接,是蜘蛛帝国最开始的基石,allowed_domains就是你蜘蛛帝国最外面的围栏。有一种说法是,scrapy的spider爬取速度特别快,所以为了防止它乱爬到其他界面,我们会在这里设置allowed_domains。设置好后,不属于此范围的域名就会被过滤,我们的蜘蛛也会被好好关在设置好的域名里。

但一个弊端是,这条语句的存在感不强。有时候,我们在写多界面爬虫的时候特别起劲,往往会忘了最开始设定好的域名范围,而我们在进行多页面的数据提取时,很有可能会需要跳出你原来设定好的这个域名,进入其他的域名里提取数据。这时候,这个allowed_domains就成为了我们的绊脚石,如果你忘了它的存在,你会很绝望地发现,你新写的parse函数竟然无法调用下一个界面的数据,而且它还 不!报!错!

解决方法:就是在allowed_domains里添加新的域名,共同作为爬虫爬取的范围

4. tbody 和 font

在笔者写到跟tbody有关的xpath之前,笔者已经知道这个坑了,于是完美避过。如果你还不清楚,可以听笔者细细分析。

我们写xpath路径时,往往都是先找到一个css选择器,然后描写他的路径

比如我们要在浏览器调试界面获取选中的这个td:

xpath = "//table[@class = 'present-table']/tr[1]/td[2]/text()"
复制代码

以上是笔者分享的正确的写法之一,我们在浏览器的response里面就可以找到相同的xpath与此对应

你看,是没有 这个标签的,我们的xpath按照response的写法才是正确的,只是一般来是打开浏览器调试界面过去xpath最方便而已。对此,笔者去搜录了一下原因。

并不是全部的 都无法解析,如果在源码里面写入了 那我们原来的方法还是可行的。但源码没有写入的话,浏览器为了规范化,会自动在添加这个标签,我们写xpath的时候就要跳过这个标签。

目前笔者了解到,还有这一特性的标签还有 ,也需要注意。

5. 图片网址@src必须是列表格式

这又是笔者早早避过的坑,特此分享避坑经验。

这是大家约定俗称的一种写法,笔者也讲不出具体原理。对于@src的写法,笔者这里主要分享两种写法

# 第一种
src = response.xpath('//img/@src').extract()
# 第二种
src = [response.xpath('//img/@src').extract_first()]
复制代码

以上运用了extract()和extract_first()本身的特性

extract():这个方法返回的是一个数组list,里面包含了多个string,如果只有一个string,则返回['ABC']这样的形式。

extract_first():这个方法返回的是一个string字符串,是list数组里面的第一个字符串。

笔者自身倾向于第一种写法,写法简洁,同时能应对多个img的情况

* 小技巧——多界面数据如何传输

有时候我们爬虫里面的item,他的同类数据分布在各个网页之中,那么我们就需要 request.meta 来储存上一个parse中的item数据

我们从当前页面调用下一个页面时,使用如下的语句

yield scrapy.Request(the_href,callback=self.another_parse,meta={"item":item})
复制代码

就能成功的把我们的 item 传送到 another_parse 中去,以response.meta的形式存在,然后在这里重新定义一个 item 将此赋值给它就能完成传输了

Scrapy 5+1 ——五大坑附送一个小技巧的更多相关文章

  1. 快速掌握iOS API的一个小技巧

    快速掌握iOS API的一个小技巧 周银辉 iOS SDK和Developer Library中提供了各个类以及函数的帮助文档,这很棒,但要想了解整个库的大体结构(比如UIKit下有哪些类,他们的继承 ...

  2. 【flash】关于flash的制作透明gif的一个小技巧

    关于flash的制作透明gif的一个小技巧 或者说是一个需要注意的地方 1.导出影片|gif,得到的肯定是不透明的.2.想要透明背景,必须通过发布.3.flash中想要发布gif动画的话,不能有文字, ...

  3. POJ-3262 贪心的一个小技巧

    Protecting the Flowers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 3204   Accepted: ...

  4. 【每日一个小技巧】Python | input的提示信息换行输出,提示信息用变量表示

    [每日一个小技巧]Python | input的提示信息换行输出,提示信息用变量表示 在书写代码的途中,经常会实现这样功能: 请输入下列选项前的序号: 1.选择1 2.选择2 3.选择3 在pytho ...

  5. 针对ACM输出格式的一个小技巧(对格式错误说不!)

    printf("%d%c",bmax," \n"[i==n]); 上文中bmax为题目中需要输出的整形变量,可以脑补很多ans,max之类的,重点在于%c和后面 ...

  6. python笔记_查看函数调用栈的一个小技巧

    一.背景 最近在看一个开源框架的源码,涉及到的内容非常杂乱,有的函数不知道是在什么时候被谁给调用了?调用的时候传入了什么参数?为了解决这个问题,写了一个小的装饰器. 二.实现 这个装饰器函数主要参考了 ...

  7. 从零开始学习html(十五)css样式设置小技巧——上

    一.水平居中设置-行内元素 <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> ...

  8. C++模板类继承的一个小技巧

    先说一下background前段时间想实现一个Sqlite localstorage的功能,对应不同的Model 实体有不同的table, 每一次sql操作的函数签名中会有model实体中的struc ...

  9. 使用dwr时动态生成table的一个小技巧

    这篇随笔是我在07年写的,因为当时用了自己建设的blog,后来停止使用了,今天看到备份数据库还在,恢复出来放到这里.留着记录用. 我在使用DWR时,试了很多次都无法在动态生成的table中的一个或多个 ...

随机推荐

  1. svg click event bug & css pointer-events

    svg click event bug & css pointer-events svg click event not working Error OK ??? css class /* d ...

  2. Flutter: Dismissible 通过在指示的方向上拖动来解除的Widget

    API class _MyHomeState extends State<MyHome> { @override Widget build(BuildContext context) { ...

  3. BGV作为拥抱新时代的DeFi项目,是否有能力超越YFI?

    随着今年11月DeFi蓝筹股们的集体反弹,市场变化让投资者明白,不能再死守诸如COMP和MKR的古典DeFi了,只有拥抱新时代的DeFi们才有赚钱的可能,不要和钱过不去.经过9-10月的回调,11月的 ...

  4. Hystrix熔断器的使用步骤

    1.添加熔断器依赖 2.在配置文件中开启熔断器 feign.hystrix.enabled=true 3.写接口的实现类VodFileDegradeFeignClient,在实现类中写如果出错了输出的 ...

  5. TERSUS无代码开发(笔记02)-简单实例加法

    简单实例加法 1.用户端元件(显示元件)(40个) 图标 英文名称 元件名称 使用说明 服务器端 客户端 Pane 显示块 是一个显示块,是HTML的div标签   √ Row 行 行元件中的显示元件 ...

  6. Oracle数据库配置监听程序

    最近在学习Oracle数据库,从安装到配置监听程序基本靠百度... 不得不说百度真的很nice!!! 下面是我的Oracle服务端(PL/SQL Developer)出现的监听程序的问题及我解决的方法 ...

  7. Vue框架简介及简单使用

    目录 一.前端框架介绍 二.vue框架简介 三.vue使用初体验 1. vue如何在页面中引入 2. 插值表达式 3. 文本指令 4. 方法指令(事件指令) 5. 属性指令 四.js数据类型补充 1. ...

  8. Docker搭建Hadoop环境

    文章目录 Docker搭建Hadoop环境 Docker的安装与使用 拉取镜像 克隆配置脚本 创建网桥 执行脚本 Docker命令补充 更换镜像源 安装vim 启动Hadoop 测试Word Coun ...

  9. 看完我的笔记不懂也会懂----AngulaJS

    目录 Angular.js学习笔记 ng-app(指令) ng-model ng-init angular之表达式 双向数据绑定 数据流向的总结 作用域对象 控制器对象 依赖对象与依赖注入 命令式与声 ...

  10. MySQL深入研究--学习总结(1)

    前言 本文是笔者学习"林晓斌"老师的<MySQL实战45讲>过程中的,对知识点的总结归纳以及对问题的思考记录,课程18年11月就出了,当时连载形式,我就上班途中一边开车 ...