我花了很多时间玩游戏并使用谷歌,但我无法解决我的问题。我是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)
你能帮助我吗?
答案 0 :(得分:2)
要让CrawlSpider
做出“魔力”,您需要通过CrawlSpider
的{{1}}回调。
因此在parse()
您的请求必须使用start_requests()
(或不设置callback=self.parse
参数)
如果您还希望开始请求通过callback
,则需要在您的蜘蛛集中将parse_item
属性设置为parse_start_url
。
所以你需要有类似的东西:
parse_item