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