scrapy爬虫流程(Scrapy主要包括哪些组件_scrapy框架的组成部分分别是什么)

:暂无数据 2026-07-28 18:20:01 :0

scrapy爬虫流程(Scrapy主要包括哪些组件_scrapy框架的组成部分分别是什么)

本篇文章给大家谈谈scrapy爬虫流程,以及Scrapy主要包括哪些组件_scrapy框架的组成部分分别是什么对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

本文目录

Scrapy主要包括哪些组件_scrapy框架的组成部分分别是什么

Scrapy运行流程:

首先,引擎从调度器中取出一个链接(URL)用于接下来的抓取

引擎把URL封装成一个请求(Request)传给下载器,下载器把资源下载下来,并封装成应答包(Response)

然后,爬虫解析Response

若是解析出实体(Item),则交给实体管道进行进一步的处理。

若是解析出的是链接(URL),则把URL交给Scheler等待抓取

具体组件如下:

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

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

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

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

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

下载器中间件(DownloaderMiddlewares):位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应。

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

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

python scrapy 怎么将爬取的内容写出

首先,安装Python,坑太多了,一个个爬。由于我是windows环境,没钱买mac, 在安装的时候遇到各种各样的问题,确实各种各样的依赖。安装教程不再赘述。如果在安装的过程中遇到 ERROR:需要windows c/c++问题,一般是由于缺少windows开发编译环境,晚上大多数教程是安装一个VisualStudio,太不靠谱了,事实上只要安装一个WindowsSDK就可以了。下面贴上我的爬虫代码:

爬虫主程序:

 view plain copy

  • # -*- coding: utf-8 -*-  

  • import scrapy  

  • ***隐藏网址***

  • from zjf.FsmzItems import FsmzItem  

  • from scrapy.selector import Selector  

  • # 圈圈:情感生活  

  • class MySpider(scrapy.Spider):  

  • #爬虫名  

  • name = "MySpider"  

  • #设定域名  

  • allowed_domains =   

  • #爬取地址  

  • start_urls =   

  • #flag  

  • x = 0  

  • #爬取方法  

  • def parse(self, response):  

  • item = FsmzItem()  

  • sel = Selector(response)  

  • item = sel.xpath(’//h1/text()’).extract()  

  • item/p/text()’).extract()  

  • item/p/img/@src’).extract()  

  • if MySpider.x == 0:  

  • page_list = MySpider.getUrl(self,response)  

  • for page_single in page_list:  

  • yield Request(page_single)  

  • MySpider.x += 1  

  • yield item  

  • #init: 动态传入参数  

  • #命令行传参写法:  scrapy crawl MySpider -a start_url="e_url"  

  • def __init__(self,*args,**kwargs):  

  • super(MySpider,self).__init__(*args,**kwargs)  

  • self.start_urls =   

  • def getUrl(self, response):  

  • url_list =   

  • select = Selector(response)  

  • page_list_tmp = select.xpath(’//div/@href’).extract()  

  • for page_tmp in page_list_tmp:  

  • if page_tmp not in url_list:  

  • url_list.append("px/" + page_tmp)  

  • return url_list  


  • PipeLines类
  •  view plain copy

  • # -*- coding: utf-8 -*-  

  • # Define your item pipelines here  

  • #  

  • # Don’t forget to add your pipeline to the ITEM_PIPELINES setting  

  • from zjf import settings  

  • import json,os,re,random  

  • import urllib.request  

  • import requests, json  

  • from requests_toolbelt.multipart.encoder import MultipartEncoder  

  • class MyPipeline(object):  

  • flag = 1  

  • post_title = ’’  

  • post_text =   

  • post_text_imageUrl_list =   

  • cs =   

  • user_id= ’’  

  • def __init__(self):  

  • MyPipeline.user_id = MyPipeline.getRandomUser(’37619,18441390,18441391’)  

  • #process the data  

  • def process_item(self, item, spider):  

  • #获取随机user_id,模拟发帖  

  • user_id = MyPipeline.user_id  

  • #获取正文text_str_tmp  

  • text = item  

  • text_str_tmp = ""  

  • for str in text:  

  • text_str_tmp = text_str_tmp + str  

  • # print(text_str_tmp)  

  • #获取标题  

  • if MyPipeline.flag == 1:  

  • title = item  

  • MyPipeline.post_title = MyPipeline.post_title + title  

  • #保存并上传图片  

  • text_insert_pic = ’’  

  • text_insert_pic_w = ’’  

  • text_insert_pic_h = ’’  

  • for imag_url in item:  

  • img_name = imag_url.replace(’/’,’’).replace(’.’,’’).replace(’|’,’’).replace(’:’,’’)  

  • pic_dir = settings.IMAGES_STORE + ’%s.jpg’ %(img_name)  

  • urllib.request.urlretrieve(imag_url,pic_dir)  

  • #图片上传,返回json  

  • upload_img_result = MyPipeline.uploadImage(pic_dir,’image/jpeg’)  

  • #获取json中保存图片路径  

  • text_insert_pic = upload_img_result  

  • text_insert_pic_w = upload_img_result  

  • text_insert_pic_h = upload_img_result  

  • #拼接json  

  • if MyPipeline.flag == 1:  

  • cs_json = {"c":text_str_tmp,"i":"","w":text_insert_pic_w,"h":text_insert_pic_h}  

  • else:  

  • cs_json = {"c":text_str_tmp,"i":text_insert_pic,"w":text_insert_pic_w,"h":text_insert_pic_h}  

  • MyPipeline.cs.append(cs_json)  

  • MyPipeline.flag += 1  

  • return item  

  • #spider开启时被调用  

  • def open_spider(self,spider):  

  • pass  

  • #sipder 关闭时被调用  

  • def close_spider(self,spider):  

  • strcs = json.dumps(MyPipeline.cs)  

  • jsonData = {"apisign":"99ea3eda4b45549162c4a741d58baa60","user_id":MyPipeline.user_id,"gid":30,"t":MyPipeline.post_title,"cs":strcs}  

  • MyPipeline.uploadPost(jsonData)  

  • #上传图片  

  • def uploadImage(img_path,content_type):  

  • "uploadImage functions"  

  • #UPLOAD_IMG_URL = "dpostimage"  

  • UPLOAD_IMG_URL = "oadpostimage"  

  • # 传图片  

  • ***隐藏网址***

  • m = MultipartEncoder(  

  • # fields={’user_id’: ’192323’,  

  • #         ’images’: (’filename’, open(imgPath, ’rb’), ’image/JPEG’)}  

  • fields={’user_id’: MyPipeline.user_id,  

  • ’apisign’:’99ea3eda4b45549162c4a741d58baa60’,  

  • ’image’: (’filename’, open(img_path , ’rb’),’image/jpeg’)}  

  • )  

  • r = requests.post(UPLOAD_IMG_URL,data=m,headers={’Content-Type’: m.content_type})  

  • return r.json()  

  • def uploadPost(jsonData):  

  • CREATE_POST_URL = "hmagespost"  

  •  view plain copy

  • reqPost = requests.post(CREATE_POST_URL,data=jsonData)  

  •  view plain copy

  • def getRandomUser(userStr):  

  • user_list =   

  • user_chooesd = ’’  

  • for user_id in str(userStr).split(’,’):  

  • user_list.append(user_id)  

  • userId_idx = random.randint(1,len(user_list))  

  • user_chooesd = user_list  

  • return user_chooesd  


  • 字段保存Items类
  •  view plain copy

  • # -*- coding: utf-8 -*-  

  • # Define here the models for your scraped items  

  • #  

  • # See documentation in:  

  • import scrapy  

  • class FsmzItem(scrapy.Item):  

  • # define the fields for your item here like:  

  • # name = scrapy.Field()  

  • title = scrapy.Field()  

  • #tutor = scrapy.Field()  

  • #strongText = scrapy.Field()  

  • text = scrapy.Field()  

  • imags = scrapy.Field()  


  • 在命令行里键入 
  • scrapy crawl MySpider -a start_url="www.aaa.com"

  • 这样就可以爬取aaa.com下的内容了

scrapy在pipeline中重新生成request

基于scrapy框架进行爬虫开发,一般的流程如下:

某些应用场景下,我们可能需要在pipeline中对 item进行进一步处理,比如从中提取新的url进行爬取或者调用restful 微服务等。这就需要在pipeline中重新yield 新的request。
而从scrapy的数据流中可以看到,scrapy的执行引擎只向pipeline发送item数据,并不接收pipeline返回的数据。类似在spider类中直接yield request的方式是行不通的,yield语句会中断所有pipeline的执行

显式调用crawler.engine.crawl(),将新的request发送至执行引擎。

python爬虫什么教程最好

***隐藏网址***

***隐藏网址***

提取码:2b6c

课程简介

毕业不知如何就业?工作效率低经常挨骂?很多次想学编程都没有学会?

Python 实战:四周实现爬虫系统,无需编程基础,二十八天掌握一项谋生技能。

带你学到如何从网上批量获得几十万数据,如何处理海量大数据,数据可视化及网站制作。

课程目录

开始之前,魔力手册 for 实战学员预习

第一周:学会爬取网页信息

第二周:学会爬取大规模数据

第三周:数据统计与分析

第四周:搭建 Django 数据可视化网站

......

python爬虫教程

可以看这个教程:网页链接

此教程 通过三个爬虫案例来使学员认识Scrapy框架、了解Scrapy的架构、熟悉Scrapy各模块。

此教程的大致内容:

1、Scrapy的简介。

主要知识点:Scrapy的架构和运作流程。

2、搭建开发环境:

主要知识点:Windows及Linux环境下Scrapy的安装。

3、Scrapy Shell以及Scrapy Selectors的使用。

4、使用Scrapy完成网站信息的爬取。

主要知识点:创建Scrapy项目(scrapy startproject)、定义提取的结构化数据(Item)、编写爬取网站的 Spider 并提取出结构化数据(Item)、编写 Item Pipelines 来存储提取到的Item(即结构化数据)。

如何在scrapy框架下,用python实现爬虫自动跳转页面来抓去网页内容

***隐藏网址***
在第一页的时候,下一页按钮的审查元素是
我们通过获取next_pages = response.xpath(’//div
***隐藏网址***
这一部分的完整代码为:
page_link=set() #保存下一页页面url
content_link=set() #保存页面内所有可获得的url
***隐藏网址***
))}
***隐藏网址***
def parse(self, response):
#爬取一个页面内的所有url链接
    for link in self.rules.extract_links(response):
        if link.url not in self.content_link:
            self.page_link.add(link.url)
            yield scrapy.Request(link.url, callback=self.parse_item)
#自动获取下一页的url
    next_pages = response.xpath(’//div
    if next_pages:
***隐藏网址***
        self.page_link.add(next_page)
        yield scrapy.Request(next_page, callback=self.parse)
***隐藏网址***
我们不能通过href来直接过得下一页的url,需要自己手动获得,那现在我们来分析
***隐藏网址***

Python编程基础之(五)Scrapy爬虫框架

经过前面四章的学习,我们已经可以使用Requests库、Beautiful Soup库和Re库,编写基本的Python爬虫程序了。那么这一章就来学习一个专业的网络爬虫框架--Scrapy。没错,是框架,而不是像前面介绍的函数功能库。

Scrapy是一个快速、功能强大的网络爬虫框架。

可能大家还不太了解什么是框架,爬虫框架其实是实现爬虫功能的一个软件结构和功能组件的集合。

简而言之, Scrapy就是一个爬虫程序的半成品,可以帮助用户实现专业的网络爬虫。

使用Scrapy框架,不需要你编写大量的代码,Scrapy已经把大部分工作都做好了,允许你调用几句代码便自动生成爬虫程序,可以节省大量的时间。

当然,框架所生成的代码基本是一致的,如果遇到一些特定的爬虫任务时,就不如自己使用Requests库搭建来的方便了。

PyCharm安装

测试安装:

出现框架版本说明安装成功。

掌握Scrapy爬虫框架的结构是使用好Scrapy的重中之重!

先上图:

整个结构可以简单地概括为: “5+2”结构和3条数据流

5个主要模块(及功能):

(1)控制所有模块之间的数据流。

(2)可以根据条件触发事件。

(1)根据请求下载网页。

(1)对所有爬取请求进行调度管理。

(1)解析DOWNLOADER返回的响应--response。

(2)产生爬取项--scraped item。

(3)产生额外的爬取请求--request。

(1)以流水线方式处理SPIDER产生的爬取项。

(2)由一组操作顺序组成,类似流水线,每个操作是一个ITEM PIPELINES类型。

(3)清理、检查和查重爬取项中的HTML数据并将数据存储到数据库中。

2个中间键:

(1)对Engine、Scheduler、Downloader之间进行用户可配置的控制。

(2)修改、丢弃、新增请求或响应。

(1)对请求和爬取项进行再处理。

(2)修改、丢弃、新增请求或爬取项。

3条数据流:

(1):图中数字 1-2

1:Engine从Spider处获得爬取请求--request。

2:Engine将爬取请求转发给Scheduler,用于调度。

(2):图中数字 3-4-5-6

3:Engine从Scheduler处获得下一个要爬取的请求。

4:Engine将爬取请求通过中间件发送给Downloader。

5:爬取网页后,Downloader形成响应--response,通过中间件发送给Engine。

6:Engine将收到的响应通过中间件发送给Spider处理。

(3):图中数字 7-8-9

7:Spider处理响应后产生爬取项--scraped item。

8:Engine将爬取项发送给Item Pipelines。

9:Engine将爬取请求发送给Scheduler。

任务处理流程:从Spider的初始爬取请求开始爬取,Engine控制各模块数据流,不间断从Scheduler处获得爬取请求,直至请求为空,最后到Item Pipelines存储数据结束。

作为用户,只需配置好Scrapy框架的Spider和Item Pipelines,也就是数据流的入口与出口,便可完成一个爬虫程序的搭建。Scrapy提供了简单的爬虫命令语句,帮助用户一键配置剩余文件,那我们便来看看有哪些好用的命令吧。

Scrapy采用命令行创建和运行爬虫

PyCharm打开Terminal,启动Scrapy:

Scrapy基本命令行格式:

具体常用命令如下:

下面用一个例子来学习一下命令的使用:

1.建立一个Scrapy爬虫工程,在已启动的Scrapy中继续输入:

执行该命令,系统会在PyCharm的工程文件中自动创建一个工程,命名为pythonDemo。

***隐藏网址***

命令生成了一个名为demo的spider,并在Spiders目录下生成文件demo.py。

命令仅用于生成demo.py文件,该文件也可以手动生成。

观察一下demo.py文件:

3.配置产生的spider爬虫,也就是demo.py文件:

4.运行爬虫,爬取网页:

如果爬取成功,会发现在pythonDemo下多了一个t20210816_551472.html的文件,我们所爬取的网页内容都已经写入该文件了。

以上就是Scrapy框架的简单使用了。

Request对象表示一个HTTP请求,由Spider生成,由Downloader执行。

Response对象表示一个HTTP响应,由Downloader生成,有Spider处理。

Item对象表示一个从HTML页面中提取的信息内容,由Spider生成,由Item Pipelines处理。Item类似于字典类型,可以按照字典类型来操作。

关于scrapy爬虫流程,Scrapy主要包括哪些组件_scrapy框架的组成部分分别是什么的介绍到此结束,希望对大家有所帮助。

scrapy爬虫流程(Scrapy主要包括哪些组件_scrapy框架的组成部分分别是什么)

本文编辑:admin

更多文章:


form表单制作(为什么制作的form表单会在网页显示中多出一行)

form表单制作(为什么制作的form表单会在网页显示中多出一行)

大家好,如果您还对form表单制作不太了解,没有关系,今天就由本站为大家分享form表单制作的知识,包括为什么制作的form表单会在网页显示中多出一行的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

2026年10月11日 09:10

teammate(teammate,company,partner)

teammate(teammate,company,partner)

各位老铁们,大家好,今天由我来为大家分享teammate,以及teammate,company,partner的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧

2026年10月11日 06:10

javascript arraybuffer(javascript可以把base64编码转换成二进制代码吗求示例代码!)

javascript arraybuffer(javascript可以把base64编码转换成二进制代码吗求示例代码!)

其实javascript arraybuffer的问题并不复杂,但是又很多的朋友都不太了解javascript可以把base64编码转换成二进制代码吗求示例代码!,因此呢,今天小编就来为大家分享javascript arraybuffer的

2026年10月11日 04:00

text函数公式(excel中round和text函数的区别是什么)

text函数公式(excel中round和text函数的区别是什么)

“text函数公式”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看text函数公式(excel中round和text函数的区别是什么)!

2026年10月11日 03:50

pascal编程软件(介绍一下pascal语言!)

pascal编程软件(介绍一下pascal语言!)

大家好,如果您还对pascal编程软件不太了解,没有关系,今天就由本站为大家分享pascal编程软件的知识,包括介绍一下pascal语言!的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

2026年10月11日 02:40

google chrome打不开(chrome浏览器打不开怎么回事 浏览器打不开的处理方法)

google chrome打不开(chrome浏览器打不开怎么回事 浏览器打不开的处理方法)

本篇文章给大家谈谈google chrome打不开,以及chrome浏览器打不开怎么回事 浏览器打不开的处理方法对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了

2026年10月11日 02:00

websocket整合springboot(Springboot整合Websocket遇到的坑)

websocket整合springboot(Springboot整合Websocket遇到的坑)

大家好,websocket整合springboot相信很多的网友都不是很明白,包括Springboot整合Websocket遇到的坑也是一样,不过没有关系,接下来就来为大家分享关于websocket整合springboot和Springbo

2026年10月11日 01:40

小米官方首爆miui14(miui14耗电严重官方回应)

小米官方首爆miui14(miui14耗电严重官方回应)

各位老铁们好,相信很多人对小米官方首爆miui14都不是特别的了解,因此呢,今天就来为大家分享下关于小米官方首爆miui14以及miui14耗电严重官方回应的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

2026年10月11日 00:40

drawerlayout(android 怎样让drawerlayout设置的侧滑菜单的内容充满屏幕)

drawerlayout(android 怎样让drawerlayout设置的侧滑菜单的内容充满屏幕)

本篇文章给大家谈谈drawerlayout,以及android 怎样让drawerlayout设置的侧滑菜单的内容充满屏幕对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

2026年10月10日 19:20

xor四位数怎么运算(单片机怎样用C语言实现4个数字间的异或)

xor四位数怎么运算(单片机怎样用C语言实现4个数字间的异或)

大家好,今天小编来为大家解答以下的问题,关于xor四位数怎么运算,单片机怎样用C语言实现4个数字间的异或这个很多人还不知道,现在让我们一起来看看吧!

2026年10月10日 17:50

最近更新

thinkpade470c加内存条(thinkpad e470c内存条是什么牌子如果要添加4g内存什么牌子比较好)
2026-10-11 09:00:03 浏览:0
frontpage的主要功能(frontpage是什么)
2026-10-11 08:40:18 浏览:0
热门文章

打印机m7400(m7400打印机清零方法)
2026-08-29 07:50:01 浏览:5
acrobat各版本区别(Acrobat XI Pro与 Acrobat PRO DC什么区别)
2026-08-29 22:30:20 浏览:2
联想y510p怎么升级(联想y510p换cpu)
2026-08-17 03:30:04 浏览:2
标签列表