爬虫模块之解决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()

 

 

 

原文地址:https://www.cnblogs.com/fangjie0410/p/8277390.html

时间: 2024-10-31 16:46:51

爬虫模块之解决IO的相关文章

爬虫模块BeautifulSoup

中文文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html# 1.1      安装BeautifulSoup模块和解析器 1)         安装BeautifulSoup pip install beautifulsoup4 2)         安装解析器 pip install lxml pip install html5lib 1.2      对象种类 Tag :   标签对象,如:<p clas

python中关于不执行if __name__ == &#39;__main__&#39;:测试模块的解决

1.新建测试脚本文件: 2.编辑测试脚本 import unittest import requests import json import HTMLTestRunner ur1 = 'http://118.178.247.67:8081/systLogonUser/adminLogon.do' headers = {'Content-Type':'application/x-www-form-urlencoded','Referer':'118.178.247.67'} data = { '

Python_01_IP代理池_实现代理池的爬虫模块的执行方法

目标:根据配置问价内心戏,加载爬虫,抓取代理ip,进行校验,如果可用写入到数据库中 思路: 1.在run_spider.py中,创建RunSpider类 2.提供一个运行爬虫的run方法,作为运行爬虫的入口,实现核心的处理逻辑 根据配置文件信息,获取爬虫对象列表 遍历爬虫对象列表,获取爬虫对象,遍历爬虫对象的get_proxies方法,获取代理ip 检测代理ip 如果可用则写入数据库 处理异常,防止一个爬虫内部出错,影响其他爬虫的使用 3.使用异步来执行每一个爬虫任务,以提高抓取代理ip的效率

Zabbix安装时出现缺少PHP模块,解决过程

我在安装时PHP缺少gettext模块和bcmath模块:一下为解决步骤: 1.进入到PHP源码包目录下的ext目录: #cd  /soft/php-5.3.13/ext 2.会看到ext目录下有gettext目录和bcmath目录: 3.进入gettext目录,通过PHP进行编译: #cd gettext #/usr/local/services/php-5.3.13/bin/phpize #./configure --with-php-cofig=/usr/local/services/ph

Mac系统中python idle导入第三方模块成功,ecplise导入python第三方模块失败解决方法

遇到一个比较纠结了4个月的问题,一直没有在意,今天实在忍受不了,尝试各种解决办法,终于把这个烦人的问题完美解决,不敢独享,写出来和各位大神共享. 问题:在mac OSx操作系统下,安装了python第三方模块,MySQLdb.xlrt.xlwt.selenium等等,在python的idle中可以成功的import这些模块,但是在eclipse中缺始终无法导入,提示"no module named xxxx". 在网上和各个pythonQQ群中搜索各种解决方法,无果,群里还有个大神说苹

关于linux内核无法编译成模块的解决方法

在做驱动时,往往想编译成模块,让后加载来使用,这样灵活性较高,无需重新编译内核. 然后在使用供应商提供的内核时,往往无法编译成内核.也就是说把宏设置为y,编译进内核没有问题,但是设置成m编译成模块却不行.检查很多地方都不行,实际上这个问题很简单,可就这个简单的问题,搞了我一天,真心伤啊,这里做个记录做谨记. 解决的办法很简单,看看在执行内核make的时候是否添加了modules参数,如下面的形式: make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_C

用ByteArrayOutputStream解决IO流乱码问题

IO中用ByteArrayOutputStream解决乱码问题 --另一种解决乱码的方法 IO中另外一种防止乱码的方法:使用ByteArrayOutputStream在创建ByteArrayOutputStream时,会自动创建一个以自动增长的缓存区,当数据读取完后再一起统一写出来,就不会有乱码的问题了import java.io.ByteArrayOutputStream;import java.io.FileInputStream;import java.io.InputStream; pu

2,常用的爬虫模块及使用方法

Requests模块 发送请求 使用 Requests 发送网络请求非常简单. 一开始要导入 Requests 模块: >>> import requests 然后,尝试获取某个网页.本例子中,我们来获取 Github 的公共时间线: >>> r = requests.get('https://github.com/timeline.json') 现在,我们有一个名为 r 的 Response 对象.我们可以从这个对象中获取所有我们想要的信息. Requests 简便的

【select模块】select IO多路复用和select实现FTP

select是全平台通用的IO多路复用模块.最大连接数:1024. poll和epoll没有最大连接数限制,但只能用在linux平台. selectors是再封装模块,推荐使用.下篇会讨论. select.select(rlist, wlist, xlist[, timeout])? This is a straightforward interface to the Unix select() system call. The first three arguments are sequenc