广泛的Scrapy抓取:sgmlLinkextractor规则不起作用

时间:2014-03-18 19:39:45

标签: scrapy

我花了很多时间玩游戏并使用谷歌,但我无法解决我的问题。我是Scrapy的新手,希望你能帮助我。

部分蜘蛛有效:我从MySQL数据库中定义了start_requests url。使用' parse_item'声明我将响应写入单独的文件。这两个步骤都可以正常工作。

我的问题:此外,我想关注每个包含' .ch'并且 - 正如我对start_requests所做的那样 - 将它们发送到' parse_item'方法。因此,我使用sgmlLinkExtractor和' parse_item'定义了一个规则。方法作为回调。这不起作用。完成后,我只有在' start_requests'中定义的网址文件。我没有收到任何错误消息。

这是我的代码:

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)

你能帮助我吗?

1 个答案:

答案 0 :(得分:2)

要让CrawlSpider做出“魔力”,您需要通过CrawlSpider的{​​{1}}回调。

因此在parse()您的请求必须使用start_requests()(或不设置callback=self.parse参数)

如果您还希望开始请求通过callback,则需要在您的蜘蛛集中将parse_item属性设置为parse_start_url

所以你需要有类似的东西:

parse_item