Scrapy 5+1——五大坑附送一个小技巧

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

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

1. user_agent

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

Scrapy 5+1——五大坑附送一个小技巧

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

2. ROBOTSTXT_OBEY

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

Scrapy 5+1——五大坑附送一个小技巧

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

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

3. allowed_domains

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

Scrapy 5+1——五大坑附送一个小技巧

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

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

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

Scrapy 5+1——五大坑附送一个小技巧

4. tbody 和 font

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

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

Scrapy 5+1——五大坑附送一个小技巧

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

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

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

Scrapy 5+1——五大坑附送一个小技巧

你看,是没有 这个标签的,我们的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——五大坑附送一个小技巧

Original: https://blog.csdn.net/Magic_xp7/article/details/115598908
Author: 代码的边城
Title: Scrapy 5+1——五大坑附送一个小技巧

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/792764/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • pytest:基本介绍

    pytest,作为一款测试框架,并没有继续模仿junit层次分明的工作模式,以至于读完官网文档都感觉是懵的 虽然没有明确定义setup/teardown方法,却有其独特的手段实现相…

    Python 2023年9月13日
    034
  • Python 自定义异常

    Python 提供了丰富的标准异常,这些异常非常灵活,我们甚至可以根据需要进行修改以满足特定需求,所以应该尽可能地使用它们。 然而,在实际编程中,您会发现有时标准异常是不够的,这需…

    Python 2023年5月24日
    0136
  • pytest合集(9)— 配置文件

    1、配置文件 配置文件一般位于项目的根目录。pytest支持的配置文件如下(按照优先级顺序排列): pytest.ini:主配置文件,优先级最高。 pyproject.toml:6…

    Python 2023年9月10日
    051
  • MySQL-8.0.20

    第一章 MySQL的介绍及安装 1.1 数据库管理系统(DBMS)RDBMS : Oracle SQLServer DB2 MySQLNoSQL : Redis MongoDB E…

    Python 2023年6月3日
    056
  • 《四》Redux Toolkit

    Redux Toolkit(RTK)是 Redux 官方推荐的编写 Redux 逻辑的方法。Redux 的编写逻辑过于繁琐,并且代码通常分拆在多个文件中,Redux Toolkit…

    Python 2023年11月6日
    031
  • python数据分析第一讲_【Python数据分析】第一篇–基础操作

    IO:导入导出数据 import pandas as pd df = pd.read_csv(filepath_or_buffer, sep=’,’, he…

    Python 2023年8月21日
    048
  • Django笔记6–装饰器、中间件实现Session限定访问

    在有登录的系统中,有些页面可以不登录账户就可以访问,如:登录页、注册页等等,而有些网页则只能在登录成功之后才能跳转,如:个人信息主页,购物车页等等。此时可以使用session记录登…

    Python 2023年8月6日
    059
  • ThingsBoard 3.1.1版本在window本地运行之TB-Gateway ODBC数据上传(四)

    目录 1、前言 2、Thingsboard Gateway 1.tb-gateway的概念 2.tb-gateway的配置 3.odbc连接器配置 3、ODBC的配置 1.安装wi…

    Python 2023年10月7日
    055
  • Python数据可视化库pyecharts

    针对数据分析团队需求,简单整理了一些相关内容分享同步大家学习,旨在帮助机器学习人员、数据分析人员、NLP算法人员快速了解业务数据,针对性解决工程中面临的问题。 @[TOC] pye…

    Python 2023年5月25日
    070
  • python组件介绍_Scrapy五大核心组件简介

    Scrapy五大核心组件 scrapy框架主要由五大组件组成,他们分别是调度器(Scheduler),下载器(Downloader),爬虫(Spider),和实体管道(Item P…

    Python 2023年10月2日
    036
  • 函数cv2.xfeatures2d.SIFT_create().detectAndCompute()的返回值

    在学习sift进行图像拼接程序时,发现别人写的代码里有一块知识不懂。 建立SIFT生成器 descriptor = cv2.SIFT_create() 检测SIFT特征点,并计算描…

    Python 2023年10月10日
    056
  • dataframe聚合

    dataframe聚合 import pandas as pds = pd.read_csv(‘…/conf/dataframe.csv’) #…

    Python 2023年8月18日
    041
  • python创建一个上三角矩阵(没有初等行变化)

    对一个 上三角矩阵_或下三角 _矩阵,其逆 矩阵_也是一个 _上三角矩阵_或下三角 _矩阵,且对角线上的元素为原 矩阵_对角线上元素的倒数。以下是 _Python 实现代码: _p…

    Python 2023年8月29日
    056
  • 利用python实现简单的人工神经网络识别手写数字

    利用 Python 搭建起了一个简单的神经网络模型,并完成识别手写数字。 1.前置工作 1.1 环境配置 这里使用scikit-learn库内建的手写数字字符集作为本文的数据集。s…

    Python 2023年10月8日
    053
  • pandas常用方法

    1、了解 1.1 DataFrame和Series关系 pandas读取数据会返回一个 DataFrame的数据结构,查看某一列或者某一行的数据类型,会返回一个 Series的数据…

    Python 2023年8月7日
    030
  • Pandas中loc和iloc函数的用法

    目录 * – 1 loc和iloc的含义 – 2 用法 – + 2.1 loc函数的用法 + 2.2 iloc函数的用法 1 loc和iloc的…

    Python 2023年8月8日
    047
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球