मैं scrapy
का उपयोग कर एक बहुत ही सरल वेब स्क्रैपर के साथ 23770 वेबपृष्ठों को स्क्रैप कर रहा हूं। मैं स्केपर और यहां तक कि अजगर के लिए काफी नया हूं, लेकिन नौकरी करने वाले मकड़ी को लिखने में कामयाब रहा। हालांकि, यह वास्तव में धीमा है (23770 पृष्ठों को क्रॉल करने में लगभग 28 घंटे लगते हैं)।वेब स्क्रैपर को गति दें
मैंने scrapy
वेबपृष्ठ और मेलिंग सूचियों और stackoverflow
पर देखा है, लेकिन मुझे शुरुआती लोगों के लिए समझने योग्य तेज़ क्रॉलर लिखने के लिए सामान्य अनुशंसाएं नहीं मिल रही हैं। शायद मेरी समस्या मकड़ी नहीं है, लेकिन जिस तरह से मैं इसे चलाता हूं। सभी सुझावों का स्वागत है!
यदि आवश्यक हो तो मैंने नीचे अपना कोड सूचीबद्ध किया है।
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from scrapy.item import Item, Field
import re
class Sale(Item):
Adresse = Field()
Pris = Field()
Salgsdato = Field()
SalgsType = Field()
KvmPris = Field()
Rum = Field()
Postnummer = Field()
Boligtype = Field()
Kvm = Field()
Bygget = Field()
class HouseSpider(BaseSpider):
name = 'House'
allowed_domains = ["http://boliga.dk/"]
start_urls = ['http://www.boliga.dk/salg/resultater?so=1&type=Villa&type=Ejerlejlighed&type=R%%C3%%A6kkehus&kom=&amt=&fraPostnr=&tilPostnr=&iPostnr=&gade=&min=&max=&byggetMin=&byggetMax=&minRooms=&maxRooms=&minSize=&maxSize=&minsaledate=1992&maxsaledate=today&kode=&p=%d' %n for n in xrange(1, 23770, 1)]
def parse(self, response):
hxs = HtmlXPathSelector(response)
sites = hxs.select("id('searchresult')/tr")
items = []
for site in sites:
item = Sale()
item['Adresse'] = site.select("td[1]/a[1]/text()").extract()
item['Pris'] = site.select("td[2]/text()").extract()
item['Salgsdato'] = site.select("td[3]/text()").extract()
Temp = site.select("td[4]/text()").extract()
Temp = Temp[0]
m = re.search('\r\n\t\t\t\t\t(.+?)\r\n\t\t\t\t', Temp)
if m:
found = m.group(1)
item['SalgsType'] = found
else:
item['SalgsType'] = Temp
item['KvmPris'] = site.select("td[5]/text()").extract()
item['Rum'] = site.select("td[6]/text()").extract()
item['Postnummer'] = site.select("td[7]/text()").extract()
item['Boligtype'] = site.select("td[8]/text()").extract()
item['Kvm'] = site.select("td[9]/text()").extract()
item['Bygget'] = site.select("td[10]/text()").extract()
items.append(item)
return items
धन्यवाद!
पहली बात यह है कि आप इसके बारे में क्या कर सकते हैं, थ्रेड का उपयोग करना (मानक लाइब्रेरी दस्तावेज़ में प्रासंगिक इंफोस देखें), एक ही समय में 5/10 डाउनलोड चलाने के लिए, जो स्पष्ट रूप से एक बड़े निष्पादन समय में हो सकता है सुधार की। इसके अलावा, मुझे चीजों को तेज़ करने का कोई आसान तरीका नहीं दिखता है, क्योंकि आपका कोड सरल दिखता है। – michaelmeyer
@doukremt: धन्यवाद! मैंने प्रलेखन को देखा है, और यह मुझे इसके लिए आवश्यक चीज़ों के लिए बहुत आसान लगता है। क्या यह सही ढंग से समझा जाता है कि प्रत्येक कनेक्शन के लिए, मुझे 'thread.start_new_thread (parse) 'कॉल करना चाहिए? या क्या मुझे सिर्फ 23770 पृष्ठों को स्क्रैप करने वाले दो कनेक्शन मिलेंगे? – Mace
स्केपर वास्तव में async है, इसलिए यह वास्तव में समानांतर में डाउनलोड करता है (आप यह निर्धारित कर सकते हैं कि यह कितने समवर्ती अनुरोध करता है)। –