2014-03-18 72 views
3

我花了很多時間玩弄和使用谷歌,但我無法解決我的問題。我是Scrapy的新手,希望你能幫助我。廣泛的Scrapy抓取:sgmlLinkextractor規則不起作用

工作的蜘蛛的一部分:我定義我的start_requests從MySQL數據庫中刪除。通過'parse_item'語句,我將響應寫入單獨的文件中。這兩個步驟都可以正常工作。

我的問題:另外我想跟隨每個包含'.ch'的url,並且 - 和我爲start_requests一樣 - 將它們發送到'parse_item'方法。因此,我使用sgmlLinkExtractor和'parse_item'方法作爲回調來定義規則。這不起作用。完成後,我只有'start_requests'中定義的url的文件。我沒有收到任何錯誤消息。

這裏是我的代碼:

from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
import mysql.connector 
from scrapy.http import Request 

class FirstSpider(CrawlSpider): 
name = 'firstspider' 
start_urls = [] 

def start_requests(self): 
    conn = mysql.connector.connect(user='root', password = 'root', host= 'localhost', database = 'Eistee') 
    cursor = conn.cursor() 

    query = ("SELECT Domain, CompanyName FROM Crawlbydomain LIMIT 300, 100") 

    cursor.execute(query) 

    results = cursor.fetchall() 

    for result in results: 
     urlrequest = 'http://'+result[0] 
     yield Request(urlrequest, callback = self.parse_item) 

rules = (Rule (SgmlLinkExtractor(allow=('.ch',)), callback='parse_item', follow= True),) 

def parse_item(self, response): 

    filename = response.url.translate(None, './') 
    open(filename, 'wb').write(response.body) 

你能幫助我嗎?

回答

2

要讓CrawlSpider做它的「魔法」,你需要通過CrawlSpiderparse()回調請求。因此,在start_requests()

您的要求必須使用callback=self.parse(或不設置callback參數)

如果您還想要開始請求要經過你需要在蜘蛛集設置parse_start_url屬性parse_itemparse_item

所以,你需要有類似:

from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
import mysql.connector 
from scrapy.http import Request 

class FirstSpider(CrawlSpider): 
    name = 'firstspider' 

    def start_requests(self): 
     conn = mysql.connector.connect(user='root', password = 'root', host= 'localhost', database = 'Eistee') 
     cursor = conn.cursor() 

     query = ("SELECT Domain, CompanyName FROM Crawlbydomain LIMIT 300, 100") 

     cursor.execute(query) 

     results = cursor.fetchall() 

     for result in results: 
      urlrequest = 'http://'+result[0] 
      yield Request(urlrequest) 

    rules = (Rule (SgmlLinkExtractor(allow=('.ch',)), callback='parse_item', follow= True),) 

    def parse_item(self, response): 

     filename = response.url.translate(None, './') 
     open(filename, 'wb').write(response.body) 

    parse_start_url = parse_item 
+0

非常感謝你,它的工作原理! :) –

+0

要將啓動請求也發送到parse_item函數,我使用了以下方法:https://groups.google.com/forum/#!topic/scrapy-users/lAYpjTAP46Q –