2017-09-21 9 views
1

ファインフェローのスタックオーバーフロー!Python beautifulsoupのパフォーマンス、IDE、プールサイズ、マルチプロセッシングリクエスト.web-crawlerのためのget

Python(2日目)で新しく、美しいスープと悲しいことに、急いで少し。

私は、ファイルからストリート名を検索エンジン(merinfo_url)に取り込むクローラーを構築しました。適切な状況にある企業は、さらに掻き取られて輸出されます。

コードの完全なデバッグの混乱にもかかわらず、すべてが機能しているので、私は「急いでいる」です!私は今日、遠隔地のコンピュータで長いデバッグテストを始めるのが嫌です。私は5000ヒットで止まった。

しかし、パフォーマンスは低速です。 私はパーサーをlxmlに変更し、ローカルファイルを一度しか開くことができないと理解します。

私は今日それを実装したいと考えています。

マルチプロセッシングしかし、私は混乱します。私の最高の選択肢は何ですか、プールかいくつかの接続を開きますか?同じ呼び出しで2つの用語を使用していますか?

プールの大きさはどれくらいですか?スレッドごとに2つのアドバイスが多いようですが、ローカルマシンでは100個見たことがあります。どんな一般的なルールですか?

私は私の現在のコードでは何も変わらない場合は、wはここで私は、プールを実装しないと、要求はのオブジェクトに対して、どのように一般的にそれを行うのですか?

最後に、パフォーマンス面では頭の上にあり、ローカルマシン上で実行されているクローラをデバッグするための優れたIDEですか?

フィードバックに感謝します。

コード

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
import re 
import json 
import requests 
import urllib 
from bs4 import BeautifulSoup 
from time import sleep 
from sys import exit 
from multiprocessing import Pool 


def main(): 
    if __debug__: 
    print ("[debug] Instaellningar:") 
    print ("[debug] Antal anstaellda: "+(antal_anstaellda)) 
    print ("[debug] Omsaettning: "+(omsaettning)) 

    with open(save_file, 'wb') as filedescriptor: 
    filedescriptor.write('companyName,companySSN,companyAddressNo,companyZipCity,phoneNumber,phoneProvider,phoneNumberType\n') 

    lines = [line.rstrip('\n') for line in open(streetname_datfile)] 
    for adresssokparameter in lines: 

    searchparams = { 'emp': antal_anstaellda, 'rev': omsaettning, 'd': 'c', 'who': '', 'where': adresssokparameter, 'bf': '1' } 
    sokparametrar = urllib.urlencode(searchparams) 


    merinfo_url = merinfobaseurl+searchurl+sokparametrar 

    if __debug__: 
     print ("[debug] Antal requests gjorda till merinfo.se: "+str(numberOfRequestsCounter)) 
    crawla_merinfo(merinfo_url) 

     # Crawler 
    def crawla_merinfo(url): 

    if __debug__: 
    print ("[debug] crawl url: "+url) 
    global numberOfRequestsCounter 
    numberOfRequestsCounter += 1 
    merinfosearchresponse = requests.get(url, proxies=proxies) 
    if merinfosearchresponse.status_code == 429: 
    print ("[!] For manga sokningar, avslutar") 
    exit(1) 
    merinfosoup = BeautifulSoup(merinfosearchresponse.content, 'html.parser') 
    notfound = merinfosoup.find(string=merinfo404text) 
    if notfound == u"Din sokning gav tyvaerr ingen traeff. Prova att formulera om din sokning.": 
    if __debug__: 
     print ("[debug] [!] " + merinfo404text) 
    return 
    for merinfocompanycontent in merinfosoup.find_all('div', attrs={'class': 'result-company'}): 
    phonelink = merinfocompanycontent.find('a', attrs={'class': 'phone'}) 
    if phonelink == None: 
     # No numbers, do nothing 
     if __debug__: 
     print ("[!] Inget telefonnummer for foretaget") 
     return 
    else: 
     companywithphonenolink = merinfobaseurl+phonelink['href'] 
     thiscompanyphonenodict = crawla_merinfo_telefonnummer(companywithphonenolink) 
     companyName = merinfocompanycontent.find('h2', attrs={'class': 'name'}).find('a').string 
     companySSN = merinfocompanycontent.find('p', attrs={'class': 'ssn'}).string 
     companyAddress = merinfocompanycontent.find('p', attrs={'class': 'address'}).text 
     splitAddress = companyAddress.splitlines() 
     addressStreetNo = splitAddress[0] 
     addressZipCity = splitAddress[1] 
     addressStreetNo.encode('utf-8') 
     addressZipCity.encode('utf-8') 

     if __debug__: 
     print ("[debug] [*] Foretaget '"+companyName.encode('utf-8')+("' har telefonnummer...")) 
     for companyPhoneNumber in thiscompanyphonenodict.iterkeys(): 
     companyRow = companyName+","+companySSN+","+addressStreetNo+","+addressZipCity+","+thiscompanyphonenodict[companyPhoneNumber] 
     if __debug__: 
      print ("[debug] ::: "+thiscompanyphonenodict[companyPhoneNumber]) 
     with open(save_file, 'a') as filedescriptor: 
      filedescriptor.write(companyRow.encode('utf-8')+'\n') 
    return 

    #telephone crawl function 
    def crawla_merinfo_telefonnummer(url): 
    global numberOfRequestsCounter 
    numberOfRequestsCounter += 1 
    if __debug__: 
    print ("[debug] crawl telephone url: "+url) 
    phonenoDict = {} 
    s = requests.session() 
    merinfophonenoresponse = s.get(url, timeout=60) 
    merinfophonenosoup = BeautifulSoup(merinfophonenoresponse.content, 'html.parser') 
    merinfotokeninfo = merinfophonenosoup.find('meta', attrs={'name': '_token'}) 
    headers = { 
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 Edge/15.15063', 
    'X-Requested-With': 'XMLHttpRequest', 
    'Host': 'www.merinfo.se', 
    'Referer': url 
    } 
    headers['X-CSRF-TOKEN'] = merinfotokeninfo['content'] 
    headers['Cookie'] = 'merinfo_session='+s.cookies['merinfo_session']+';' 

    merinfophonetable = merinfophonenosoup.find('table', id='phonetable') 
    i = 0 
    for merinfophonenoentry in merinfophonetable.find_all('tr', id=True): 
    i += 1 
    phoneNumberID = merinfophonenoentry['id'] 
    phoneNumberPhoneNo = merinfophonenoentry['number'] 

    for phoneNumberColumn in merinfophonenoentry.find_all('td', attrs={'class':'col-xs-2'}): 
     phoneNumberType = phoneNumberColumn.next_element.string.replace(",",";") 
     phoneNumberType = phoneNumberType.rstrip('\n').lstrip('\n') 

    payload = { 
     'id': phoneNumberID, 
     'phonenumber': phoneNumberPhoneNo 
    } 
    r = s.post(ajaxurl, data=payload, headers=headers) 
    numberOfRequestsCounter += 1 
    if r.status_code != 200: 
    print ("[!] Error, response not HTTP 200 while querying AJAX carrier info.") 
    exit(1) 
    else: 
     carrierResponseDict = json.loads(r.text) 
     # print carrierResponseDict['operator'] 
     phoneNoString = phoneNumberPhoneNo+','+carrierResponseDict['operator']+','+phoneNumberType 
     phonenoDict['companyPhoneNo'+str(i)] = phoneNoString 
    return phonenoDict 

# Start main program 
main() 

答えて

0

あなたはScrapy程度Scrapy

One of the main advantages使用を開始する必要があります。リクエストは、スケジュールと非同期に処理されています。

これは、リクエストが完了して処理されるのを待つ必要がないことを意味し、その間に別のリクエストを送信したり他の処理を行うことができます。これは、リクエストが失敗した場合や、処理中にエラーが発生した場合でも、他のリクエストが続行できることを意味します。

+1

私のコードのマルチプロセッシングリクエストの解決策ではありませんが、あなたが正しいと思います。私はScrapyでそれを構築し始めましたが、まだ完全にテストして、それを改善したいと思っています。 しかし、提案をありがとう。 – KristoferM

+0

Dimitrios Kouzis-Loukasの書籍「Learning Scrapy」からの引用(https://books.google.ru/books?id=EF8dDAAAQBAJ&lpg=PP1&dq=Dimitrios%20Kouzis-Loukas%20Learning%20Scrapy%20Preface&pg=PR7#v= onepage&q = Dimitrios%20Kouzis-Loukas%20Learning%20Scrapy%20Preface&f = false)。あなたの事件の近くに何かを見つけることができます) –

+0

ありがとうローマ、私はチェックします! – KristoferM

関連する問題