0

我意识到其他人已经涵盖了类似的主题,但是阅读了这些帖子后,我仍然无法解决我的问题。

我正在使用 Scrapy 编写一个抓取搜索结果页面的爬虫。一个例子可能是 CraigsList.org 上海湾地区所有 1 居室公寓的结果。它们可以在这里找到:

http://sfbay.craigslist.org/search/apa?zoomToPosting=&query=&srchType=A&minAsk=&maxAsk=&bedrooms=1

这显示了湾区的前 100 套一居室公寓。第 201 至 300 套公寓在此页面上

http://sfbay.craigslist.org/search/apa?bedrooms=1&srchType=A&s=100

对于接下来的 100 个,“&s=100”将更改为“&s=200”等。假设我想要每个页面上的第一个帖子的名称以及结果。我知道这不是很有意义,但这只是一个简单的例子。

我的问题是如何编写规则以使“&s=100”增加到“&s=200”等。这就是我所拥有的:

from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import HtmlXPathSelector
from scrapy.item import Item, Field

class Torrent(Item):
    name = Field()

class MySpiderSpider(CrawlSpider):

    name = 'MySpider'
    allowed_domains = ['http://sfbay.craigslist.org']
    start_urls = ['http://sfbay.craigslist.org/search/apa?zoomToPosting=&query=&srchType=A&minAsk=&maxAsk=&bedrooms=1']
    rules = [Rule(SgmlLinkExtractor(allow=[r'&s=\d+']), 'parse_torrent', follow=True)]

    def parse_torrent(self, response):
        x = HtmlXPathSelector(response)
        torrent = Torrent()
        torrent['name'] = x.select("id('toc_rows')/p[2]/span[1]/a/text()").extract()
        return torrent

任何人都可以直接设置我的规则,以便我获得每个结果页面的第一个帖子的名称吗?

谢谢!

4

1 回答 1

1

在您只是从每个索引页面中提取信息的基础上,您可以生成一个适当的起始 url 列表,然后使用 BaseSpider 代替。不需要任何规则,而且使用起来要简单得多。

from scrapy.spider import BaseSpider
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import HtmlXPathSelector
from scrapy.item import Item, Field

class Torrent(Item):
    name = Field()

class MySpiderSpider(BaseSpider):
    name = 'MySpider'
    allowed_domains = ['http://sfbay.craigslist.org']
    start_urls = ['http://sfbay.craigslist.org/search/apa?bedrooms=1&srchType=A&s=%d' %n for n in xrange(0, 2500, 100)]

    def parse(self, response):
        x = HtmlXPathSelector(response)
        torrent = Torrent()
        torrent['name'] = x.select("id('toc_rows')/p[2]/span[1]/a/text()").extract()
        return torrent
于 2013-06-07T09:19:18.933 回答