2014-12-06 15 views
5

Ich versuche, einfache Crawler mit Scrapy (scrapy.org) zu erstellen. Gemäß Beispiel item.php ist erlaubt. Wie kann ich eine Regel schreiben, die URL erlaubt, die immer mit http://example.com/category/ beginnen, aber in GET Parameter page sollte dort mit irgendeiner Zahl der Stelle mit anderen Parametern sein. Die Reihenfolge dieser Parameter ist zufällig. Bitte helfen Wie kann ich eine solche Regel schreiben?Wie LinkExtractor Regel zu erstellen, die auf href in Scrapy

Nur wenige gültige Werte sind:

Es folgt der Code:

import scrapy 
from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.contrib.linkextractors import LinkExtractor 
class MySpider(CrawlSpider): 
name = 'example.com' 
allowed_domains = ['example.com'] 
start_urls = ['http://www.example.com/category/'] 

rules = (
    Rule(LinkExtractor(allow=('item\.php',)), callback='parse_item'), 
) 

def parse_item(self, response): 
    item = scrapy.Item() 
    item['id'] = response.xpath('//td[@id="item_id"]/text()').re(r'ID: (\d+)') 
    item['name'] = response.xpath('//td[@id="item_name"]/text()').extract() 
    item['description'] = response.xpath('//td[@id="item_description"]/text()').extract() 
    return item 

Antwort

4

-Test für http://example.com/category/ am Anfang des Strings und dem page Parameter mit einer oder mehreren Stellen in dem Wert:

Rule(LinkExtractor(allow=('^http://example.com/category/\?.*?(?=page=\d+)',)), callback='parse_item'), 

Demo (mit Ihrem Beispiel URLs):

>>> import re 
>>> pattern = re.compile(r'^http://example.com/category/\?.*?(?=page=\d+)') 
>>> should_match = [ 
...  'http://example.com/category/?sort=a-z&page=1', 
...  'http://example.com/category/?page=1&sort=a-z&cache=1', 
...  'http://example.com/category/?page=1&sort=a-z#' 
... ] 
>>> for url in should_match: 
...  print "Matches" if pattern.search(url) else "Doesn't match" 
... 
Matches 
Matches 
Matches 
-2

versuchen, wie diese

import re 
p = re.compile(ur'<[^>]+href="((http:\/\/example.com\/category\/)([^"]+))"', re.MULTILINE) 
test_str = u"<a class=\"youarehere\" href=\"http://example.com/category/?sort=newest\">newest</a>\n \n<a href=\"http://example.com/category/?sot=frequent\">frequent</a>" 

re.findall(p, test_str) 

live demo

Verwandte Themen