我意识到其他人已经涵盖了类似的主题,但阅读这些帖子后,我仍然无法解决我的问题。
我正在使用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
任何人都可以直接设置我的规则,以便获得每个结果页面的第一篇文章的名称吗?
谢谢!
答案 0 :(得分: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