转载: https://www.cnblogs.com/laoqing前面介绍了scrapy的基本操作,下面介绍下scrapy爬虫的内部实现架构如下图
1、Spiders(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器)
2、Engine(引擎):负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。
3、Scheduler(调度器):它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。
4、Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理
5、ItemPipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方.
6、Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件。
7、Spider Middlewares(Spider中间件):你可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)。
Scrapy 爬虫整过处理的过程如下:

每一个用scrapy创建的爬虫项目都会生成一个middlewares.py文件,在这个文件中定义了两个处理中间件SpiderMiddleware和DownloaderMiddleware,这两个中间件分别负责请求前的过滤和请求后的response过滤。
上面介绍了基于scrapy的异步爬虫,下面介绍一下实时爬虫,也就是爬虫数据实时返回。
我们可以用requests+BeautifulSoup来进行实现。
Requests负责网页的请求,BeautifulSoup负责对请求完的网页进行网页解析。
下面的代码是一个爬取应用宝中理财类APP的名称的爬虫代码实现

# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
import time
class SyncCrawlSjqq(object):def parser(self,url):req = requests.get(url)soup = BeautifulSoup(req.text,"lxml")name_list = soup.find(class_='app-list clearfix')('li')names=[]for name in name_list:app_name = name.find('a',class_="name ofh").textnames.append(app_name)return names
if __name__ == '__main__':syncCrawlSjqq = SyncCrawlSjqq()t1 = time.time()url = "https://sj.qq.com/myapp/category.htm?orgame=1&categoryId=114"print(syncCrawlSjqq.parser(url))t2 = time.time()print('一般方法,总共耗时:%s' % (t2 - t1))

 

运行结果如下

D:\python\Python3\python.exe D:/project/python/zj_scrapy/zj_scrapy/SyncCrawlSjqq.py

['宜人贷借款', '大智慧', '中国建设银行', '同花顺手机炒股股票软件', '随手记理财记账', '平安金管家', '翼支付', '第一理财', '平安普惠', '51信用卡管家', '借贷宝', '卡牛信用管家', '省呗', '平安口袋银行', '拍拍贷借款', '简理财', '中国工商银行', 'PPmoney出借', '360借条', '京东金融', '招商银行', '云闪付', '腾讯自选股(腾讯官方炒股软件)', '鑫格理财', '中国银行手机银行', '风车理财', '招商银行掌上生活', '360贷款导航', '农行掌上银行', '现金巴士', '趣花分期', '挖财记账', '闪银', '极速现金侠', '小花钱包', '闪电借款', '光速贷款', '借花花贷款', '捷信金融', '分期乐']

一般方法,总共耗时:0.3410000801086426

Process finished with exit code 0

我们可以采用flask web 框架对上面的方法做一个http 服务,然后上面的爬虫就变成了http爬虫服务了。调用http服务后,服务实时返回爬取的数据给http请求调用方,示例参考代码如下:

# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
from flask import Flask, request, Response
import json
app = Flask(__name__)
class SyncCrawlSjqq(object):def parser(self,url):req = requests.get(url)soup = BeautifulSoup(req.text,"lxml")name_list = soup.find(class_='app-list clearfix')('li')names=[]for name in name_list:app_name = name.find('a',class_="name ofh").textnames.append(app_name)return names
@app.route('/getSyncCrawlSjqqResult',methods = ['GET'])
def getSyncCrawlSjqqResult():syncCrawlSjqq=SyncCrawlSjqq()return Response(json.dumps(syncCrawlSjqq.parser(request.args.get("url"))),mimetype="application/json")
if __name__ == '__main__':app.run(port=3001,host='0.0.0.0',threaded=True)#app.run(port=3001,host='0.0.0.0',processes=3)

并发方法可以使用多线程来加速一般方法,我们使用的并发模块为concurrent.futures模块,设置多线程的个数为20个(实际不一定能达到,视计算机而定)。实现的示例代码如下:

# -*- coding: utf-8 -*-
from concurrent.futures import ThreadPoolExecutor, wait, ALL_COMPLETEDimport requests
from bs4 import BeautifulSoup
import time
class SyncCrawlSjqqMultiProcessing(object):def parser(self,url):req = requests.get(url)soup = BeautifulSoup(req.text,"lxml")name_list = soup.find(class_='app-list clearfix')('li')names=[]for name in name_list:app_name = name.find('a',class_="name ofh").textnames.append(app_name)return names
if __name__ == '__main__':url = "https://sj.qq.com/myapp/category.htm?orgame=1&categoryId=114"executor = ThreadPoolExecutor(max_workers=20)syncCrawlSjqqMultiProcessing = SyncCrawlSjqqMultiProcessing()t1 = time.time()future_tasks=[executor.submit(print(syncCrawlSjqqMultiProcessing.parser(url)))]wait(future_tasks, return_when=ALL_COMPLETED)t2 = time.time()print('一般方法,总共耗时:%s' % (t2 - t1))

运行结果如下:

D:\python\Python3\python.exe D:/project/python/zj_scrapy/zj_scrapy/SyncCrawlSjqqMultiProcessing.py

['宜人贷借款', '大智慧', '中国建设银行', '同花顺手机炒股股票软件', '随手记理财记账', '平安金管家', '翼支付', '第一理财', '平安普惠', '51信用卡管家', '借贷宝', '卡牛信用管家', '省呗', '平安口袋银行', '拍拍贷借款', '简理财', '中国工商银行', 'PPmoney出借', '360借条', '京东金融', '招商银行', '云闪付', '腾讯自选股(腾讯官方炒股软件)', '鑫格理财', '中国银行手机银行', '风车理财', '招商银行掌上生活', '360贷款导航', '农行掌上银行', '现金巴士', '趣花分期', '挖财记账', '闪银', '极速现金侠', '小花钱包', '闪电借款', '光速贷款', '借花花贷款', '捷信金融', '分期乐']

一般方法,总共耗时:0.3950002193450928

Process finished with exit code 0

比如单线程运行,多线程在爬虫时明显会要快很多。

转载于:https://www.cnblogs.com/xingxia/p/python_architecture2.html

爬虫平台的架构实现和框架的选型(二)相关推荐

  1. 关于爬虫平台的架构实现和框架的选型(二)--scrapy的内部实现以及实时爬虫的实现...

    我们接着关于爬虫平台的架构实现和框架的选型(一)继续来讲爬虫框架的架构实现和框架的选型. 前面介绍了scrapy的基本操作,下面介绍下scrapy爬虫的内部实现架构如下图 1.Spiders(爬虫): ...

  2. 爬虫平台的架构实现和框架的选型

    点击上方 "程序员小乐"关注公众号, 星标或置顶一起成长 每天早上8点20分, 第一时间与你相约 每日英文 It has not been the time yet to give ...

  3. 关于爬虫平台的架构设计实现和框架的选型(二)--scrapy的内部实现以及实时爬虫的实现

    我们接着关于爬虫平台的架构设计实现和框架的选型(一)继续来讲爬虫框架的架构实现和框架的选型. 前面介绍了scrapy的基本操作,下面介绍下scrapy爬虫的内部实现架构如下图 1.Spiders(爬虫 ...

  4. 如何构建一个通用的垂直爬虫平台?

    阅读本文大约需要15~20分钟. 本文章内容较多,非常干货!如果手机阅读体验不好,建议先收藏后到 PC 端阅读. 之前做爬虫时,在公司设计开发了一个通用的垂直爬虫平台,后来在公司做了内部的技术分享,这 ...

  5. 电商平台技术架构 多用户商城 仿天猫 淘宝 亚马逊 当当 阿里巴巴 大数据模块 低成本运维 高效开发...

    电商平台多用户商城系统架构行业现状 浏览全球知名电商机构(天猫 淘宝 亚马逊 当当 阿里巴巴...),包括开源电商软件(Magento.OpenCart.Xcart.Zencart.Prestasho ...

  6. 端云一体人工智能开发平台整体架构

    端云一体人工智能开发平台整体架构 引言 当前人工智能(Artificial Intelligence)技术发展迅猛,在机器视觉.语音识别以及自然语言处理等多个技术领域取得了卓越的进展,带来了更高的精确 ...

  7. GPS部标平台的架构设计(十)-基于Asp.NET MVC构建GPS部标平台

    在当前很多的GPS平台当中,有很多是基于asp.NET+siverlight开发的遗留项目,代码混乱而又难以维护,各种耦合和关联,要命的是界面也没见到比Javascript做的控件有多好看,随着需求的 ...

  8. 汽车之家机器学习平台的架构与实践

    导读:汽车之家机器学习平台是为算法工程师打造的一站式机器学习服务平台,集数据导入.数据处理.模型开发.模型训练.模型评估.服务上线等功能于一体,提供一站式全方位的机器学习建模流程,快速打造智能业务.本 ...

  9. 微服务架构的基础框架选择:Spring Cloud还是Dubbo?

    最近一段时间不论互联网还是传统行业,凡是涉及信息技术范畴的圈子几乎都在讨论微服务架构.近期也看到各大技术社区开始组织一些沙龙和论坛来分享Spring Cloud的相关实施经验,这对于最近正在整理Spr ...

最新文章

  1. Leangoo卡片和列表完成状态上线
  2. 手机QQ会员H5加速方案——sonic技术内幕
  3. 6翻了C语言,《嗨翻C语言》随书练习六 6章 二叉树简单例子
  4. sublime text2 用ctags插件实现方法定位(转)
  5. python 运行日志logging代替方案
  6. 虚拟服务器问题,虚拟主机常见的五大问题
  7. CANN5.0黑科技解密 | 别眨眼,缩小隧道,让你的AI模型“身轻如燕”
  8. webapi实现AJAX多文件上传,AJAX调用webapi上传图片或文件
  9. Linux 下源代码阅读工具 —— vim + TagList + CTags
  10. Spark 云计算 ML 机器学习教程 以及 SPARK使用教程
  11. [NOI2016]优秀的拆分
  12. python实现ftp_python实现ftp(客户端)
  13. 中小型企业网络IP地址规划案例-1
  14. Leetcode 36:有效的数独(超详细的解法!!!)
  15. springBoot的mcv(视图)控制
  16. 苹果手机php如何解压,在PHP中使用gzcompress;需要能够在iPhone上解压缩
  17. 中国车用轴承行业市场发展分析与投资战略研究报告2022-2028年
  18. Sonya and Exhibition 【模拟】
  19. H5 3d立体相册 CSS3特性
  20. 为什么不建议你吃精致碳水,这里有你需要的答案

热门文章

  1. 实操自动生成接口自动化测试用例
  2. 报时功能_聆听时间之韵——百达翡丽推出全新大自鸣功能报时腕表
  3. 艾永亮:通过微信和QQ的交互对比,谈超级产品是如何诞生的
  4. SQL数据库字符串与时间相互转换
  5. 多智能体强化学习论文——HAMA(AAAI 2020)
  6. 惠普打印共享器 hp usb network print adapter 驱动程序软件
  7. 工商银行APP流水申请
  8. 你会查列车的信用吗?
  9. freemarker生成word文档 文档打不开
  10. 【免杀前置课——Windows编程】十三、事件与信号量——事件与互斥体区别、操纵信号量实现游戏多开访问控制(附代码)