ファインフェローのスタックオーバーフロー!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()
私のコードのマルチプロセッシングリクエストの解決策ではありませんが、あなたが正しいと思います。私はScrapyでそれを構築し始めましたが、まだ完全にテストして、それを改善したいと思っています。 しかし、提案をありがとう。 – KristoferM
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)。あなたの事件の近くに何かを見つけることができます) –
ありがとうローマ、私はチェックします! – KristoferM