Python Can';抓取网页时不要跟随链接

Python Can';抓取网页时不要跟随链接,python,web-scraping,screen-scraping,scrapy,Python,Web Scraping,Screen Scraping,Scrapy,我意识到其他人也讨论过类似的话题,但读了这些帖子后,我仍然无法解决我的问题 我正在使用Scrapy来编写一个爬行蜘蛛,它应该能够抓取搜索结果页面。一个例子是CraigsList.org上海湾地区所有一居室公寓的结果。它们可以在这里找到: 这是湾区首批100套单卧室公寓。第201至300套公寓位于本页 在接下来的100页中,“&s=100”将改为“&s=200”等。假设我想知道这些页面上第一篇文章的名称以及结果。我知道这不是很有意义,但这只是一个简单的例子 我的问题是如何编写规则,使“&s=1

我意识到其他人也讨论过类似的话题,但读了这些帖子后,我仍然无法解决我的问题

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

这是湾区首批100套单卧室公寓。第201至300套公寓位于本页

在接下来的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
有人能把我的规则弄清楚吗,这样我就可以得到每个结果页面的第一篇文章的名字了


谢谢

基于您只需从每个索引页中提取信息,您只需生成一个适当的起始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

你应该把错误贴出来message@bwbrowning:好的,我只是觉得太长了。谢谢,这样就行了!我特别喜欢不需要使用规则的简单性。我很好奇是否有一种简单的方法可以迭代页数,
n
,而不必知道最大页数(2500页)?下面是我之前给出的一个答案,它有一个初始解析函数来确定页数,然后生成每个额外页面的请求: