flask服务器 + 协程 + 爬虫 + ui自动化
公司有个爬取的需求,要求持续性爬取,需要永久性地挂载到目标网站上,每天爬一次里面的数据。数据有下载表格的,我通过ui自动化点击拿到数据;还有一部分数据是几乎所有的图片信息,信息量近百万,这部分用scrapy。最后,决定什么时候爬取,爬取哪一天的,要通过请求来处理,所以需要搭建一个服务器,这个我用的flask。开始服务器监听,同时启动ui自动化挂载,这个用到协程。
一.flask + 协程
总的逻辑在这里。
from gevent import monkey
monkey.patch_all()
from spy_oo.spiders.oo_ui import UI
import queue
from flask import Flask, request
import gevent
from scrapy import cmdline que = queue.Queue() def ui():
op = UI()
while True:
if not que.empty():
k_v = que.get().split("=")
if len(k_v) == 2:
type_, date_ = k_v
else:
type_, date_ = '', ''
print("爬取类型为:%s,日期为:%s" % (type_, date_))
if "spy" in type_:
print("爬取中...")
cmdline.execute('scrapy crawl oppo'.split())
elif "dow" in type_:
print("下载中...")
op.download()
else:
op.hang_out() def server():
app = Flask(__name__) @app.route("/***")
def logic1():
arg = str(request.query_string, encoding="utf-8")
if arg:
que.put(arg)
else:
arg = 'query string missing, exp:dow=12'
return str(arg) app.run(debug=True, use_reloader=False) if __name__ == '__main__':
g1 = gevent.spawn(ui)
g2 = gevent.spawn(server)
g1.join()
g2.join() # server = pywsgi.WSGIServer(('127.0.0.1', 5000), app.run(debug=True))
# server.serve_forever()
二. 分-爬虫
scrapy爬取。这是spider的部分,也是爬取的核心代码。
import scrapy
import json
from jsonpath import jsonpath
from . import url, data, oppo_cookies, service_id
from ..items import SpyOoItem class Spider(scrapy.Spider):
"""
default data
"""
name = '***'
allowed_domains = ['***']
start_urls = ['***', ] def start_requests(self):
"""
get response
"""
for s_id in service_id.values():
data["service_id"] = str(s_id)
yield scrapy.FormRequest(
url=url,
formdata=data,
cookies=oppo_cookies,
callback=self.parse
) def parse(self, response):
"""
parse the message from response
""" # extract message from response
s = json.loads(response.text)
name_ = jsonpath(s, '$..list[0].service_name')[0]
pics_id = jsonpath(s, '$..list[*].pic_info[0].magazine_id')
pics_name = jsonpath(s, '$..list[*].magazine_name')
play_start_time = jsonpath(s, '$..list[*].play_start_time')
create_time = jsonpath(s, '$..list[*].pic_info[0].create_time') # mapping the value and yield it
for a, b, c, d in zip(pics_id, pics_name, play_start_time, create_time):
item = SpyOppoItem()
item["service_name"] = name_
item["id"] = a
item["name"] = b
item["play_time"] = c
item["upload_time"] = d
yield item
三. 分-ui自动化
界面的爬取用ui自动化,全用seliky库完成,由于标签元素属于目标网站的信息,不便于展示,这部分较简单,相信大家都会。可以在我的自动化的专栏里学seliky的操作。
flask服务器 + 协程 + 爬虫 + ui自动化的更多相关文章
- 小爬爬4.协程基本用法&&多任务异步协程爬虫示例(大数据量)
1.测试学习 (2)单线程: from time import sleep import time def request(url): print('正在请求:',url) sleep() print ...
- Web服务器-并发服务器-协程 (3.4.2)
@ 目录 1.分析 2.代码 关于作者 1.分析 随着网站的用户量越来愈多,通过多进程多线程的会力不从心 使用协程可以缓解这一问题 只要使用gevent实现 2.代码 from socket impo ...
- Python用yield form 实现异步协程爬虫
很古老的用法了,现在大多用的aiohttp库实现,这篇记录仅仅用做个人的协程底层实现的学习. 争取用看得懂的字来描述问题. 1.什么是yield 如果还没有怎么用过的话,直接把yield看做成一种特殊 ...
- python爬虫--多任务异步协程, 快点,在快点......
多任务异步协程asyncio 特殊函数: - 就是async关键字修饰的一个函数的定义 - 特殊之处: - 特殊函数被调用后会返回一个协程对象 - 特殊函数调用后内部的程序语句没有被立即执行 - 协程 ...
- 用python实现自己的http服务器——多进程、多线程、协程、单进程非堵塞版、epoll版
了解http协议 http请求头 GET / HTTP/1.1 Host: www.baidu.com Connection: keep-alive Pragma: no-cache Cache-Co ...
- Swoole 中使用 TCP 异步服务器、TCP 协程服务器、TCP 同步客户端、TCP 协程客户端
TCP 异步风格服务器 异步风格服务器通过监听事件的方式来编写程序.当对应的事件发生时底层会主动回调指定的函数. 由于默认开启协程化,在回调函数内部会自动创建协程,遇到 IO 会产生协程调度,异步风格 ...
- python 并发专题(六):协程相关函数以及实现(gevent)
文档资源 http://sdiehl.github.io/gevent-tutorial/ 一.协程实现 线程和协程 既然我们上面也说了,协程也被称为微线程,下面对比一下协程和线程: 线程之间需要上下 ...
- 什么是协程?与线程和进程对比优劣在哪?gevent协程示例代码
协程 协程,又称微线程,纤程.英文名Coroutine..一句话说明什么是线程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在 ...
- concurrent.futures进线程池和协程
concurrent.futures 异步执行进程线程池的模块,一个抽象类,定义submit,map,shutdown方法 from concurrent.futures import Process ...
- Python学习---协程 1226
协程[是一个单线程],又称微线程,纤程.英文名Coroutine. 一句话说明什么是协程:协程是一种用户态的轻量级线程[程序员自己去切换线程] 协程条件: 必须在只有一个单线程里实现并发 修改共享数据 ...
随机推荐
- Jmeter启动报错: ANOMALY: use of REX.w is meaningless (default operand size is 64), Unrecognized option: --add-opens
摘要:需要远程到其他电脑,把本机的jmeter打包发到远程的电脑上,启动jmeter时报错如下: 原因分析:第一反应无法创建java虚拟机我以为是没有JDK,通过CMD Java -version ...
- Visual Studio高版本 ArcObject for .Net 低版本
在基于ArcGIS的开发中,经常会存在Visual Studio版本高,ArcObject for .Net 版本低的问题.例如Visual Studio 2015的环境下,安装ArcObject f ...
- 【Shell案例】【!~//、grep反向查找、sed流编辑器】13、去掉所有包含this的句子
描述写一个 bash脚本以实现一个需求,去掉输入中含有this的语句,把不含this的语句输出示例:假设输入如下:that is your bagis this your bag?to the deg ...
- 【Java SE】Day04 IDEA、方法*
一.IDEA 1.快捷键 Ctrl+Alt+L/Ctrl+Alt+Shift+4:格式化代码 Alt+Insert:自动生成代码 修改快捷键:File->Settings->keymap- ...
- 深刻理解JAVA并发中的有序性问题和解决之道
欢迎关注专栏[JAVA并发] 更多技术干活尽在个人公众号--JAVA旭阳 问题 Java并发情况下总是会遇到各种意向不到的问题,比如下面的代码: int num = 0; boolean ready ...
- 跳出foreach循环
直接return false没用,需要用throw来跳出foreach 1 try { 2 this.categoryList.forEach((item, index) => { 3 if ( ...
- Android-helloword
环境早已配置完毕,就是后来选择API的时候出现了一点问题,唉,追求时尚,选择最新版本的API,结果就悲剧了,跑不起来,也找不到原因.后来换成Android 4.22 17API Level就行了... ...
- golang在win10安装、环境配置 和 goland(IDE开发golang配置)
前言 本人在使用goland软件开发go时,对于goland软件配置网上资料少,为了方便自己遗忘.也为了希望和我一样的小白能够更好的使用,所以就写下这篇博客,废话不多说开考. 一.查看自己电脑系统版本 ...
- 记一次在CentOS上安装GitLab的流程
1.本次环境说明 系统:Centos7.6 IP地址:http://192.168.3.213: 最低配置要求:2核心CPU和4G内存,这是因为[GitLab]的整体运行包含了多个进程 2.自行安装 ...
- 【转载】MSSQL汉字首字母查询处理自定义函数
-- 汉字首字母查询处理用户定义函数 CREATE FUNCTION f_GetPY(@str nvarchar(4000)) RETURNS nvarchar(4000) AS BEGIN DECL ...