2015-08-11 3 views
0

Было бы здорово, если бы кто-то мог помочь мне с многопоточным скриптом и написать вывод в текстовый файл. Я действительно новичок в кодировании, поэтому, пожалуйста, помогите мне.Python Может ли этот скрипт быть многопоточным?

#!/usr/bin/python 

from tornado import ioloop, httpclient 
from BeautifulSoup import BeautifulSoup 
from mechanize import Browser 
import requests 
import urllib2 
import socket 
import sys 

def handle_request(response): 
    print response.code 

global i 

i = 0 
i -= 1 
if i == 0: 
    http_client = httpclient.AsyncHTTPClient() 
for url in open('urls.txt'): 
    try: 
     br = Browser() 
     br.set_handle_robots(False) 
     res = br.open(url, None, 2.5) 
     data = res.get_data() 
     soup = BeautifulSoup(data) 
     title = soup.find('title') 
     if soup.title != None: 
      print url, title.renderContents(), '\n' 
     i += 1 
    except urllib2.URLError, e: 
     print "Oops, timed out?", '\n' 
    except socket.error,e: 
     print "Oops, timed out?", '\n' 
    except socket.timeout: 
     print "Oops, timed out?", '\n' 
print 'Processing of list completed, Cheers!!' 
sys.exit() 
try: 
    ioloop.IOLoop.instance().start() 
except KeyboardInterrupt: 
    ioloop.IOLoop.instance().stop() 

Я пытаюсь grep заголовок HTTP-списка списка хостов.

+0

Что вы пытались? :) – Eloims

+1

«Я новичок в кодировании» - вы, вероятно, не хотите погружаться в многопоточность, а затем – muddyfish

+0

Вам просто нужно зацикливать URL-адреса, потому что вы используете асинхронный запрос, который не будет блокировать вашу программу. Вы должны зарегистрировать обратный вызов, который вызывается, если ответ становится доступным 'http_client.fetch (url, request_callback_handler)'. – wenzul

ответ

2

Основная идея, которую вы уже реализовали это an non-blocking HTTP client.

def handle_request(response): 
    if response.error: 
     print "Error:", response.error 
    else: 
     print response.body 

for url in ["http://google.com", "http://twitter.com"]: 
    http_client = httpclient.AsyncHTTPClient() 
    http_client.fetch(url, handle_request) 

Вы могли бы перебирает ваших URL-адреса и обратный вызов будет вызван, как скоро respone для конкретного URL становится воевавшим.

Я бы не стал смешивать механизацию, ялооп, ... если не нужно.


Помимо этого, я рекомендую grequests. Это легкий инструмент, который удовлетворяет вашим требованиям.

import grequests 
from bs4 import BeautifulSoup 

urls = ['http://google.com', 'http://www.python.org/'] 

rs = (grequests.get(u) for u in urls) 
res = grequests.map(rs) 

for r in res: 
    soup = BeautifulSoup(r.text) 
    print "%s: %s" % (r.url, soup.title.text) 
+0

Не могли бы вы рассказать мне, как я могу применить это в своем коде?? Я хочу ускорить его, у меня около 4000 + хосты для сканирования. – iqzer0

+0

Мне удалось получить это из-за ошибок в работе с ошибками и ошибок из сценариев. Моя цель - захватить HTTP-заголовок списка IP-адресов (4000+ хостов) и вывести его в файл. – iqzer0

+0

@ iqzer0 Да, исходный код представляет собой сочетание результатов Google. Вы должны сохранить структуру в своем исходном коде и умом. – wenzul