2012-12-13 34 views
4

我對Scrapy蜘蛛有一個疑問。假設我ahve這個代碼與Scrapy中的規則相混淆python spider

name = 'myspider' 
    allowed_domains = ['domain.com'] 
    start_urls = ['http://www.domain.com/foo/'] 

    rules = (
     Rule(SgmlLinkExtractor(allow=r'-\w+.html$'), callback='parse_item', follow=True), 
    ) 

    def parse_item(self, response): 
     hxs = HtmlXPathSelector(response) 

我想知道,這將蜘蛛先進入起始URL和解析的頁面,然後利用規則提取鏈接

或蜘蛛不解析第一頁但將開始與規則

我已經看到,如果我的規則不匹配,那麼我沒有得到任何結果,但至少不應該已經解析起始頁

+1

當您的規則不匹配時輸出是什麼樣的? – Talvalin

+0

命令行出現了一些文本,並說爬行的0頁。我從crawlspider延伸。我在想,蜘蛛怎麼會知道我會用'parse_item'函數,因爲那是我唯一的函數,而且這只是在規則中提到的。實際上,基地 – user1858027

回答

3

我的編碼樣本Michael Herman教程,https://github.com/mjhea0/Scrapy-Samples,其中b依靠BaseSpider示例並進展到CrawlSpider示例。第一個例子沒什麼大不了的,但第二個例子並沒有抓到第一頁 - 只有第二頁 - 我不知道我做錯了什麼。但是,當我從github運行代碼時,我意識到他的代碼並不是抓取第一頁!我想它是與CrawlSpider的意圖VS BaseSpider並做了一些研究之後,我想出了這個:

from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
from scrapy.selector import HtmlXPathSelector 
from craigslist.items import CraigslistItem 
from scrapy.http  import Request 

class MySpider(CrawlSpider): 
name = "CraigslistSpider" 
allowed_domains = ["craigslist.org"] 
start_urls = ["http://annapolis.craigslist.org/sof/"] 

rules = (
    Rule (SgmlLinkExtractor(allow=("index\d00\.html",), 
    restrict_xpaths=('//p[@id="nextpage"]',)), 
    callback="parse_items", follow= True), 
) 

# 
# Need to scrape first page...so we hack-it by creating request and 
# sending the request to the parse_items callback 
# 
def parse_start_url(self, response): 
    print ('**********************') 
    request = Request("http://annapolis.craigslist.org/sof/", callback=self.parse_items) 
    return request 

def parse_items(self, response): 
    hxs = HtmlXPathSelector(response) 
    titles = hxs.select("//p") 
    items = [] 
    for titles in titles: 
     item = CraigslistItem() 
     item ["title"] = titles.select("a/text()").extract() 
     item ["link"] = titles.select("a/@href").extract() 
     items.append(item) 
    return items   

在我的情況,我用CrawlSpider,這需要我來實現「parse_start_url '使用start_urls中找到的相同url創建請求對象,即第一頁。之後,從第一頁開始抓取。順便說一句,我是3天的scrapy和python!

+0

,我不認爲你的答案解決了這個問題,問題是要求命令start_urls和規則,哪一個將用於開始爬行。 –