Scrapy简介-快速开始-项目实战-注意事项-踩坑之路

scrapy项目模板地址:https://github.com/w-x-x-w/Spider-Project

Scrapy简介

Scrapy是什么?

  • Scrapy是一个健壮的爬虫框架,可以从网站中提取需要的数据。是一个快速、简单、并且可扩展的方法。Scrapy使用了异步网络框架来处理网络通讯,可以获得较快的下载速度,因此,我们不需要去自己实现异步框架。并且,Scrapy包含了各种中间件接口,可以灵活的完成各种需求。所以我们只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页上的各种内容。
  • Scrapy并不是一个爬虫,它只是一个“解决方案”,也就是说,如果它访问到一个“一无所知”的网站,是什么也做不了的。Scrapy是用于提取结构化信息的工具,即需要人工的介入来配置合适的XPath或者CSS表达式。Scrapy也不是数据库,它并不会储存数据,也不会索引数据,它只能从一堆网页中抽取数据,但是我们却可以将抽取的数据插入到数据库中。

Scrapy架构

Scrapy Engine (引擎): 是框架的核心,负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。并在发生相应的动作时触发事件。
**Scheduler (调度器): **它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,提供给引擎。
**Downloader (下载器):**负责下载引擎发送的所有Requests请求,并将其获取到的Responses交还给引擎。
**Spider (爬虫):**负责处理由下载器返回的Responses,并且从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给Scrapy Engine,并且再次进入Scheduler。
**Item Pipeline (项目管道):**它负责处理Spider中获取到的Item,并进行进行后期处理(清理、验证、持久化存储)的地方.
**Downloader Middlewares (下载中间件):**引擎与下载器间的特定钩子,一个可以自定义扩展下载功能的组件。处理下载器传递给引擎的Response。
**Spider Middlewares(爬虫中间件):**引擎和Spider间的特定钩子,(处理进入Spider的Responses,和从Spider出去的Requests)

快速开始-项目实战

我们这里以某新闻网站新闻推送为例编写项目,仅用于学习,请勿恶意使用

安装 Scrapy

pip install Scrapy

创建项目

scrapy startproject 项目名
HuxiuSpider/scrapy.cfgHuxiuSpider/__init__.pyitems.pypipelines.pysettings.pyspiders/__init__.py...

这些文件分别是:

  • scrapy.cfg: 项目的配置文件
  • HuxiuSpider/: 该项目的python模块。之后您将在此加入代码。
  • HuxiuSpider/items.py: 项目中的item文件.
  • HuxiuSpider/pipelines.py: 项目中的pipelines文件.
  • HuxiuSpider/settings.py: 项目的设置文件.
  • HuxiuSpider/spiders/: 放置spider代码的目录.

更改设置

  • 注释robotstxt_obey
# 第21行
# Obey robots.txt rules
# ROBOTSTXT_OBEY = True
  • 设置User-Agent
# 第18行
# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = "HuxiuSpider (+http://www.yourdomain.com)"
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36'
  • 设置访问延迟
# 第29行
# Configure a delay for requests for the same website (default: 0)
# See https://docs.scrapy.org/en/latest/topics/settings.html#download-delay
# See also autothrottle settings and docs
DOWNLOAD_DELAY = 3

开启pipline

# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {"HuxiuSpider.pipelines.HuxiuspiderPipeline": 300,
}

开启cookie(无需操作)(可选操作)

# Disable cookies (enabled by default)
#COOKIES_ENABLED = False

设置频率(可不操作)

# The download delay setting will honor only one of:
# 定义了每个域名同时发送的请求数量
CONCURRENT_REQUESTS_PER_DOMAIN = 2
# 定义了每个IP同时发送的请求数量
#CONCURRENT_REQUESTS_PER_IP = 16

命令行快速生成模板:

scrapy genspider huxiu_article api-article.huxiu.com

Spider是用户编写用于从单个网站(或者一些网站)爬取数据的类。
其包含了一个用于下载的初始URL,如何跟进网页中的链接以及如何分析页面中的内容, 提取生成 item 的方法。
为了创建一个Spider,您必须继承 scrapy.Spider 类, 且定义以下三个属性:

  • name: 用于区别Spider。 该名字必须是唯一的,您不可以为不同的Spider设定相同的名字。
  • start_urls: 包含了Spider在启动时进行爬取的url列表。 因此,第一个被获取到的页面将是其中之一。 后续的URL则从初始的URL获取到的数据中提取。(也可以删除此变量,但要重写start_requests方法)
  • parse() 是spider的一个方法。 被调用时,每个初始URL完成下载后生成的 Response 对象将会作为唯一的参数传递给该函数。 该方法负责解析返回的数据(response data),提取数据(生成item)以及生成需要进一步处理的URL的 Request 对象。

以下为我们的第一个Spider代码,保存在 HuxiuSpider/spiders 目录下的 huxiu_article.py 文件中:
我们对于此段代码进行必要的解释:
向一个url发送post请求,发送一个时间戳,可以获取这个时间戳以后的新闻推送,然后就是推送数据,关于数据提取等操作可以点开链接页自行观察,太过简单。

爬虫程序模板:

新闻列表页爬虫

import json
import timeimport scrapyfrom HuxiuSpider.items import HuxiuspiderItemclass HuxiuArticleSpider(scrapy.Spider):def __init__(self):# 'https://www.huxiu.com/article/'self.url = 'https://api-article.huxiu.com/web/article/articleList'name = "huxiu_article"allowed_domains = ["api-article.huxiu.com"]def start_requests(self):timestamp = str(int(time.time()))form_data = {"platform": "www","recommend_time": timestamp,"pagesize": "22"}yield scrapy.FormRequest(url=self.url, formdata=form_data, callback=self.parse)def parse(self, response):item = HuxiuspiderItem()res = response.json()success = res['success']print(res)if success:data = res['data']is_have_next_page = data['is_have_next_page']last_dateline = data['last_dateline']total_page = data['total_page']dataList = data['dataList']for data_obj in dataList:item['url'] = 'https://www.huxiu.com/article/' + data_obj['aid'] + '.html'item['title'] = data_obj['title']item['author'] = data_obj['user_info']['username']item['allinfo'] = json.dumps(data_obj, ensure_ascii=False)item['visited'] = Falseyield itemif is_have_next_page:form_data = {"platform": "www","recommend_time": str(last_dateline),"pagesize": "22"}yield scrapy.FormRequest(url=self.url, formdata=form_data, callback=self.parse)else:raise Exception('请求新闻列表的时候失败了~')

Item模板:

Item 是保存爬取到的数据的容器;其使用方法和python字典类似, 并且提供了额外保护机制来避免拼写错误导致的未定义字段错误。
类似在ORM中做的一样,您可以通过创建一个 scrapy.Item 类, 并且定义类型为 scrapy.Field 的类属性来定义一个Item。 (如果不了解ORM, 不用担心,您会发现这个步骤非常简单)(ORM其实就是使用类的方式与数据库进行交互)
首先根据需要从huxiu.com获取到的数据对item进行建模。 我们需要从dmoz中获取名字,url,以及网站的描述。 对此,在item中定义相应的字段。编辑 HuxiuSpider 目录中的 items.py 文件:

import scrapyclass HuxiuspiderItem(scrapy.Item):url = scrapy.Field()title = scrapy.Field()author = scrapy.Field()# 存储尽量多的信息是必要的,以应对需求变更allinfo=scrapy.Field()visited=scrapy.Field()

一开始这看起来可能有点复杂,但是通过定义item, 您可以很方便的使用Scrapy的其他方法。而这些方法需要知道您的item的定义。

piplines模板:

from pymongo import MongoClient
from pymongo.errors import DuplicateKeyErrorclass HuxiuspiderPipeline:def __init__(self):self.client=MongoClient('localhost',username='spiderdb',password='password',authSource='spiderdb',authMechanism='SCRAM-SHA-1')self.db = self.client['spiderdb']self.collection = self.db['huxiu_links']self.collection.create_index("url", unique=True)def process_item(self, item, spider):item = dict(item)try:self.collection.insert_one(item)except DuplicateKeyError as e:passreturn itemdef close_spider(self, spider):self.client.close()

运行爬虫

进入项目的根目录,执行下列命令启动spider:

scrapy crawl huxiu_article
# scrapy crawl huxiu_article -o dmoz.csv

完善项目-多层爬取

yield scrapy.Request(item['url'], meta={'item': item}, callback=self.detail_parse)

https://blog.csdn.net/ygc123189/article/details/79160146

注意事项

自定义spider起始方式

也可以是查询数据库的结果,但要注意数据统一性,因为scrapy是异步爬取

自定义item类型与有无

spider爬取的结果封装到item对象中,再提交给pipeline持久化,那么当然也可以忽略item对象,传递你想要的数据格式直接到pipeline。

item与pipeline对应关系

item的意思是数据实例,一个item提交后,会经过所有的pipeline,pipeline的意思是管道,就是对数据的一系列操作,设置中的管道优先级就是管道处理数据的顺序,比如日志操作等。
如果要让某一个pipeline只处理某些类型的item,可以在item进入pipelne的时候判断一下是否是你想要处理的item类型。示例如下:

class doubanPipeline(object):def process_item(self, item, spider):#判断item是否为Item1类型if isinstance(item,doubanTextItem):# 操作itemreturn item

scrapy是异步执行的

同时运行多个爬虫

from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settingssettings = get_project_settings()crawler = CrawlerProcess(settings)crawler.crawl('exercise')
crawler.crawl('ua')crawler.start()
crawler.start()

post表单数据传输需要是字符串

自定义请求头

import scrapyclass AddHeadersSpider(scrapy.Spider):name = 'add_headers'allowed_domains = ['sina.com']start_urls = ['https://www.sina.com.cn']headers = {'User-Agent': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',"Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.5,en;q=0.3","Accept-Encoding": "gzip, deflate",'Content-Length': '0',"Connection": "keep-alive"}def start_requests(self):for url in self.start_urls:yield scrapy.Request(url, headers=self.headers, callback=self.parse)def parse(self,response):print("---------------------------------------------------------")print("response headers: %s" % response.headers)print("request headers: %s" % response.request.headers)print("---------------------------------------------------------")

scrapy的FormRequest发送的是表单数据类型,如果要发送json类型需要使用Request

ts = round(time.time() * 1000)
form_data = {"nodeId": id_str,"excludeContIds": [],"pageSize": '20',"startTime": str(ts),"pageNum": '1'
}
yield scrapy.Request(url=self.url,method='POST',headers=self.headers,body=json.dumps(form_data), callback=self.parse,meta={'id_str': id_str})

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

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

相关文章

下载配置 maven并在 idea 上应用

目录 一 maven 定义 二 Maven特点 三 Maven仓库 四 安装配置maven 步骤一:准备安装包,解压 步骤二:配置maven的环境变量 步骤三:测试maven的环境变量是否配置成功 步骤四:配置maven本地仓库 步骤五:阿里云、腾讯镜像配置 步骤六:全局配置idea的maven路径 步骤七:创建…

为IT服务台构建自定义Zia操作

Zia是manageengine的商业人工智能助手,是ServiceDesk Plus Cloud的虚拟会话支持代理。使用Zia,您可以优化帮助台管理,还可以缩小最终用户与其帮助台之间的差距,Zia通过执行预配置的操作来帮助用户完成他们的服务台任务。 例如&…

基于HBuilder X平台下的 驾校报名考试管理系统 uniapp 微信小程序3n9o5

本课题研究的是基于HBuilder X系统平台下的驾校管理系统,开发这款驾校管理系统主要是为了帮助学员可以不用约束时间与地点进行查看教练信息、考场信息等内容。本文详细讲述了驾校管理系统的界面设计及使用,主要包括界面的实现、控件的使用、界面的布局和…

Helm Deploy Online Rancher Demo

文章目录 简介预备条件在线安装 Rancher Helm Chart选择 SSL 配置安装 cert-managerHelm 安装 Rancher验证 Rancher Server 是否部署成功 简介 Rancher 是一个开源的企业级全栈化容器部署及管理平台。已有超过 1900 万次下载,4000 生产环境的应用。 简单的说&…

PROSOFT PTQ-PDPMV1网络接口模块

通信接口:PROSOFT PTQ-PDPMV1 网络接口模块通常配备了多种通信接口,以便与不同类型的设备和网络进行通信。常见的接口包括以太网、串行端口(如RS-232和RS-485)、Profibus、DeviceNet 等。 协议支持:该模块通常支持多种…

基于单片机的八路抢答器(数码管版)(独立按键、四位共阳极数码管、指示灯)

随着科学技术的发展和普及,各种各样的竞赛越来越多,其中抢答器的作用也就显而易见。目前很多抢答器基本上采用小规模数字集成电路设计,使用起来不够理想。因此设计一更易于使用和区分度高的抢答器成了非常迫切的任务。现在单片机已进入各个领…

Sui上低Gas费为预言机注入强大动力

在当今世界中,大数据推动了许多真正有用的应用发展,预言机是将这些数据引入区块链的手段。然而,通过预言机进行数据调用需要在区块链上进行交易,并支付相关gas费。Sui保持稳定且低廉gas费的能力,使其成为依赖预言机app…

什么是ETLT?他是新一代数据集成平台?

什么是ETLT? 在现代数据处理和分析的时代,数据集成是一个至关重要的环节。数据集成涉及将来自各种来源的数据合并、清洗、转换,并将其加载到数据仓库或分析平台以供进一步的处理和分析。传统上,数据集成有两种主要方法&#xff0…

13 mysql date/time/datetime/year 的数据存储

前言 这里主要是 由于之前的一个 datetime 存储的时间 导致的问题的衍生出来的探究 探究的主要内容为 int 类类型的存储, 浮点类类型的存储, char 类类型的存储, blob 类类型的存储, enum/json/set/bit 类类型的存储 本文主要 的相关内容是 datetime/date/time/year 类类型…

对线程池设置做压测

线程池代码 Configuration public class ThreadPoolConfig {// 核心线程池大小private int corePoolSize 24;// 最大可创建的线程数private int maxPoolSize 25;// 队列最大长度private int queueCapacity 100;// 线程池维护线程所允许的空闲时间private int keepAliveSeco…

VMware虚拟机安装CentOS6.9设置静态ip

1.设置虚拟网络编辑器 点击编辑–>虚拟网络编辑器 2.更改系统网络适配器选项 这里的子网掩码与网关,与第一步的一致 3.修改虚拟机主机名 vi /etc/sysconfig/networkNETWORKINGyue HOSTNAMEchen4.配置IP映射 vi /etc/hosts192.168.121.138 chen5.配置网卡…

使用 WebGL 为 HTML5 游戏创建逼真的地形

推荐:使用 NSDT场景编辑器快速搭建3D应用场景 建 模 和 3D 地形 大多数 3D 对象是 使用建模工具创建,这是有充分理由的。创建复杂对象 (如飞机甚至建筑物)很难在代码中完成。建模工具 几乎总是有意义的,但也有例外&am…

ant-table组件表格数据做合计行,并固定在表格底部

需求描述 某些时候,我们表格展示数值型数据的时候,可能会想做一个合计处理,这样能直观的了解到当前列的总计数据信息。 遍观Table组件,官方是没有提供这个功能的,这就需要我们自己处理了 需求分析 根据表格的特性&a…

Java环境的安装

最近博主也是在学校开始学习了Java,也通过老师知道了可以通过大学生学生证申(bai)请(piao) IDEA的企业版(社区版也是够学习用的)有很多同学还是没有搞懂便做一下分享。 🌱博客主页:青竹雾色间. 😘博客制作…

算法笔记——路径问题

在引入介绍如何写一个算法的时候,我们先引入一个题作为例子 1137. 第 N 个泰波那契数 - 力扣(LeetCode) 作为刚开始学习算法的我们,看到这个题目的时候,应该想好以下的问题: 1.状态表示 我们要用什么来表…

MFC新建内部消息

提示:记录一下MFC新建内部消息的成功过程 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 先说一下基本情况,因为要在mapview上增加一个显示加载时间的功能。然后发现是要等加载完再显示时间,显示在主…

整理mongodb文档:分页

个人博客 整理mongodb文档:分页 个人博客,求关注,如果文章不够清晰,麻烦指出。 文章概叙 本文主要讲下在聚合以及crud的find方法中如何使用limit还有skip进行排序。 分页的情况很经常出现,这也是这篇博客诞生的理由。 数据准备…

uniapp移动端h5设计稿还原

思路 动态设置html的font-size大小 实现步骤 先创建一个public.css文件,设置初始的font-size大小 /* 注意这样写 只能使用css文件, scss 是不支持的, setProperty 只适用于原生css上 */ html {--gobal-font-size: 0.45px; } .gobal-font-size {font-size: var(--g…

面试中的身体语言:非语言信息的重要性

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

Termux配置bashrc,终端长路径改为短路径

Termux配置bashrc termux的bashrc在$HOME/../usr/etc目录下 先使用cd命令进入用户主目录 然后cd ../usr/etc,ls可以发现,存在一个名为bash.bashrc的文件 使用vim或者其它编辑器打开 大概在第15行 PS1\[\e[0;32m\]\w\[\e[0m\] \[\e[0;97m\]\$\[\e[0…