0

(私の英語のため申し訳ありませんが)、私はこのためにJSスクリプトの多くは、 が含ま私はセレン+ phantomjsが+ lxmlのを使用して、いくつかのウェブサイトのためのパーサを作りたい 。このパーサーは速く動作する必要があります。 1時間あたり1000以上のリンクが必要です。この目的のために、マルチ処理 (GILのためにスレッディングではありません)とモジュールFuture、ProcessExecutorPoolを使用します。Losеリンク(セレン/ phantomJS/ProcessPoolExecutor)

次の問題は、実行後に10リンクと5人の作業者からの入力リストに与えたときです。 いくつかのリンクが失われます。 1リンク以上(6まで! - 最大値ですがまれです)。これはもちろん悪い結果です。 プロセスの量が増えるにつれて、リンクの喪失量が増加するため、いくつかの依存関係があります。 まずは、プログラムの破損箇所をトレースします。 (assertはマルチプロセッシングのため正しく動作しません) プログラムが文字列 "browser.get(l)"の後で改行されています。それから、time.sleep(x)を入れます。ページをダウンロードするには、少し時間をください。 結果を与えない。それから、selenium.webdriver .... remote.webdriver.pyからリサーチ.get()を試してみましょう。remote.webdriver.py それはリロードします.execute() - この関数は非常に多くのパラメータを必要とし、それを発見します。 ..と同時に私は1つのプロセスのためのプログラムを実行しようと - と私は1つのリンクを失った。私は、 が、セレンとPhantomJSではなく、concurrent.futures.Future.ProcessExecutorPoolの代わりに マルチプロセッシングに問題があると思っていました。問題解決、リンクは失われませんが、プロセス量 - < = 4の場合、 ほとんど良いが、いくつかの時間は、新しいミス(プロセスの4 < =量を設定すると、このミスが表示されます)appeares:

""" 
multiprocessing.pool.RemoteTraceback: 
Traceback (most recent call last): 
File "/usr/lib/python3.4/multiprocessing/pool.py", line 119, in worker 
    result = (True, func(*args, **kwds)) 
File "/usr/lib/python3.4/multiprocessing/pool.py", line 44, in mapstar 
    return list(map(*args)) 
File "interface.py", line 34, in hotline_to_mysql 
    w = Parse_hotline().browser_manipulation(link) 
File "/home/water/work/parsing/class_parser/parsing_classes.py", line 352, in browser_manipulation 
    browser.get(l) 
File "/usr/local/lib/python3.4/dist-packages/selenium/webdriver/remote/webdriver.py", line 247, in get 
    self.execute(Command.GET, {'url': url}) 
File "/usr/local/lib/python3.4/dist-packages/selenium/webdriver/remote/webdriver.py", line 233, in execute 
    response = self.command_executor.execute(driver_command, params) 
File "/usr/local/lib/python3.4/dist-packages/selenium/webdriver/remote/remote_connection.py", line 401, in execute 
    return self._request(command_info[0], url, body=data) 
File "/usr/local/lib/python3.4/dist-packages/selenium/webdriver/remote/remote_connection.py", line 471, in _request 
    resp = opener.open(request, timeout=self._timeout) 
File "/usr/lib/python3.4/urllib/request.py", line 463, in open 
    response = self._open(req, data) 
File "/usr/lib/python3.4/urllib/request.py", line 481, in _open 
    '_open', req) 
File "/usr/lib/python3.4/urllib/request.py", line 441, in _call_chain 
    result = func(*args) 
File "/usr/lib/python3.4/urllib/request.py", line 1210, in http_open 
    return self.do_open(http.client.HTTPConnection, req) 
File "/usr/lib/python3.4/urllib/request.py", line 1185, in do_open 
    r = h.getresponse() 
File "/usr/lib/python3.4/http/client.py", line 1171, in getresponse 
    response.begin() 
File "/usr/lib/python3.4/http/client.py", line 351, in begin 
    version, status, reason = self._read_status() 
File "/usr/lib/python3.4/http/client.py", line 321, in _read_status 
    raise BadStatusLine(line) 
http.client.BadStatusLine: '' 

The above exception was the direct cause of the following exception: 

Traceback (most recent call last): 
File "interface.py", line 69, in <module> 
    main() 
File "interface.py", line 63, in main 
    executor.map(hotline_to_mysql, link_list) 
File "/usr/lib/python3.4/multiprocessing/pool.py", line 260, in map 
    return self._map_async(func, iterable, mapstar, chunksize).get() 
File "/usr/lib/python3.4/multiprocessing/pool.py", line 599, in get 
    raise self._value 
http.client.BadStatusLine: '' 
""" 


import random 
import time 
import lxml.html as lh 
from selenium import webdriver 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities 
from multiprocessing import Pool 
from selenium.webdriver.common.keys import Keys 
from concurrent.futures import Future, ProcessPoolExecutor, ThreadPoolExecutor 
AMOUNT_PROCESS = 5 

def parse(h)->list: 
    # h - str, html of page 
    lxml_ = lh.document_fromstring(h) 
    name = lxml_.xpath('/html/body/div[2]/div[7]/div[6]/ul/li[1]/a/@title') 
    prices_ = (price.text_content().strip().replace('\xa0', ' ') 
       for price in lxml_.xpath('//*[@id="gotoshop-price"]')) 
    markets_ =(market.text_content().strip() for market in 
      lxml_.find_class('cell shop-title')) 
    wares = [[name[0], market, price] for (market, price) 
      in zip(markets_, prices_)] 
    return wares 


def browser_manipulation(l): 
    #options = [] 
    #options.append('--load-images=false') 
    #options.append('--proxy={}:{}'.format(host, port)) 
    #options.append('--proxy-type=http') 
    #options.append('--user-agent={}'.format(user_agent)) #тут хедеры рандомно 

    dcap = dict(DesiredCapabilities.PHANTOMJS) 
    #user agent takes from my config.py 
    dcap["phantomjs.page.settings.userAgent"] = (random.choice(USER_AGENT)) 
    browser = webdriver.PhantomJS(desired_capabilities=dcap) 
    #print(browser) 
    #print('~~~~~~', l) 
    #browser.implicitly_wait(20) 
    #browser.set_page_load_timeout(80) 
    #time.sleep(2) 
    browser.get(l) 
    time.sleep(20) 
    result = parse(browser.page_source) 
    #print('++++++', result[0][0]) 
    browser.quit() 
    return result 

def main(): 
    #open some file with links 

    with open(sys.argv[1], 'r') as f: 
     link_list = [i.replace('\n', '') for i in f] 
    with Pool(AMOUNT_PROCESS) as executor: 
     executor.map(browser_manipulation, link_list) 

if __name__ == '__main__': 
    main() 

問題は(セレン+ phantomJS、ThreadPoolExecutor、私のコード)であるの?リンクが失われる理由 解析速度を上げるには? 最後に、セレン+ phantomjsを使わずに、Python上で動的Webサイトを解析する別の方法があるかもしれませんか? もちろん、解析の速度が重要です。 回答ありがとうございます。

答えて

0

私は、代わりにProcessPoolExecutor - ThreadPoolExecutorを試してみます。スレッド...ケースでは、プロセスとほぼ同じ速度です。

質問は実際には、これに関するいくつかの情報がある場合は、お書きください。ありがとう。

関連する問題