用scrapy刮刮论坛

时间:2012-10-09 21:44:05

标签: python web-scraping scrapy

我正在尝试使用scrapy废弃一些论坛并将数据存储在数据库中。但是,在更新数据库时,我不知道有效地做到这一点。这就是我的蜘蛛的样子:

class ForumSpider(CrawlSpider):
name = "forum"
allowed_domains= ["forums.example.com"]
start_urls = ["forums.example.com/index.php"]
rules = (
       Rule(SgmlLinkExtractor(allow=(r'/forum?id=\d+',)), 
        follow=True,   callback='parse_index'),
    )

def parse_index(self, response):
    hxs = HtmlXPathSelector(response)
    #parsing....looking for threads.....
    #pass the data to pipeline and store in to the db....

我的问题是,当我再次废弃同一个论坛时,比如说一周之后,没有必要浏览所有页面,因为新帖子或任何有新帖子的帖子都会在其他非活动线程之上。我的想法是检查论坛的第一页(forums.example.com/forum?id=1),如果它在第一页上找到了具有相同URL和相同回复数的帖子。没有必要转到第二页。所以蜘蛛应该进入另一个论坛(forums.example.com/forum?id=2)。我尝试修改start_urls和规则,但似乎蜘蛛一旦运行它们就没有响应。有没有办法在scrapy中做到这一点?

我的第二个问题是如何为不同的蜘蛛使用不同的管道。我发现堆栈溢出的东西。但看起来scrapy并不是为了做到这一点,似乎你想为不同的网站创建一个新的项目。

我使用错误的工具来做这件事吗?或者我错过了一些东西。我想过使用mechanize和lxml来做。但我需要实现扭曲和unicode处理等等,这让我想坚持使用scrapy

由于

1 个答案:

答案 0 :(得分:1)

您要求的是在飞行中创建http请求。

在parse_index函数中执行此操作。
request = self.make_requests_from_url(http://forums.example.com/forum?id=2)
return request

如果要提交多个http请求,请返回一个数组 见Request in scrapy

你是对的第二件事,如果你想从不同的网站提取不同类型的数据,你应该编写不同的蜘蛛。