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

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 scrapy

class 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 BaiduSpider

process = 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_logging

configure_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)
  • 启动爬虫
  • 使用的模块与版本
  • 加载配置文件
  • 打开下载中间件
  • 打开中间件
  • 打开管道
  • 爬虫开启
  • 打印统计
  • 33
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Scrapy是一个基于Python爬虫框架,它可以帮助我们快速高效抓取网站数据。在这里,我将介绍Scrapy的基本用法,让您能够快速入门。 安装Scrapy ----------------------- 在安装Scrapy之前,我们需要先安装Python。然后,我们可以通过以下命令来安装Scrapy: ``` pip install scrapy ``` 创建Scrapy项目 ----------------------- 创建Scrapy项目的命令是: ``` scrapy startproject project_name ``` 这个命令将会在当前目录下创建一个名为project_name的文件夹,其中包含了Scrapy项目的基本结构。 编写Spider ----------------------- 在Scrapy中,Spider是用来定义爬取网站的规则的。我们可以通过以下命令来创建一个Spider: ``` scrapy genspider spider_name domain_name ``` 其中,spider_name是我们自己定义的Spider名称,domain_name是我们要抓取的网站域名。 接下来,我们需要在Spider中定义如何爬取网站。这里我们以爬取“http://quotes.toscrape.com/”网站上的名言警句为例。我们可以在Spider中定义如下规则: ```python import scrapy class QuotesSpider(scrapy.Spider): name = "quotes" start_urls = [ 'http://quotes.toscrape.com/page/1/', 'http://quotes.toscrape.com/page/2/', ] def parse(self, response): for quote in response.css('div.quote'): yield { 'text': quote.css('span.text::text').get(), 'author': quote.css('span small::text').get(), 'tags': quote.css('div.tags a.tag::text').getall(), } next_page = response.css('li.next a::attr(href)').get() if next_page is not None: yield response.follow(next_page, self.parse) ``` 在上述代码中,我们首先定义了Spider的名称,接着定义了我们要爬取的起始URL,最后定义了如何解析网页的函数parse()。在parse()函数中,我们使用Scrapy的选择器来提取网页中的名言警句,并将其保存到字典中。接着,我们使用response.follow()函数来获取下一页的URL,并继续解析。 运行Spider ----------------------- 要运行我们刚才创建的Spider,我们可以使用以下命令: ``` scrapy crawl spider_name ``` 其中,spider_name是我们之前创建的Spider名称。 Scrapy会自动去抓取我们定义的起始URL,并根据我们定义的规则来解析网页。解析完成后,Scrapy会将结果保存到我们指定的位置。 总结 ----------------------- Scrapy是一个非常强大的Python爬虫框架,它可以帮助我们快速高效抓取网站数据。在本教程中,我们介绍了Scrapy项目的创建、Spider的定义以及如何运行Spider。如果您想更深入地学习Scrapy,可以参考官方文档:https://docs.scrapy.org/en/latest/。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值