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

:暂无数据 2026-04-13 09:00:02 0
今天给各位分享Python编程基础之(五)Scrapy爬虫框架的知识,其中也会对Python编程基础之(五)Scrapy爬虫框架进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录

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返回的响应--resp***e。

(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形成响应--resp***e,通过中间件发送给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执行。

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

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

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 scrapy 怎么将爬取的内容写出

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

爬虫主程序:

 view plain copy

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

  • import scrapy  

  • ***隐藏网址***

  • from zjf.F**zItems import F**zItem  

  • from scrapy.selector import Selector  

  • # 圈圈:情感生活  

  • class MySpider(scrapy.Spider):  

  • #爬虫名  

  • name = "MySpider"  

  • #设定域名  

  • allowed_domains =   

  • #爬取地址  

  • start_urls =   

  • #flag  

  • x = 0  

  • #爬取方法  

  • def parse(self, resp***e):  

  • item = F**zItem()  

  • sel = Selector(resp***e)  

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

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

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

  • if MySpider.x == 0:  

  • page_list = MySpider.getUrl(self,resp***e)  

  • 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, resp***e):  

  • url_list =   

  • select = Selector(resp***e)  

  • 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 functi***"  

  • #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 F**zItem(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主要包括哪些组件_scrapy框架的组成部分分别是什么

Scrapy运行流程:

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

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

然后,爬虫解析Resp***e

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

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

具体组件如下:

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

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

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

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

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

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

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

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

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

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

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(即结构化数据)。

python爬虫什么教程最好

***隐藏网址***

***隐藏网址***

提取码:2b6c

课程简介

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

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

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

课程目录

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

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

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

第三周:数据统计与分析

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

......

在了解scrapy爬虫流程Python编程基础之(五)Scrapy爬虫框架之后,你认为哪一点对你的启发最大?
本文编辑:admin

更多文章:


java工作流框架有哪些(java要实现工作流需要哪些框架啊)

java工作流框架有哪些(java要实现工作流需要哪些框架啊)

其实java工作流框架有哪些的问题并不复杂,但是又很多的朋友都不太了解java要实现工作流需要哪些框架啊,因此呢,今天小编就来为大家分享java工作流框架有哪些的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

2026年4月13日 10:20

数字三声组词(数字读三声有哪些词)

数字三声组词(数字读三声有哪些词)

有研究表明,成功掌握数字三声组词的学习者,普遍在数字读三声有哪些词这个环节投入了更多精力。其重要性不言而喻。

2026年4月13日 10:00

arial unicode ms下载(Solidworks保存PDF的时候出现帮助搜索选项卡然后搜索Arial 谁能给我个详细的操作方案 急啊)

arial unicode ms下载(Solidworks保存PDF的时候出现帮助搜索选项卡然后搜索Arial 谁能给我个详细的操作方案 急啊)

我们整理了关于arial unicode ms下载最高频的提问,发现Solidworks保存PDF的时候出现帮助搜索选项卡然后搜索Arial 谁能给我个详细的操作方案 急啊位列榜首。于是,就有了这篇集中解答的精华帖。

2026年4月13日 09:40

linux中的进程(PID)有什么意义?推动订单的进程 英文

linux中的进程(PID)有什么意义?推动订单的进程 英文

关注本号的朋友都知道,我们一直在持续输出关于进程英文的干货。今天,我们就聚焦到大家反复问到的linux中的进程(PID)有什么意义上。

2026年4月13日 09:20

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

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

今天给各位分享Python编程基础之(五)Scrapy爬虫框架的知识,其中也会对Python编程基础之(五)Scrapy爬虫框架进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

2026年4月13日 09:00

html元素(HTML文档的三大组成元素是什么)

html元素(HTML文档的三大组成元素是什么)

本文旨在为您说清楚两件事:一是html元素到底是什么,二是如何理解HTML文档的三大组成元素是什么。内容不长,但都是干货,希望能对您有所帮助。

2026年4月13日 08:40

sql语言可分为哪几类(**L包含哪两种类型的语言)

sql语言可分为哪几类(**L包含哪两种类型的语言)

为什么说不懂**L包含哪两种类型的语言,就等于没学明白sql语言可分为哪几类?这篇文章将给你一个令人信服的解释。

2026年4月13日 08:20

php后端和前端的有不同是什么?php网站后端功能在哪删除

php后端和前端的有不同是什么?php网站后端功能在哪删除

想高效掌握php后端的核心吗?本文将为你聚焦php后端和前端的有不同是什么这一关键环节,帮你节省大量摸索时间。

2026年4月13日 08:00

help out(help out和help out with的区别)

help out(help out和help out with的区别)

您是否曾想过,help out究竟是怎么一回事?它与help out和help out with的区别之间又有什么联系?本文将为您一探究竟。

2026年4月13日 07:40

pycharm下载包(如何下载pycharm专业版)

pycharm下载包(如何下载pycharm专业版)

本篇文章给大家谈谈pycharm下载包,以及如何下载pycharm专业版对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

2026年4月13日 07:20

最近更新

arial unicode ms下载(Solidworks保存PDF的时候出现帮助搜索选项卡然后搜索Arial 谁能给我个详细的操作方案 急啊)
2026-04-13 09:40:02 浏览:0
help out(help out和help out with的区别)
2026-04-13 07:40:03 浏览:0
热门文章

繁体字转换器(繁体字转化)
2026-04-04 18:00:01 浏览:0
androidbc(bc8-android是什么手机型号)
2026-04-05 07:20:02 浏览:0
标签列表