Day:007(1) | Python爬虫:高效数据抓取的编程技术(scrapy框架使用)

news/2024/12/1 18:42:47/

Scrapy的介绍

        Scrapy 是一个用于抓取网站和提取结构化数据的应用程序框架,可用于各种有用的应用程序,如数据挖掘、信息处理或历史存档。

尽管 Scrapy 最初是为网络抓取而设计的,但它也可用于使用API提取数据或用作通用网络爬虫。

Scrapy的优势 

  • 可以容易构建大规模的爬虫项目
  • 内置re、xpath、css选择器
  • 可以自动调整爬行速度
  • 开源和免费的网络爬虫框架
  • 可以快速导出数据文件: JSON,CSV和XML
  • 可以自动方式从网页中提取数据(自己编写规则)
  • Scrapy很容易扩展,快速和功能强大
  • 这是一个跨平台应用程序框架(在Windows,Linux,Mac OS)
  • Scrapy请求调度和异步处理 

Scrapy的架构 

最简单的单个网页爬取流程是 spiders > scheduler >downloader > spiders > item pipeline

省略了engine环节! 

  • 引擎(engine)

                用来处理整个系统的数据流处理, 触发事务(框架核心) 

  • 调度器(Scheduler)

                用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址。

  • 下载器(Downloader)

                用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)

  • 爬虫(Spiders)

                爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面

  • 项目管道(Pipeline)

                负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。

  • 下载器中间件(Downloader Middlewares)

                位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应

  • 爬虫中间件(Spider Middlewares)

                介于Scrapy引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出

  • 调度中间件(Scheduler Middewares)

                介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应 

安装 

pip install scrapy

注意
        企业也追求更稳定的不追求最新,而且我们的主要目的是做项目写代码没必要因为环境版本问题出bug浪费太多时间 

Scarpy开发第一个爬虫

创建第一个项目 

scrapy startproject myfrist(project_name)

文件说明 

名称作用
scrapy.cfg项目的配置信息,主要为Scrapy命令行工具提供一个基础的配置信息。(真正爬虫相关的配置信息在settings.py文件中)
items.py设置数据存储模板,用于结构化数据,如:Django的Model
pipelines数据处理行为,如:一般结构化的数据持久化
settings.py配置文件,如:递归的层数、并发数,延迟下载等
spiders爬虫目录,如:创建文件,编写爬虫规则

创建第一个爬虫 

scrapy genspider 爬虫名 爬虫的地址

注意
一般创建爬虫文件时,以网站域名命名 

 爬虫包含的内容

  • name: 它定义了蜘蛛的唯一名称
  • allowed_domains: 它包含了蜘蛛抓取的基本URL;
  • start-urls: 蜘蛛开始爬行的URL列表;
  • parse(): 这是提取并解析刮下数据的方法;

代码 

import scrapyclass DoubanSpider(scrapy.Spider):name = 'douban'allowed_domains = 'douban.com'start_urls = ['https://movie.douban.com/top250/']def parse(self, response):movie_name =
response.xpath("//div[@class='item']//a/span
[1]/text()").extract()movie_core =
response.xpath("//div[@class='star']/span[2]
/text()").extract()yield {'movie_name':movie_name,'movie_core':movie_core}

Scrapy项目的启动介绍

Scrapy启动的方式有多种方式:

  • Scrapy命令运行

                运行环境
                        命令行:cmd/powershell/等等

 

 

  •  运行Python脚本

                运行环境
                       命令行:cmd/powershell/等等
                       编辑器:VSCode/PyCharm等等

注意
运行程序之前,要确认网站是否允许爬取 robots.txt 文件

Scrapy启动-命令启动 

scrapy命令

scrapy框架提供了对项目的命令scrapy ,具体启动项目命令格式如下:

方法1

scrapy crawl 爬虫名

注意
这的爬虫名是爬虫文件中name属性的值

问题

         命令无法启动


解决方案
        切换到项目目录中,运行即可

方法2

scrapy runspider spider_file.py

注意

  • 这是爬虫文件的名字
  • 要指定到spider文件夹

Scrapy启动-脚本启动 

        Scrapy为开发者设置好了启动好的对象。因此,我们通过脚本即可启动Scrapy项目

运行脚本

        在项目的目录下,创建脚本,比如项目名为:scrapy01,创建脚本的路径为 scrapy01\scrapy01\脚本.py

脚本 

  • 使用cmdline
from scrapy.cmdline import execute
execute(['scrapy', 'crawl', '爬虫名字'])
  •  使用CrawlerProcess
from scrapy.crawler import CrawlerProcess
from spiders.baidu import BaiduSpiderprocess = CrawlerProcess()
process.crawl(BaiduSpider)
process.start()
  •  使用CrawlerRunner
from twisted.internet import reactor
from spiders.baidu import BaiduSpider
from spiders.taobao import TaoBaoSpider
from scrapy.crawler import CrawlerRunner
from scrapy.utils.log import configure_loggingconfigure_logging() # 开启日志出输出
runner = CrawlerRunner()
runner.crawl(BaiduSpider)
runner.crawl(TaoBaoSpider)
d = runner.join()
d.addBoth(lambda _: reactor.stop())
reactor.run()

运行
    命令行运行 

python 脚本.py

 VSCode运行
        右键脚本编辑区空白处==> run python file in terminal(运行python文件在命令行)

 

VSCode调试运行

打开脚本文件 ==> 选择调试运行 

 

 

 Scrapy输出日志-了解

启动Scrapy时,默认会输出日志,内容如下(做为参考):

2030-07-13 16:45:19 [scrapy.utils.log] INFO:Scrapy 2.6.1 started (bot: scrapy02)
2030-07-13 16:45:19 [scrapy.utils.log] INFO:Versions: lxml 4.8.0.0, libxml2 2.9.12,
cssselect 1.1.0, parsel 1.6.0, w3lib 1.22.0,Twisted 22.4.0, Python 3.10.2
(tags/v3.10.2:a58ebcc, Jan 17 2022,14:12:15) [MSC v.1929 64 bit (AMD64)],pyOpenSSL 22.0.0 (OpenSSL 3.0.4 21 Jun2022), cryptography 37.0.3, PlatformWindows-10-10.0.22000-SP0
2030-07-13 16:45:19 [scrapy.crawler] INFO:
Overridden settings:
{'BOT_NAME': 'scrapy02',
'NEWSPIDER_MODULE': 'scrapy02.spiders',
'SPIDER_MODULES': ['scrapy02.spiders']}2030-07-13 16:45:19 [scrapy.utils.log]DEBUG: Using reactor:
twisted.internet.selectreactor.SelectReactor
2030-07-13 16:45:19
[scrapy.extensions.telnet] INFO: Telnet
Password: a7b76850d59e14d0
2030-07-13 16:45:20 [scrapy.middleware]
INFO: Enabled extensions:
['scrapy.extensions.corestats.CoreStats',
'scrapy.extensions.telnet.TelnetConsole',
'scrapy.extensions.logstats.LogStats']
2030-07-13 16:45:20 [scrapy.middleware]
INFO: Enabled downloader middlewares:
2030-07-13 16:45:19
[scrapy.extensions.telnet] INFO: Telnet
Password: a7b76850d59e14d0
2030-07-13 16:45:20 [scrapy.middleware]
INFO: Enabled extensions:
['scrapy.extensions.corestats.CoreStats',
'scrapy.extensions.telnet.TelnetConsole',
'scrapy.extensions.logstats.LogStats']
2030-07-13 16:45:20 [scrapy.middleware]
INFO: Enabled downloader middlewares:
['scrapy.downloadermiddlewares.httpauth.Http
AuthMiddleware',
'scrapy.downloadermiddlewares.downloadtimeo
ut.DownloadTimeoutMiddleware',
'scrapy.downloadermiddlewares.defaultheader
s.DefaultHeadersMiddleware',
'scrapy.downloadermiddlewares.useragent.Use
rAgentMiddleware',
'scrapy.downloadermiddlewares.retry.RetryMi
ddleware',
'scrapy.downloadermiddlewares.redirect.Meta
RefreshMiddleware',
'scrapy.downloadermiddlewares.httpcompressi
on.HttpCompressionMiddleware',
'scrapy.downloadermiddlewares.redirect.Redi
rectMiddleware',
'scrapy.downloadermiddlewares.cookies.Cooki
esMiddleware',
'scrapy.downloadermiddlewares.httpproxy.Htt
pProxyMiddleware',
'scrapy.downloadermiddlewares.stats.Downloa
derStats']
2030-07-13 16:45:20 [scrapy.middleware]
INFO: Enabled spider middlewares:
['scrapy.spidermiddlewares.httperror.HttpErr
orMiddleware',
'scrapy.spidermiddlewares.offsite.OffsiteMi
ddleware',
'scrapy.spidermiddlewares.referer.RefererMi
ddleware',
'scrapy.spidermiddlewares.urllength.UrlLeng
thMiddleware',
'scrapy.spidermiddlewares.depth.DepthMiddle
ware']
2030-07-13 16:45:20 [scrapy.middleware]
INFO: Enabled item pipelines:
[]
2030-07-13 16:45:20 [scrapy.core.engine]
INFO: Spider opened
2030-07-13 16:45:20
[scrapy.extensions.logstats] INFO: Crawled 0
pages (at 0 pages/min), scraped 0 items (at
0 items/min)
2030-07-13 16:45:20
[scrapy.extensions.telnet] INFO: Telnet
console listening on 127.0.0.1:6023
2030-07-13 16:45:24 [filelock] DEBUG:
Attempting to acquire lock 1733280163264 on
D:\python_env\spider2_env\lib\sitepackages\tldextract\.suffix_cache/publicsuff
ix.orgtlds\de84b5ca2167d4c83e38fb162f2e8738.tldext
ract.json.lock
2030-07-13 16:45:24 [filelock] DEBUG: Lock
1733280163264 acquired on
D:\python_env\spider2_env\lib\sitepackages\tldextract\.suffix_cache/publicsuff
ix.orgtlds\de84b5ca2167d4c83e38fb162f2e8738.tldext
ract.json.lock
2030-07-13 16:45:24 [filelock] DEBUG:
Attempting to release lock 1733280163264 on
D:\python_env\spider2_env\lib\sitepackages\tldextract\.suffix_cache/publicsuff
ix.orgtlds\de84b5ca2167d4c83e38fb162f2e8738.tldext
ract.json.lock
2030-07-13 16:45:24 [filelock] DEBUG: Lock
1733280163264 released on
D:\python_env\spider2_env\lib\sitepackages\tldextract\.suffix_cache/publicsuff
ix.orgtlds\de84b5ca2167d4c83e38fb162f2e8738.tldext
ract.json.lock
2030-07-13 16:45:24 [scrapy.core.engine]
DEBUG: Crawled (200) <GET
http://www.baidu.com/> (referer: None)
1111111111111111111111111111111111111111111111
2030-07-13 16:45:24 [scrapy.core.engine]
INFO: Closing spider (finished)
2030-07-13 16:45:24 [scrapy.statscollectors]
INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 213,
'downloader/request_count': 1,'downloader/request_method_count/GET': 1,
'downloader/response_bytes': 1476,
'downloader/response_count': 1,
'downloader/response_status_count/200': 1,
'elapsed_time_seconds': 4.716963,
'finish_reason': 'finished',
'finish_time': datetime.datetime(2030, 7,
13, 8, 45, 24, 923094),
'httpcompression/response_bytes': 2381,
'httpcompression/response_count': 1,
'log_count/DEBUG': 6,
'log_count/INFO': 10,
'response_received_count': 1,
'scheduler/dequeued': 1,
'scheduler/dequeued/memory': 1,
'scheduler/enqueued': 1,
'scheduler/enqueued/memory': 1,
'start_time': datetime.datetime(2030, 7,
13, 8, 45, 20, 206131)}
2030-07-13 16:45:24 [scrapy.core.engine]
INFO: Spider closed (finished)
  • 启动爬虫
  • 使用的模块与版本
  • 加载配置文件
  • 打开下载中间件
  • 打开中间件
  • 打开管道
  • 爬虫开启
  • 打印统计

http://www.ppmy.cn/news/1416235.html

相关文章

SpringCloud学习(9)-GateWay网关-自定义拦截器

GateWay Filter详细配置说明 gateway Filter官网:Spring Cloud Gateway 作用&#xff1a; 请求鉴权异常处理记录接口调用时长统计 过滤器类别 全局默认过滤器&#xff1a;官网&#xff1a;Spring Cloud Gateway&#xff0c;出厂默认已有的&#xff0c;直接用&#xff0c;作…

Docker 学习笔记(五):梳理 Docker 镜像知识,附带 Commit 方式提交镜像副本,安装可视化面板 portainer

一、前言 记录时间 [2024-4-10] 前置文章&#xff1a; Docker学习笔记&#xff08;一&#xff09;&#xff1a;入门篇&#xff0c;Docker概述、基本组成等&#xff0c;对Docker有一个初步的认识 Docker学习笔记&#xff08;二&#xff09;&#xff1a;在Linux中部署Docker&…

深入理解Linux系统中的前后台任务与守护进程

⭐小白苦学IT的博客主页 ⭐初学者必看&#xff1a;Linux操作系统入门 ⭐代码仓库&#xff1a;Linux代码仓库 ❤关注我一起讨论和学习Linux系统 1.前言 在Linux系统中&#xff0c;进程管理是至关重要的一个环节。其中&#xff0c;前后台任务和守护进程是进程管理中不可忽视的两…

Mapbox 教程: 改变地图样式

注&#xff1a;相关功能在Mapbox GL JS v3中可用。在新版本中&#xff0c;默认使用标准样式&#xff0c;在创建地图时&#xff0c;可以在构造函数中明确指定style option 设置指定样式&#xff0c;也可以不设置style option 从而使用默认样式。 本示例通过Mapbox加载了一份带三…

Kyligence 发布企业级 AI 解决方案,Data + AI 落地迈向新阶段

4月11日&#xff0c;Kyligence 2024 数智论坛暨春季发布会成功召开。Kyligence 正式发布全新的企业级 AI 解决方案&#xff0c;基于服务金融、零售、制造、医药等行业领先客户的落地实践&#xff0c;Kyligence 为企业提供准确、可靠、智能的 AI 指标平台一站式解决方案&#x…

策略模式(Strategy Pattern)在JAVA中的应用

设计模式是软件工程中的一套被广泛认可的解决特定问题的最佳实践。它们是在多年的软件开发实践中总结出的有效方法。策略模式是JAVA中常用的一种行为型设计模式&#xff0c;它定义了一系列算法&#xff0c;并将每一个算法封装起来&#xff0c;使它们可以互换&#xff0c;让算法…

BUUCTF-Misc(1~4题)

一.签到 答案就在上面&#xff0c;输入&#xff1a;flag{buu-ctf} 二.金三胖 然后解压得到一个GIF图 大家清楚地看到闪过了两张红色的图片 方法一&#xff1a;使用GifSplitter 2.0 然后就可以在金三胖的文件夹里生成了每一帧的图片 可以看到答案是flag{he11ohongke} 方法二…

PostgreSQL入门到实战-第二十一弹

PostgreSQL入门到实战 PostgreSQL中表连接操作(五)官网地址PostgreSQL概述PostgreSQL中RIGHT JOIN命令理论PostgreSQL中RIGHT JOIN命令实战更新计划 PostgreSQL中表连接操作(五) 使用PostgreSQL RIGHT JOIN连接两个表&#xff0c;并从右表返回行 官网地址 声明: 由于操作系统…