Python Can';抓取网页时不要跟随链接
我意识到其他人也讨论过类似的话题,但读了这些帖子后,我仍然无法解决我的问题 我正在使用Scrapy来编写一个爬行蜘蛛,它应该能够抓取搜索结果页面。一个例子是CraigsList.org上海湾地区所有一居室公寓的结果。它们可以在这里找到: 这是湾区首批100套单卧室公寓。第201至300套公寓位于本页 在接下来的100页中,“&s=100”将改为“&s=200”等。假设我想知道这些页面上第一篇文章的名称以及结果。我知道这不是很有意义,但这只是一个简单的例子 我的问题是如何编写规则,使“&s=100”增加到“&s=200”等。这就是我所拥有的: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
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页)?下面是我之前给出的一个答案,它有一个初始解析函数来确定页数,然后生成每个额外页面的请求: