轻松带你掌握Scrapy框架(以爬取古诗文网为例)

2023-10-25 14:40

本文主要是介绍轻松带你掌握Scrapy框架(以爬取古诗文网为例),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

写一个爬虫,需要做很多的事情。比如:发送网络请求、数据解析、数据存储、反反爬虫机制(更换ip代理、设置请求头等)、异步请求等。这些工作如果每次都要自己从零开始写的话,比较浪费时间。因此Scrapy把一些基础的东西封装好了,在他上面写爬虫可以变的更加的高效(爬取效率和开发效率)。因此真正在公司里,一些上了量的爬虫,都是使用Scrapy框架来解决。

安装Scrapy框架

  1. pip install scrapy。
  2. 可能会出现问题:
    • 在ubuntu下要先使用以下命令安装依赖包:sudo apt-get install python3-dev build-essential python3-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev,安装完成后再安装scrapy
    • 在windows下安装可能会提示No module named win32api,这时候先使用命令:pip install pypiwin32,安装完成后再安装scrapy
    • 在windows下安装Scrapy可能会提示twisted安装失败,那么可以到这个页面下载twisted文件:https://www.lfd.uci.edu/~gohlke/pythonlibs/,下载的时候要根据自己的Python版本来选择不同的文件。下载完成后,通过pip install xxx.whl
      这里重点说一下第三条
      登陆https://www.lfd.uci.edu/~gohlke/pythonlibs/,调出搜索框,搜索twisted,根据你的python版本进行下载(在命令提示符下输入python回车即可看到自己的python)
      在这里插入图片描述在这里插入图片描述 下载完成后,在命令提示符中输入pip install xxx.whl 即可
      在这里插入图片描述

Scrapy框架架构

  1. Scrapy Engine(引擎):Scrapy框架的核心部分。负责在Spider和ItemPipeline、Downloader、Scheduler中间通信、传递数据等。
  2. Spider(爬虫):发送需要爬取的链接给引擎,最后引擎把其他模块请求回来的数据再发送给爬虫,爬虫就去解析想要的数据。这个部分是我们开发者自己写的,因为要爬取哪些链接,页面中的哪些数据是需要的,都是由程序员自己决定。
  3. Scheduler(调度器):负责接收引擎发送过来的请求,并按照一定的方式进行排列和整理,负责调度请求的顺序等。
  4. Downloader(下载器):负责接收引擎传过来的下载请求,然后去网络上下载对应的数据再交还给引擎。
  5. Item Pipeline(管道):负责将Spider(爬虫)传递过来的数据进行保存。具体保存在哪里,应该看开发者自己的需求。
  6. Downloader Middlewares(下载中间件):可以扩展下载器和引擎之间通信功能的中间件。
  7. Spider Middlewares(Spider中间件):可以扩展引擎和爬虫之间通信功能的中间件。

创建Scrapy项目

  1. 创建项目:scrapy startproject [项目名称].

  2. 创建爬虫:cd到项目中->scrapy genspider [爬虫名称] [域名].

     #创建项目(以古诗文网https://www.gushiwen.org/为例)scrapy startproject gswwcd gswwscrapy genspider gushiwen gushiwen.org
    

    用pycharm打开gsww
    在这里插入图片描述

项目文件作用

  1. settings.py:用来配置爬虫的。
  2. middlewares.py:用来定义中间件。
  3. items.py:用来提前定义好需要下载的数据字段。
  4. pipelines.py:用来保存数据。
  5. scrapy.cfg:用来配置项目的。

过程

古诗文网界面如下,我们意在爬取诗名、作者、朝代、诗的内容四个变量https://www.gushiwen.cn/default_1.aspx
在这里插入图片描述

  1. 在setting.py中把机器人协议设置为False,并设置user-agent,解开ITEM_PIPELINES的注释
    在这里插入图片描述在这里插入图片描述在这里插入图片描述

  2. 在gushiwen.py中更改url,并打印网页源代码测试一下看能不能正常返回
    在这里插入图片描述

  3. 这是一个文件夹,在终端才能运行,在gsww目录下输入scrapy crawl gushiwen即可返回网页源代码
    在这里插入图片描述

  4. 更改代码,看一下response是什么类型
    在这里插入图片描述

  5. 每次都在终端上运行会比较麻烦,可以在gsww下新建一个.py文件,里面写上如下代码,运行这个文件即可,这里我们看到response<class 'scrapy.http.response.html.HtmlResponse'>类型
    在这里插入图片描述

  6. 下面就可以在gushiwen.py这个文件中写xpath语法了(需要有一定的xpath功底),这里爬取了古诗的标题、作者、作者朝代和诗的内容四个属性,同时爬取前十页。

gushiwen.py(爬虫文件)代码如下:

import scrapy
from ..items import GswwItem
from scrapy.http.response.html import HtmlResponse
from scrapy.selector.unified import  Selectorclass GushiwenSpider(scrapy.Spider):name = 'gushiwen'allowed_domains = ['gushiwen.cn','gushiwen.org']start_urls = ['https://www.gushiwen.cn/default_1.aspx']def myprint(self,value):  # 为了输出美观print("="*30)print(value)print("="*30)def parse(self, response):# self.myprint(type(response))  #<class'scrapy.http.response.html.HtmlResponse'># 用xpath进行提取gsw_divs = response.xpath("//div[@class='left']/div[@class='sons']")# self.myprint(type(gsw_divs))  # <class 'scrapy.selector.unified.SelectorList'>for gsw_div in gsw_divs:# self.myprint(type(gsw_div))  # <class 'scrapy.selector.unified.Selector'># SelectorList:里面存储的都是Selector对象# SelectorList.getall:可以直接获取xpath中指定的值# SelectorList.get:可以直接提取第一个值try:title = gsw_div.xpath(".//b/text()").getall()[0]source = gsw_div.xpath(".//p[@class='source']/a/text()").getall()dynasty = source[1]author = source[0]# 下面的//text()代表的是获取class='contson'下的所有子孙文本content_list = gsw_div.xpath(".//div[@class='contson']//text()").getall()content = "".join(content_list).strip()item = GswwItem(title=title, dynasty=dynasty, author=author, content=content)yield itemexcept:self.myprint(gsw_div)# 为了爬取多页next_href = response.xpath("//a[@id='amore']/@href").get()if next_href:next_url = response.urljoin(next_href)request = scrapy.Request(next_url)yield request

item.py(定义字段)代码如下:

# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.htmlimport scrapy
class GswwItem(scrapy.Item):title = scrapy.Field()dynasty = scrapy.Field()author = scrapy.Field()content = scrapy.Field()

pipelines.py(保存数据)代码如下:

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html# useful for handling different item types with a single interface
from itemadapter import ItemAdapter
import jsonclass GswwPipeline:def open_spider(self,spider):self.fp = open("古诗文.txt",'w',encoding="utf-8")def process_item(self, item, spider):self.fp.write(json.dumps(dict(item),ensure_ascii=False)+'\n')return itemdef close_spider(self,spider):self.fp.close()

爬取结果如下:

在这里插入图片描述掌握Scrapy框架的核心是要清楚左边的每一个文件的用途,再对文件做出适当修改,就可以了。♥♥♥希望对大家有所帮助♥♥♥

这篇关于轻松带你掌握Scrapy框架(以爬取古诗文网为例)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/283236

相关文章

闲置电脑也能活出第二春?鲁大师AiNAS让你动动手指就能轻松部署

对于大多数人而言,在这个“数据爆炸”的时代或多或少都遇到过存储告急的情况,这使得“存储焦虑”不再是个别现象,而将会是随着软件的不断臃肿而越来越普遍的情况。从不少手机厂商都开始将存储上限提升至1TB可以见得,我们似乎正处在互联网信息飞速增长的阶段,对于存储的需求也将会不断扩大。对于苹果用户而言,这一问题愈发严峻,毕竟512GB和1TB版本的iPhone可不是人人都消费得起的,因此成熟的外置存储方案开

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

数据治理框架-ISO数据治理标准

引言 "数据治理"并不是一个新的概念,国内外有很多组织专注于数据治理理论和实践的研究。目前国际上,主要的数据治理框架有ISO数据治理标准、GDI数据治理框架、DAMA数据治理管理框架等。 ISO数据治理标准 改标准阐述了数据治理的标准、基本原则和数据治理模型,是一套完整的数据治理方法论。 ISO/IEC 38505标准的数据治理方法论的核心内容如下: 数据治理的目标:促进组织高效、合理地

ZooKeeper 中的 Curator 框架解析

Apache ZooKeeper 是一个为分布式应用提供一致性服务的软件。它提供了诸如配置管理、分布式同步、组服务等功能。在使用 ZooKeeper 时,Curator 是一个非常流行的客户端库,它简化了 ZooKeeper 的使用,提供了高级的抽象和丰富的工具。本文将详细介绍 Curator 框架,包括它的设计哲学、核心组件以及如何使用 Curator 来简化 ZooKeeper 的操作。 1

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟

Spring Framework系统框架

序号表示的是学习顺序 IoC(控制反转)/DI(依赖注入): ioc:思想上是控制反转,spring提供了一个容器,称为IOC容器,用它来充当IOC思想中的外部。 我的理解就是spring把这些对象集中管理,放在容器中,这个容器就叫Ioc这些对象统称为Bean 用对象的时候不用new,直接外部提供(bean) 当外部的对象有关系的时候,IOC给它俩绑好(DI) DI和IO

Sentinel 高可用流量管理框架

Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。 Sentinel 具有以下特性: 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应

生信代码入门:从零开始掌握生物信息学编程技能

少走弯路,高效分析;了解生信云,访问 【生信圆桌x生信专用云服务器】 : www.tebteb.cc 介绍 生物信息学是一个高度跨学科的领域,结合了生物学、计算机科学和统计学。随着高通量测序技术的发展,海量的生物数据需要通过编程来进行处理和分析。因此,掌握生信编程技能,成为每一个生物信息学研究者的必备能力。 生信代码入门,旨在帮助初学者从零开始学习生物信息学中的编程基础。通过学习常用