2011-11-26 13 views
5

Tôi đang cố gắng để cạo thesession.org để tạo bảng bao nhiêu lần mỗi giai điệu đã được thêm vào bộ ghi âm của memeber để tôi có thể tìm thấy một số phần phổ biến cần tìm hiểu. Tôi đã bắt đầu với hướng dẫn ngắn gọn here và tôi đang cố sửa đổi nó cho phù hợp với mục đích của mình. Vấn đề là mặc dù trang web thesession.org dường như có một số 10.390 giai điệu, scraper của tôi chỉ trả về dữ liệu trên 10 trong số đó (chỉ những cái trên http://www.thesession.org/tunes/index.php). Làm thế nào tôi có thể nhận được dữ liệu trên tất cả các giai điệu (hoặc hàng trăm xếp hạng hàng đầu)? Mọi lời khuyên sẽ được đánh giá cao.scrapy python dường như không nhận dữ liệu từ tất cả các URL có sẵn

Đây là những gì tôi đã có cho đến nay:

items.py

from scrapy.item import Item, Field 

class tuneItem(Item): 
    url = Field() 
    name1 = Field() 
    name2 = Field() 
    key = Field() 
    count = Field() 
    pass 

tune_spider.py

from scrapy.spider import BaseSpider 
from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
from scrapy.selector import HtmlXPathSelector 
from scrapy.item import Item 
from tutorial.items import tuneItem 
from scrapy.conf import settings 

class tunesSpider(CrawlSpider): 

    name = "irishtunes" 
    allowed_domains = ["thesession.org"] 
    start_urls = ["http://www.thesession.org/tunes"] 
    rules = [Rule(SgmlLinkExtractor(allow=['/display/\d+'], deny=['/members/','/recordings/','/index/','/display/\d+/.']), 'parse_tune')] 

    def parse_tune(self, response): 
     x = HtmlXPathSelector(response) 

     tune = tuneItem() 
     tune['url'] = response.url 
     tune['name1'] = x.select("//div[@id='details']//div[@class='box']/h1/text()").extract() 
     tune['name2'] = x.select("//div[@id='details']//div[@class='box']/h2/text()").extract() 
     tune['key'] = x.select("//div[@id='details']//div[@class='box']/p[1]/text()").extract() 
     tune['count'] = x.select("//div[@id='details']//div[@class='box']/p[3]/text()").re('\d+') 
     return tune 

Tôi chạy scraper bằng cách mở giao diện điều khiển của tôi, đi đến thư mục chứa tệp cfg của hướng dẫn và chạy scrapy crawl irishtunes --set FEED_URI=scraped_data.csv --set FEED_FORMAT=csv

Đây là những gì tôi nhận được:

C:\Users\BM\Desktop\scrape\tutorial>scrapy crawl irishtunes --set FEED_URI=scrap 
ed_data.csv --set FEED_FORMAT=csv 
2011-11-25 22:45:47-0800 [scrapy] INFO: Scrapy 0.14.0.2841 started (bot: tutoria 
l) 
2011-11-25 22:45:47-0800 [scrapy] DEBUG: Enabled extensions: FeedExporter, LogSt 
ats, TelnetConsole, CloseSpider, WebService, CoreStats, SpiderState 
2011-11-25 22:45:48-0800 [scrapy] DEBUG: Enabled downloader middlewares: HttpAut 
hMiddleware, DownloadTimeoutMiddleware, UserAgentMiddleware, RetryMiddleware, De 
faultHeadersMiddleware, RedirectMiddleware, CookiesMiddleware, HttpCompressionMi 
ddleware, ChunkedTransferMiddleware, DownloaderStats 
2011-11-25 22:45:48-0800 [scrapy] DEBUG: Enabled spider middlewares: HttpErrorMi 
ddleware, OffsiteMiddleware, RefererMiddleware, UrlLengthMiddleware, DepthMiddle 
ware 
2011-11-25 22:45:48-0800 [scrapy] DEBUG: Enabled item pipelines: 
2011-11-25 22:45:48-0800 [irishtunes] INFO: Spider opened 
2011-11-25 22:45:48-0800 [irishtunes] INFO: Crawled 0 pages (at 0 pages/min), sc 
raped 0 items (at 0 items/min) 
2011-11-25 22:45:48-0800 [scrapy] DEBUG: Telnet console listening on 0.0.0.0:602 
3 
2011-11-25 22:45:48-0800 [scrapy] DEBUG: Web service listening on 0.0.0.0:6080 
2011-11-25 22:45:48-0800 [irishtunes] DEBUG: Redirecting (301) to <GET http://ww 
w.thesession.org/tunes/> from <GET http://www.thesession.org/tunes> 
2011-11-25 22:45:48-0800 [irishtunes] DEBUG: Crawled (200) <GET http://www.these 
ssion.org/tunes/> (referer: None) 
2011-11-25 22:45:49-0800 [irishtunes] DEBUG: Crawled (200) <GET http://www.these 
ssion.org/tunes/display/11602> (referer: http://www.thesession.org/tunes/) 
2011-11-25 22:45:49-0800 [irishtunes] DEBUG: Scraped from <200 http://www.theses 
sion.org/tunes/display/11602> 
     {'count': [u'1'], 
     'key': [u'Key signature: Dmajor'], 
     'name1': [u"Brendan Begley's"], 
     'name2': [u'polka'], 
     'url': 'http://www.thesession.org/tunes/display/11602'} 
2011-11-25 22:45:49-0800 [irishtunes] DEBUG: Crawled (200) <GET http://www.these 
ssion.org/tunes/display/11593> (referer: http://www.thesession.org/tunes/) 
2011-11-25 22:45:49-0800 [irishtunes] DEBUG: Scraped from <200 http://www.theses 
sion.org/tunes/display/11593> 
     {'count': [u'3'], 
     'key': [u'Key signature: Amajor'], 
     'name1': [u'Carleton County Breakdown'], 
     'name2': [u'reel'], 
     'url': 'http://www.thesession.org/tunes/display/11593'} 
2011-11-25 22:45:49-0800 [irishtunes] DEBUG: Crawled (200) <GET http://www.these 
ssion.org/tunes/display/11597> (referer: http://www.thesession.org/tunes/) 
2011-11-25 22:45:49-0800 [irishtunes] DEBUG: Scraped from <200 http://www.theses 
sion.org/tunes/display/11597> 
     {'count': [u'3'], 
     'key': [u'Key signature: Dmajor'], 
     'name1': [u"Kasper's Rant"], 
     'name2': [u'hornpipe'], 
     'url': 'http://www.thesession.org/tunes/display/11597'} 
2011-11-25 22:45:49-0800 [irishtunes] DEBUG: Crawled (200) <GET http://www.these 
ssion.org/tunes/display/11594> (referer: http://www.thesession.org/tunes/) 
2011-11-25 22:45:49-0800 [irishtunes] DEBUG: Scraped from <200 http://www.theses 
sion.org/tunes/display/11594> 
     {'count': [u'5'], 
     'key': [u'Key signature: Gmajor'], 
     'name1': [u'The Full Of The Bag'], 
     'name2': [u'hornpipe'], 
     'url': 'http://www.thesession.org/tunes/display/11594'} 
2011-11-25 22:45:49-0800 [irishtunes] DEBUG: Crawled (200) <GET http://www.these 
ssion.org/tunes/display/11599> (referer: http://www.thesession.org/tunes/) 
2011-11-25 22:45:49-0800 [irishtunes] DEBUG: Scraped from <200 http://www.theses 
sion.org/tunes/display/11599> 
     {'count': [u'1'], 
     'key': [u'Key signature: Adorian'], 
     'name1': [u'The New Steamboat'], 
     'name2': [u'reel'], 
     'url': 'http://www.thesession.org/tunes/display/11599'} 
2011-11-25 22:45:49-0800 [irishtunes] DEBUG: Crawled (200) <GET http://www.these 
ssion.org/tunes/display/11598> (referer: http://www.thesession.org/tunes/) 
2011-11-25 22:45:49-0800 [irishtunes] DEBUG: Scraped from <200 http://www.theses 
sion.org/tunes/display/11598> 
     {'count': [u'4'], 
     'key': [u'Key signature: Gmajor'], 
     'name1': [u"Galen's Arrival"], 
     'name2': [u'reel'], 
     'url': 'http://www.thesession.org/tunes/display/11598'} 
2011-11-25 22:45:49-0800 [irishtunes] DEBUG: Crawled (200) <GET http://www.these 
ssion.org/tunes/display/11596> (referer: http://www.thesession.org/tunes/) 
2011-11-25 22:45:49-0800 [irishtunes] DEBUG: Scraped from <200 http://www.theses 
sion.org/tunes/display/11596> 
     {'count': [u'2'], 
     'key': [u'Key signature: Amixolydian'], 
     'name1': [u'Culloden Day'], 
     'name2': [u'strathspey'], 
     'url': 'http://www.thesession.org/tunes/display/11596'} 
2011-11-25 22:45:49-0800 [irishtunes] DEBUG: Crawled (200) <GET http://www.these 
ssion.org/tunes/display/11595> (referer: http://www.thesession.org/tunes/) 
2011-11-25 22:45:49-0800 [irishtunes] DEBUG: Scraped from <200 http://www.theses 
sion.org/tunes/display/11595> 
     {'count': [u'2'], 
     'key': [u'Key signature: Aminor'], 
     'name1': [u'Miss Sine Flemington'], 
     'name2': [u'barndance'], 
     'url': 'http://www.thesession.org/tunes/display/11595'} 
2011-11-25 22:45:49-0800 [irishtunes] DEBUG: Crawled (200) <GET http://www.these 
ssion.org/tunes/display/11600> (referer: http://www.thesession.org/tunes/) 
2011-11-25 22:45:49-0800 [irishtunes] DEBUG: Scraped from <200 http://www.theses 
sion.org/tunes/display/11600> 
     {'count': [u'2'], 
     'key': [u'Key signature: Dmajor'], 
     'name1': [u"Joan Martin's"], 
     'name2': [u'polka'], 
     'url': 'http://www.thesession.org/tunes/display/11600'} 
2011-11-25 22:45:49-0800 [irishtunes] DEBUG: Crawled (200) <GET http://www.these 
ssion.org/tunes/display/11601> (referer: http://www.thesession.org/tunes/) 
2011-11-25 22:45:49-0800 [irishtunes] DEBUG: Scraped from <200 http://www.theses 
sion.org/tunes/display/11601> 
     {'count': [u'2'], 
     'key': [u'Key signature: Gmajor'], 
     'name1': [u'My Time Inside 2005'], 
     'name2': [u'waltz'], 
     'url': 'http://www.thesession.org/tunes/display/11601'} 
2011-11-25 22:45:49-0800 [irishtunes] INFO: Closing spider (finished) 
2011-11-25 22:45:49-0800 [irishtunes] INFO: Stored csv feed (10 items) in: scrap 
ed_data.csv 
2011-11-25 22:45:49-0800 [irishtunes] INFO: Dumping spider stats: 
     {'downloader/request_bytes': 3655, 
     'downloader/request_count': 12, 
     'downloader/request_method_count/GET': 12, 
     'downloader/response_bytes': 31620, 
     'downloader/response_count': 12, 
     'downloader/response_status_count/200': 11, 
     'downloader/response_status_count/301': 1, 
     'finish_reason': 'finished', 
     'finish_time': datetime.datetime(2011, 11, 26, 6, 45, 49, 500000), 
     'item_scraped_count': 10, 
     'request_depth_max': 1, 
     'scheduler/memory_enqueued': 12, 
     'start_time': datetime.datetime(2011, 11, 26, 6, 45, 48, 10000)} 
2011-11-25 22:45:49-0800 [irishtunes] INFO: Spider closed (finished) 
2011-11-25 22:45:49-0800 [scrapy] INFO: Dumping global stats: 
     {} 

EDIT: Câu trả lời từ @reclosedev đã cho tôi trên đường. Đối với bất cứ ai tự hỏi về kết quả, đây là một bản chụp ...

(1) Phần lớn các giai điệu ít hơn 10 tunebooks viên

enter image description here

(2) Sự phổ biến của tất cả 10.379 giai điệu rằng tôi có thể cạo từ các trang web (được đo bằng bao nhiêu tunebooks họ đang ở) sau một phân phối điện rể

enter image description here

(3) Và đây là những giai điệu mà trong> 1000 tu nebooks trên trang web, hiển thị tên của các giai điệu hàng đầu xếp hạng và có bao nhiêu tunebooks họ đang có trong

enter image description here

+0

kết quả thú vị, nhưng bạn có thể đã tự cứu mình khỏi rắc rối: http://www.irishtune.info/session/tunes.php – alanng

Trả lời

5

Bạn cần phải thêm Rule, nó sẽ phân tách các liên kết đến tất cả các trang, và nhện sẽ follow nó:

rules = [ 
    ..., #your existing parse_tune rule 
    Rule(
     SgmlLinkExtractor(
      allow=('/index/new\?new_start=\d+',) 
     ), 
     follow=True, 
    ), 
] 

chỉnh sửa:

follow=True là không cần thiết, bởi vì callback=None nghĩa follow=True theo mặc định.

+0

Quy tắc dành cho liên kết để trích xuất (liên kết điều chỉnh) chứ không phải liên kết trang. – codersofthedark

+1

@dragosrsupercool Quy tắc không chỉ cho việc trích xuất mục, xem [ví dụ trong tài liệu Scrapy] (http://doc.scrapy.org/en/0.14/topics/spiders.html # crawlspider-example) – reclosedev

+0

Cảm ơn câu trả lời nhanh của bạn, điều đó dường như đã thực hiện thủ thuật một cách hoàn hảo. Tôi đã tìm ra chuỗi truy vấn nên đã là một phần của nó, nhưng tôi không biết làm thế nào để đưa nó vào con nhện. Cảm ơn một lần nữa. – Ben

0

Có thể có rất nhiều cách khác nhau, lemme gợi ý đơn giản nhất:

Chạy mã của bạn mười lần, thay thế start_urls hoặc vòng lặp nó như phạm vi (10,100,10)

http://www.thesession.org/tunes/index/new?new_start=10 
http://www.thesession.org/tunes/index/new?new_start=20 
http://www.thesession.org/tunes/index/new?new_start=30 
http://www.thesession.org/tunes/index/new?new_start=40 
http://www.thesession.org/tunes/index/new?new_start=50 
http://www.thesession.org/tunes/index/new?new_start=60 
http://www.thesession.org/tunes/index/new?new_start=70 
http://www.thesession.org/tunes/index/new?new_start=80 
http://www.thesession.org/tunes/index/new?new_start=90 
+1

Cảm ơn bạn đã gợi ý nhanh chóng, tôi có thể thấy logic của câu trả lời của bạn. @reclosedev có một câu trả lời đó là hiệu quả hơn mặc dù. – Ben