爬虫模块之解决IO
一 asyncio模块
asyncio模块:主要是帮我们检测IO(只能是网路IO)。
@asyncio.coroutine:装饰器
tasks:任务列表
get_event_loop:起任务
run_until_complete:提交的方式,检测任务的执行
asgncio.gather(任务列表):直接执行任务
close:关闭任务
open_connection:建立链接
yield from:如果阻塞就切换到另外一个任务
sleep:模仿网络阻塞IO
write:将数据包准备好
send.drain:发送数据包
read:接收数据
# import asyncio
#
# @asyncio.coroutine
# def task(task_id,senconds):
# print('%s is runing' %task_id)
# yield from asyncio.sleep(senconds)
# print('%s is done' %task_id)
#
#
# tasks=[
# task(1,3),
# task(2,2),
# task(3,1)
# ]
#
# loop=asyncio.get_event_loop()
# loop.run_until_complete(asyncio.gather(*tasks))
# loop.close() #1、按照TCP:建立连接(IO阻塞)
#2、按照HTTP协议:url,请求方法,请求头,请求头
#3、发送Request请求(IO)
#4、接收Respone响应(IO)
import asyncio @asyncio.coroutine
def get_page(host,port=80,url='/'): #https:// www.baidu.com:80 /
print('GET:%s' %host)
recv,send=yield from asyncio.open_connection(host=host,port=port) http_pk="""GET %s HTTP/1.1\r\nHost:%s\r\n\r\n""" %(url,host)
send.write(http_pk.encode('utf-8')) yield from send.drain() text=yield from recv.read() print('host:%s size:%s' %(host,len(text))) #解析功能 #http://www.cnblogs.com/linhaifeng/articles/7806303.html
#https://wiki.python.org/moin/BeginnersGuide
#https://www.baidu.com/ tasks=[
get_page('www.cnblogs.com',url='/linhaifeng/articles/7806303.html'),
get_page('wiki.python.org',url='/moin/BeginnersGuide'),
get_page('www.baidu.com',),
] loop=asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(*tasks))
loop.close()
二 aiohttp模块
aiohttp.request:发送一个request请求
import asyncio
import aiohttp #pip3 install aiohttp @asyncio.coroutine
def get_page(url): #https:// www.baidu.com:80 /
print('GET:%s' %url)
response=yield from aiohttp.request('GET',url=url) data=yield from response.read() print('url:%s size:%s' %(url,len(data))) #http://www.cnblogs.com/linhaifeng/articles/7806303.html
#https://wiki.python.org/moin/BeginnersGuide
#https://www.baidu.com/ tasks=[
get_page('http://www.cnblogs.com/linhaifeng/articles/7806303.html'),
get_page('https://wiki.python.org/moin/BeginnersGuide'),
get_page('https://www.baidu.com/',),
] loop=asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(*tasks))
loop.close()
三 twisted模块
twisted:异步IO框架模块
getpage:发送请求
internet.reactor:
addCalllback:绑定回调函数
defer.DeferredList:
reactor.run:起循环来负责执行任务
addBoth:所有的任务都执行完毕过后执行的事,接收的参数是回调函数返回的结果
reactor.stop:终止程序的执行
'''
#问题一:error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools
https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
pip3 install C:\Users\Administrator\Downloads\Twisted-17.9.0-cp36-cp36m-win_amd64.whl
pip3 install twisted #问题二:ModuleNotFoundError: No module named 'win32api'
https://sourceforge.net/projects/pywin32/files/pywin32/ #问题三:openssl
pip3 install pyopenssl
''' #twisted基本用法
from twisted.web.client import getPage,defer
from twisted.internet import reactor def all_done(arg):
# print(arg)
reactor.stop() def callback(res):
print(res)
return 1 defer_list=[]
urls=[
'http://www.baidu.com',
'http://www.bing.com',
'https://www.python.org',
]
for url in urls:
obj=getPage(url.encode('utf=-8'),)
obj.addCallback(callback)
defer_list.append(obj) defer.DeferredList(defer_list).addBoth(all_done) reactor.run() #twisted的getPage的详细用法
from twisted.internet import reactor
from twisted.web.client import getPage
import urllib.parse def one_done(arg):
print(arg)
reactor.stop() post_data = urllib.parse.urlencode({'check_data': 'adf'})
post_data = bytes(post_data, encoding='utf8')
headers = {b'Content-Type': b'application/x-www-form-urlencoded'}
response = getPage(bytes('http://dig.chouti.com/login', encoding='utf8'),
method=bytes('POST', encoding='utf8'),
postdata=post_data,
cookies={},
headers=headers)
response.addBoth(one_done) reactor.run()
四 trnado模块
from tornado.httpclient import AsyncHTTPClient
from tornado.httpclient import HTTPRequest
from tornado import ioloop def handle_response(response):
"""
处理返回值内容(需要维护计数器,来停止IO循环),调用 ioloop.IOLoop.current().stop()
:param response:
:return:
"""
if response.error:
print("Error:", response.error)
else:
print(response.body) def func():
url_list = [
'http://www.baidu.com',
'http://www.bing.com',
]
for url in url_list:
print(url)
http_client = AsyncHTTPClient()
http_client.fetch(HTTPRequest(url), handle_response) ioloop.IOLoop.current().add_callback(func)
ioloop.IOLoop.current().start()
爬虫模块之解决IO的更多相关文章
- 采集爬虫中,解决网站限制IP的问题? - wendi_0506的专栏 - 博客频道 - CSDN.NET
采集爬虫中,解决网站限制IP的问题? - wendi_0506的专栏 - 博客频道 - CSDN.NET undefined
- IIS发布网站浏览之后看到的是文件目录 & Internal Server Error 处理程序“ExtensionlessUrlHandler-ISAPI-4.0_64bit”在其模块列表中有一个错误模块“IsapiModule” 解决方法 & App_global.asax.pduxejp_.dll”--“拒绝访问。 ”
Q:IIS发布网站浏览之后看到的是文件目录 A:它出现了一个说到.NET4.0 更高框架什么的错误,所以我将 .NTE CRL版本由4.0改为2.0了,改为2.0后就出现了只能浏览文件目录了.改为4. ...
- 爬虫模块BeautifulSoup
中文文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html# 1.1 安装BeautifulSoup模块 ...
- [代码]--IIS发布网站浏览之后看到的是文件目录 & Internal Server Error 处理程序“ExtensionlessUrlHandler-ISAPI-4.0_64bit”在其模块列表中有一个错误模块“IsapiModule” 解决方法 & App_global.asax.pduxejp_.dll”--“拒绝访问。 ”
Q:IIS发布网站浏览之后看到的是文件目录 A:它出现了一个说到.NET4.0 更高框架什么的错误,所以我将 .NTE CRL版本由4.0改为2.0了,改为2.0后就出现了只能浏览文件目录了.改为4. ...
- 通过开启子进程的方式实现套接字服务端可以并发的处理多个链接以及通讯循环(用到了subprocess模块,解决粘包问题)
今日作业:通过开启子进程的方式实现套接字服务端可以并发的处理多个链接以及通讯循环(用到了subprocess模块,解决粘包问题) server(服务端) import socket from mult ...
- python爬虫---单线程+多任务的异步协程,selenium爬虫模块的使用
python爬虫---单线程+多任务的异步协程,selenium爬虫模块的使用 一丶单线程+多任务的异步协程 特殊函数 # 如果一个函数的定义被async修饰后,则该函数就是一个特殊的函数 async ...
- win10执行Tensorflow,总是会报错“DLL load failed: 找不到指定的模块”的解决方式----终极版方式
win10上运行tensorflow时报错,“DLL load failed: 找不到指定的模块”的解决方式 我只想说,当你们遇到这个问题的时候,以下终极版的方式出来了,非常感谢知乎 leo lv ! ...
- Java 使用正则表达式和IO实现爬虫以及503解决
我这边找了个小说网站: 基本套路: 第一步:获取小说每一章的url地址 第二步:获取章节url内容并使用正则表达式提取需要的内容 第三步:多线程封装,实现如下效果 最后测试. 代码: 内容获取封装: ...
- 爬虫模块介绍--request(发送请求模块)
爬虫:可见即可爬 # 每个网站都有爬虫协议 基础爬虫需要使用到的三个模块 requests 模块 # 模拟发请求的模块 PS:python原来有两个模块urllib和urllib的升级urlli ...
随机推荐
- ceph 维护之 osd节点添加
一.目标 添加一台新osd 节点,主机名ceph6 到 ceph 集群.public IP:10.6.32.25 cluster_network :10.6.33.25 二.基础环境配置 1 ...
- Python memoryview() 函数
Python memoryview() 函数 Python 内置函数 描述 memoryview() 函数返回给定参数的内存查看对象(Momory view). 所谓内存查看对象,是指对支持缓冲区协 ...
- python中if not x: 和 if x is not None: 和 if not x is None的使用和区别
代码中经常会有变量是否为None的判断,有三种主要的写法: 第一种是`if x is None`: 第二种是 `if not x:`: 第三种是`if not x is None`(这句这样理解更清晰 ...
- cocoapods 更新本地仓库 pod setup/update 无限远程中断
升级 cocoapods 无限远程中断:网络不好 试了很多解决方法: 1.替换源,2.设置下载速度,3.清空本地master仓库,4.删了本地的pod库,5.半夜3-5点更新,6.按照失败提示的 (p ...
- zookeeper 单机版配置
zookeeper :中间件,为分布式系统进行协调服务 作用于分布式系统,可以为大数据服务 支持java 和 C 客户端的api zookeeper 特性:一致性,数据会按照顺序分批入库: 原子性:数 ...
- [z]protobuf实现c++与java之间的数据传递,beancopy数据到前台
[z]http://blog.csdn.net/xhyzdai/article/details/46684335 定义proto文件 option java_package = "com.w ...
- IE7下面踩得坑
bug1.position:fixed:z-index:99; 出现了z-index:2的层级跑到他上面了, 为什么?会出现这问题??? 检查: 1你的固定定位的容器是不是被其他容器包裹,你包裹得容器 ...
- 分享插件的使用加一个echart走数据
html部分: <div class="topLink clearfix bdsharebuttonbox bdshare-button-style0-16" data-b ...
- u-boot之NAND启动与NOR启动的区别
nand启动与nor启动的区别主要分为以下几部分说明: 1.nand flash与nor flash的最主要区别 2.s3c2440的nand启动与nor启动原理 3.nand启动与nor启动的时候u ...
- 安装SQL Server 2008,一直要求重启电脑的解决办法
1.运行注册表,cmd->regedit 2.然后找到 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Session Manager 在 ...