1.五大核心组件工作流程:

引擎(Scrapy)

用来处理整个系统的数据流处理, 触发事务(事务:函数调用、方法触发、类实例化)【框架核心】

调度器(Scheduler)

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

- 队列:先进先出的处理请求对象

- 过滤器:过滤掉重复请求对象

下载器(Downloader)

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

爬虫(Spiders)

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

项目管道(Pipeline)

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

2.请求传参

- 使用场景:如果使用scrapy爬取的数据没有在同一张页面中,则必须使用请求传参

- 编码流程:

- 需求:爬取的是首页中电影的名称和详情页中电影的简介(全站数据爬去)

- 基于起始url进行数据解析(parse)

- 解析数据

- 电影名称

- 详情页url

- 对详情页的url发起手动请求(指定的回调函数detail_parse),进行请求传参(meta),meta传递给detail_parse这个回调函数

- 封装一个其他页码对应url的一个通用的url模板

- 在for循环外部,手动对其他也的url进行手动请求发送(需要制定回调函数-->parse)

- 定义detail_parse回调方法,在其内部对电影的简介进行解析。解析玩不后,需要将解析到的电影名称和电影的简介封装到同一个item中

- 接受传递过来的item,并且将解析到的数据存储到item中,将item提交给管道

请求传参实例:爬取电影数据

# 1.spider文件

importscrapy

from moviePro.items importMovieproItem

classMovieSpider(scrapy.Spider):

name = 'movie'

# allowed_domains = ['www.xxx.com']

start_urls = ['https://www.4567tv.tv/frim/index1.html']

# 通用url模板适用于非第一页

url = 'https://www.4567tv.tv/frim/index1-%d.html'page = 2

#电影名称(首页),简介(详情页)

defparse(self, response):

li_list = response.xpath('/html/body/div[1]/div/div/div/div[2]/ul/li')

for li inli_list:

name = li.xpath('./div/a/@title').extract_first()

detail_url = "https://www.4567tv.tv" + li.xpath('./div/a/@hreh').extract_first()

item =MovieproItem()

item['name'] =name

#对详情页的url发起get请求

# 请求传参:meta参数对应的字典就可以传递给请求对象中指定好的回调函数

yield scrapy.Request(url=detail_url,callback=self.detail_parse,meta={'item':item})

if self.page <= 5:

new_url = format(self.url%self.page)

self.page += 1

yield scrapy.Request(url=new_url,callback=self.parse)

# 解析详情页数据

defdetail_parse(self,response):

# 回调函数内部通过response.meta就可以接受到请求传参传递过来的字典

item = response.meta['item']

desc = response.xpath('html/body/div[1]/div/div/div/div[2]/p[5]/span[2]/text()').extract_first()

item['desc'] =desc

yielditem

------------------------------------------------------------------

# 2.items文件

importscrapy

classMovieproItem(scrapy.Item):

# define the fields for your item here like:

# name = scrapy.Field()

name =scrapy.Field()

desc =scrapy.Field()

-------------------------------------------------------------------

# 3.管道文件

classMovieproPipeline(object):

defprocess_item(self, item, spider):

print(item)

returnitem

-----------------------------------------------------------------

# 4.setting文件

BOT_NAME = 'moviePro'SPIDER_MODULES = ['moviePro.spiders']

NEWSPIDER_MODULE = 'moviePro.spiders'USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'ROBOTSTXT_OBEY =False

LOG_LEVEL = 'ERROR'ITEM_PIPELINES ={

'moviePro.pipelines.MovieproPipeline': 300,

}

3.中间件:下载中间件

框架图:

- 下载中间件的作用:批量拦截整个工程中发起的所有请求和相应

(1)引擎将请求传递给下载器过程中, 下载中间件可以对请求进行一系列处理。比如设置请求的 User-Agent,设置代理等

(2)在下载器完成将Response传递给引擎中,下载中间件可以对响应进行一系列处理。比如进行gzip解压等。

- 拦截请求:

- UA伪装:UA池

- 代理IP设置:代理池

- 拦截响应:

实例:

# 1.spider文件

importscrapy

classMiddleSpider(scrapy.Spider):

name = 'middle'

# allowed_domains = ['www.xxx.com']

start_urls = ['https://www.baidu.com/s?wd=ip']

defparse(self, response):

print(response)

----------------------------------------------------------------------------------------

# 2.items文件

importscrapy

classMiddlewearproItem(scrapy.Item):

pass

----------------------------------------------------------------------------------------

# 3.middlewares中间件文件

from scrapy importsignals

importrandom

# 批量拦截所有的请求和相应

classMiddlewearproDownloaderMiddleware(object):

# UA池

user_agent_list =[

"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 "

"(KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",

"Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 "

"(KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",

"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 "

"(KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",

"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 "

"(KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",

"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 "

"(KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",

"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 "

"(KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",

"Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 "

"(KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",

"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 "

"(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",

"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 "

"(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",

"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 "

"(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",

"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 "

"(KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",

"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 "

"(KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",

"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 "

"(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",

"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 "

"(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",

"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 "

"(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",

"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 "

"(KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",

"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 "

"(KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",

"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 "

"(KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"]

# 代理池

PROXY_http =[

'153.180.102.104:80',

'195.208.131.189:56055',

]

PROXY_https =[

'120.83.49.90:9000',

'95.189.112.214:35508',

]

# 拦截正常请求:request就是该方法拦截到的请求,spider就是爬虫类实例化的一个对象

defprocess_request(self, request, spider):

print('this is process_request')

# 设置UA伪装

request.headers['User-Agent'] =random.choice(self.user_agent_list)

returnNone

# 拦截所有的响应:request是被拦截到的response对应的请求,spider就是爬虫类实例化的一个对象

defprocess_response(self, request, response, spider):

returnresponse

# 拦截发生异常的请求对象

defprocess_exception(self, request, exception, spider):

print('this is process_exception')

# 代理IP的设定

if request.url.split(':')[0] == 'http':

request.meta['proxy'] =random.choice(self.PROXY_http)

else:

request.meta['proxy'] =random.choice(self.PROXY_https)

# 将修正后的请求对象重新进行请求发送

returnrequest

----------------------------------------------------------------------------------------

# 4.pipelines文件

classMiddlewearproPipeline(object):

defprocess_item(self, item, spider):

returnitem

----------------------------------------------------------------------------------------

# 5.setting文件

BOT_NAME = 'MiddlewearPro'SPIDER_MODULES = ['MiddlewearPro.spiders']

NEWSPIDER_MODULE = 'MiddlewearPro.spiders'LOG_LEVEL = 'ERROR'USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'ROBOTSTXT_OBEY =False

# 开启中间件

DOWNLOADER_MIDDLEWARES ={

'MiddlewearPro.middlewares.MiddlewearproDownloaderMiddleware': 543,

}

python的scrapy爬虫模块间进行传参_python网络爬虫——scrapy核心组件介绍、请求传参、下载中间件...相关推荐

  1. python网络爬虫与信息提取_北京理工大学_Python网络爬虫与信息提取(一)

    学习 北京理工大学 嵩天 课程笔记 课程体系结构: 1.Requests框架:自动爬取HTML页面与自动网络请求提交 2.robots.txt:网络爬虫排除标准 3.BeautifulSoup框架:解 ...

  2. python网络爬虫的方法有几种_Python网络爬虫过程中5种网页去重方法简要介绍

    一般的,我们想抓取一个网站所有的URL,首先通过起始URL,之后通过网络爬虫提取出该网页中所有的URL链接,之后再对提取出来的每个URL进行爬取,提取出各个网页中的新一轮URL,以此类推.整体的感觉就 ...

  3. python爬虫抓取动态网页数据_python网络爬虫抓取ajax动态网页数据:以抓取KFC门店地址为例...

    一,尝试用BeautifulSoup抓取 先打开KFC网站门店列表页面:http://www.kfc.com.cn/kfccda/storelist/index.aspx 可以看到门店列表如下图: 打 ...

  4. python爬虫开发 从入门到实战_python网络爬虫从入门到实战开发

    1.简单的抓取网页 from urllib import request req=request.Request("http://www.baidu.com") response= ...

  5. python 爬虫论_Python网络爬虫(理论篇)

    欢迎关注公众号:Python爬虫数据分析挖掘,回复[开源源码]免费获取更多开源项目源码 网络爬虫的组成 网络爬虫由控制节点,爬虫节点,资源库构成. 网络爬虫的控制节点和爬虫节点的结构关系 控制节点(爬 ...

  6. python网络爬虫应用_python网络爬虫应用实战

    原标题:python网络爬虫应用实战 Python这门编程语言包罗万象,可以说掌握了python,除了一些特殊环境和高度的性能要求,你可以用它做任何事. Python作为一门脚本语言,它灵活.易用.易 ...

  7. python爬虫从入门到实践pdf百度云_PYTHON网络爬虫从入门到实践.pdf

    推荐序 推荐序二 前言 前言二 第1章网络爬虫入门 1.1为什么要学网络爬虫 1.1.1网络爬虫能带来什么好处 1.1.2能从网络上爬取什么数据 1.1.3应不应该学爬虫 1.2网络爬虫是否合法 1. ...

  8. 玩转python网络爬虫黄永祥pdf下载_Python网络爬虫从入门到实践pdf

    Python网络爬虫从入门到实践 内容简介 本书将介绍如何使用Python编写网络爬虫程序获取互联网上的大数据.本书包括三部分内容:基础部分.进阶部分和项目实践.基础部分(第1~6章)主要介绍爬虫的三 ...

  9. python网络爬虫与信息提取北京理工大学_Python网络爬虫与信息提取(一)

    Reference: 第一周 网络爬虫之规则 单元1:Requests库入门 1-1 Requests库的安装 1-2 Requests库的get()方法 1-3 爬取网页的通用代码框架 1-4 HT ...

  10. 爬虫基础(1)什么是网络爬虫

    文章目录 一. 认识网络爬虫 二. 网络爬虫的组成 三. 网络爬虫的类型 1. 通用网络爬虫 2. 聚焦网络爬虫 3. 增量式网络爬虫 4. 深层网络爬虫 (1)静态网页 (2)深层页面和表层页面 ( ...

最新文章

  1. Git问题Everything up-to-date解决
  2. NeHe教程Qt实现——lesson16
  3. 将TensorFlow模型变为pb——官方本身提供API,直接调用即可
  4. 查拉斯图拉的“没落”
  5. 深入理解JVM虚拟机(四):Class类文件结构(二)
  6. RTT时钟管理篇——阻塞延时和时基更新函数
  7. TOA定位算法性能仿真
  8. Java异常处理:如何写出“正确”但被编译器认为有语法错误的程序
  9. python刷今日头条阅读量_教你如何提高今日头条号推荐量阅读量播放量
  10. Visio怎么删掉已有部分图形
  11. 在linux中装多个mysql 服务(亲测有效)
  12. [杂]实用工具与链接
  13. DBN(深度置信网络)
  14. latex排版:合并表格的多行多列
  15. 拉卡拉支付——综合普惠金融科技平台
  16. matlab赌徒破产模型转移矩阵,[转载]【转】生成土地利用变化转移矩阵的方法
  17. Redis——Windows安装
  18. 移动跨平台技术方案总结
  19. springBoot将Service实现类交给spring容器管理的两种方法
  20. 自定义 FlowLayout流式布局搜索框 加 GreenDao存取搜索记录,使用RecyclerView展示

热门文章

  1. 螺钉 螺母 硬币三种物体的识别
  2. VB通用对话框commom dialog中关于filterindex的设置
  3. Unity与UE4引擎源码内使用到的第三方库的比较
  4. 解决 vscode 登录微软账户同步设置 出现“vscode.dev 关闭了连接“ 问题
  5. 存储基础(SATA、SCSI、RAID、SAN、SAS、FC)
  6. 全手动封装教程+SRS9.80102 文本教程(适合初学)
  7. java字符串替换一部分_字符串中部分字符替换
  8. 利用IE登陆windows 2003 的终端服务器
  9. Windows 7下可以使用的虚拟光驱软件
  10. 电脑故障维修判断指导大全