Scrapy 粗刮爬网:sgmlLinkextractor规则不起作用

Scrapy 粗刮爬网:sgmlLinkextractor规则不起作用,scrapy,Scrapy,我花了很多时间在谷歌上玩,但我无法解决我的问题。我是个新手,希望你能帮助我 spider工作的一部分:我从MySQL数据库中定义我的start_请求URL。使用“parse_item”语句,我将响应写入单独的文件中。这两个步骤都很好 我的问题是:另外,我希望跟踪包含“.ch”的每个url,并且-就像我对start\u请求所做的那样-将它们发送到“parse\u item”方法。因此,我使用sgmlLinkExtractor和“parse_item”方法定义了一个规则作为回调。这是行不通的。完成后

我花了很多时间在谷歌上玩,但我无法解决我的问题。我是个新手,希望你能帮助我

spider工作的一部分:我从MySQL数据库中定义我的start_请求URL。使用“parse_item”语句,我将响应写入单独的文件中。这两个步骤都很好

我的问题是:另外,我希望跟踪包含“.ch”的每个url,并且-就像我对start\u请求所做的那样-将它们发送到“parse\u item”方法。因此,我使用sgmlLinkExtractor和“parse_item”方法定义了一个规则作为回调。这是行不通的。完成后,我只有“启动请求”中定义的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)

你能帮帮我吗?

要让
爬行蜘蛛
发挥它的“魔力”,你需要请求通过
爬行蜘蛛
解析()
回调

因此,在
start\u requests()
中,您的请求必须使用
callback=self.parse
(或者不设置
callback
参数)

如果您还希望开始请求通过
parse_item
,则需要将spider集合中的
parse_start_url
属性设置为
parse_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

为了将启动请求也发送到parse_item函数,我使用了以下方法: