(私の英語のため申し訳ありませんが)、私はこのために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サイトを解析する別の方法があるかもしれませんか? もちろん、解析の速度が重要です。 回答ありがとうございます。