爬虫平台的架构实现和框架的选型
点击上方 "程序员小乐"关注公众号, 星标或置顶一起成长
每天早上8点20分, 第一时间与你相约
每日英文
It has not been the time yet to give up as long as you still feel it is not the end. I could cry for a thousand times if you promise me a happy ending.
只要心里还存着不甘心,就还不到放弃的时候。只要是喜剧收尾,过程你让我怎么哭都行。
每日掏心话
不是每一次努力都会有收获,但是,每一次收获都必须努力,这是一个不公平的不可逆转的命题。
来自:张永清 | 责编:乐乐
链接:cnblogs.com/laoqing
程序员小乐(ID:study_tech)第 639 次推文 图片来自网络
往日回顾:分享技术人学习有用的国外网站
正文
首先来看一下一个爬虫平台的设计,作为一个爬虫平台,需要支撑多种不同的爬虫方式,所以一般爬虫平台需要包括:
- 爬虫规则的维护,平台在接收到爬虫请求时,需要能按照匹配一定的规则去进行自动爬虫
- 爬虫的job调度器,平台需要能负责爬虫任务的调度,比如定时调度,轮询调度等。
- 爬虫可以包括异步的海量爬虫,也可以包括实时爬虫,异步爬虫指的是爬虫的数据不会实时返回,可能一个爬虫任务会执行很久。 实时爬虫指爬的数据要实时返回,这个就要求时间很短,一般适合少量数据的爬虫。
- 爬虫好的数据可以生成指定的文件,比如csv文件,json文件等,然后通过数据处理引擎做统一处理,比如csv文件可以通过数据交换落入大数据平台,或者爬虫好的数据也可以丢入kafka中,然后再通过流式处理任务(spark或者storm,flink)做爬虫数据的清洗和处理,处理完的数据,可以入到数据库中。
pip install scrapy
scrapy startproject zj_scrapy
cd zj_scrapy
scrapy genspider sjqq “sj.qq.com”
# -*- coding: utf-8 -*- # Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html import scrapy class ZjScrapyItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field() name = scrapy.Field()
pass
# -*- coding: utf-8 -*-
import scrapy
from scrapy.http import HtmlResponse from zj_scrapy.items import ZjScrapyItem class SjqqSpider(scrapy.Spider): name = 'sjqq' allowed_domains = ['sj.qq.com'] start_urls = ['https://sj.qq.com/myapp/category.htm?orgame=1&categoryId=114'] def parse(self, response:HtmlResponse): name_list = response.xpath('/html/body/div[3]/div[2]/ul/li') print("=============",response.headers)
for each in name_list: item = ZjScrapyItem() name = each.xpath('./div/div/a[1]/text()').extract() item['name'] = name[0]
yield item
pass
# -*- coding: utf-8 -*- # Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html class ZjScrapyPipeline(object):
def process_item(self, item, spider): print("+++++++++++++++++++",item['name']) print("-------------------",spider.cc)
return item
ITEM_PIPELINES = { 'zj_scrapy.pipelines.ZjScrapyPipeline': 300, }
FEED_EXPORT_ENCODING = 'utf-8'
# Configure maximum concurrent requests performed by Scrapy (default: 16) CONCURRENT_REQUESTS = 32
DEFAULT_REQUEST_HEADERS = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'en', }
class ZjScrapyPipeline(object):
def process_item(self, item, spider): print("+++++++++++++++++++",item['name']) print("-------------------",spider.cc)
return item
pip install scrapyd
pip install scrapyd-client
scrapyd-deploy <target> -p <project> --version <version>
curl http://localhost:6800/schedule.json -d project= zj_scrapy -d spider=sjqq
{ "node_name": "ZJPH-0321", "status": "ok", "jobid": "dd7f10aca76e11e99b656c4b90156b7e"
}
- setting (string, optional) –自定义爬虫settings
- jobid (string, optional) –jobid,之前启动过的spider,会有一个id,这个是可选参数
- _version (string, optional) –版本号,之前部署的时候的version,只能使用int数据类型,没指定,默认启动最新版本
project (string, required) –项目名
version (string, required) –项目版本,不填写则是当前时间戳
egg (file, required) –当前项目的egg文件
curl http://localhost:6800/addversion.json -F project=myproject -F version=r23 -F egg=@myproject.egg
project (string, required) –项目名
job (string, required) -jobid
curl http://localhost:6800/cancel.json -d project=myproject -d job=6487ec79947edab326d6db28a2d86511e8247444
curl http://localhost:6800/listprojects.json
project (string, required) –项目名
curl http://localhost:6800/listversions.json?project=myproject
project (string, required) –项目名
_version (string, optional) –版本号
$ curl http://localhost:6800/listspiders.json?project=myproject
project (string, option) - restrict results to project name
curl http://localhost:6800/listjobs.json?project=myproject | python -m json.tool
project (string, required) - the project name
version (string, required) - the project version
curl http://localhost:6800/delversion.json -d project=myproject -d version=r99
project (string, required) - the project name
curl http://localhost:6800/delproject.json -d project=myproject
# -*- coding: utf-8 -*-import requestsfrom bs4 import BeautifulSoupimport timeclass 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").text names.append(app_name)return namesif __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))
# -*- 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").text names.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)
欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,学习能力的提升上有新的认识,欢迎转发分享给更多人。
欢迎各位读者加入程序员小乐技术群,在公众号后台回复“加群”或者“学习”即可。
猜你还想看
GitHub 标星3.5W+,超实用技术面试手册,从工作申请、面试考题再到优势谈判
漫画:一位“坑人”的编程大师
Redis基础都不会,好意思出去面试?
Java提供的几种线程池
掌握 SpringMVC 运行原理,看这篇就对了!
爬虫平台的架构实现和框架的选型相关推荐
- 关于爬虫平台的架构实现和框架的选型(二)--scrapy的内部实现以及实时爬虫的实现...
我们接着关于爬虫平台的架构实现和框架的选型(一)继续来讲爬虫框架的架构实现和框架的选型. 前面介绍了scrapy的基本操作,下面介绍下scrapy爬虫的内部实现架构如下图 1.Spiders(爬虫): ...
- 爬虫平台的架构实现和框架的选型(二)
转载: https://www.cnblogs.com/laoqing前面介绍了scrapy的基本操作,下面介绍下scrapy爬虫的内部实现架构如下图 1.Spiders(爬虫):它负责处理所有Res ...
- 关于爬虫平台的架构设计实现和框架的选型(二)--scrapy的内部实现以及实时爬虫的实现
我们接着关于爬虫平台的架构设计实现和框架的选型(一)继续来讲爬虫框架的架构实现和框架的选型. 前面介绍了scrapy的基本操作,下面介绍下scrapy爬虫的内部实现架构如下图 1.Spiders(爬虫 ...
- 如何构建一个通用的垂直爬虫平台?
阅读本文大约需要15~20分钟. 本文章内容较多,非常干货!如果手机阅读体验不好,建议先收藏后到 PC 端阅读. 之前做爬虫时,在公司设计开发了一个通用的垂直爬虫平台,后来在公司做了内部的技术分享,这 ...
- 电商平台技术架构 多用户商城 仿天猫 淘宝 亚马逊 当当 阿里巴巴 大数据模块 低成本运维 高效开发...
电商平台多用户商城系统架构行业现状 浏览全球知名电商机构(天猫 淘宝 亚马逊 当当 阿里巴巴...),包括开源电商软件(Magento.OpenCart.Xcart.Zencart.Prestasho ...
- 端云一体人工智能开发平台整体架构
端云一体人工智能开发平台整体架构 引言 当前人工智能(Artificial Intelligence)技术发展迅猛,在机器视觉.语音识别以及自然语言处理等多个技术领域取得了卓越的进展,带来了更高的精确 ...
- GPS部标平台的架构设计(十)-基于Asp.NET MVC构建GPS部标平台
在当前很多的GPS平台当中,有很多是基于asp.NET+siverlight开发的遗留项目,代码混乱而又难以维护,各种耦合和关联,要命的是界面也没见到比Javascript做的控件有多好看,随着需求的 ...
- 汽车之家机器学习平台的架构与实践
导读:汽车之家机器学习平台是为算法工程师打造的一站式机器学习服务平台,集数据导入.数据处理.模型开发.模型训练.模型评估.服务上线等功能于一体,提供一站式全方位的机器学习建模流程,快速打造智能业务.本 ...
- 微服务架构的基础框架选择:Spring Cloud还是Dubbo?
最近一段时间不论互联网还是传统行业,凡是涉及信息技术范畴的圈子几乎都在讨论微服务架构.近期也看到各大技术社区开始组织一些沙龙和论坛来分享Spring Cloud的相关实施经验,这对于最近正在整理Spr ...
最新文章
- 目标检测 - YOLO9000 : Better, Faster, Stronger
- How to resolve unassigned shards in Elasticsearch——写得非常好
- java计算数组均值
- 如何在 Windows 10 上安装 WSL 2
- 2021十大金融科技趋势
- Deep3DBox论文解读
- 2019.2.18接口2
- 区块链 什么是DAPP
- [转] 常用Loss函数
- 《惢客创业日记》2020.03.16-31(周一) 国家有难,匹夫有责(三)
- 基于javaweb的驾校车辆教练预约系统ssm+Vue
- DASH NET(网速控制,可变)
- 计算机保存文件快捷键,保存快捷键是什么,保存文档的快捷键
- 从测试流程角度,对产品质量的一些总结思考
- 亲爱的程序猿们怎么找工作
- TabLayout的Indicator自定义宽度
- 软件工程_东师站_总结
- #35-【刷题】乐乐的方块
- java分支结构之switch
- R7-17 程序填空题2
热门文章
- 怎样进行价值投资探讨
- 格斗游戏,每个游戏角色的姓名,血量,都不相同,在选定人物的时候(new对象的时候),这些信息就应该被确定下来。
- Visual Studio Code 配置 gcc
- 广西大学生计算机应用,我校学子在第十二届广西大学生计算机应用大赛中获奖-广西科技大学...
- 绝地求生服务器维护3月25日,绝地求生:3月25日停机维护五小时修复BUG,三周年在线57W...
- Java图形化界面编程一
- 只看参数 松下S1/S1R能否算是“最强微单”?
- HR告诉你10种面试被拒的行为
- Vivado使用指南之:二、如何使用VIVADO 在线逻辑分析仪
- 格式化字符串 - Formatter