我正在为tripAdvisor附近的景点建造刮刀, 刮刀将解析这样的网址:http://www.tripadvisor.com/AttractionsNear-g55711-d1218038-oa30-Dallas_Addison_Marriott_Quorum_By_the_Galleria-Dallas_Texas.html
我写了两个规则来获取这些网址,第二个是针对目标网址的下一个景点页面:
Rule(SgmlLinkExtractor(allow=(".*AttractionsNear-g.*",),
restrict_xpaths=('.//div[@class="nearby_links wrap"]/a',), unique=True),
callback='parse_item', follow=True),
Rule(SgmlLinkExtractor(allow=(".*AttractionsNear-g.*",),
restrict_xpaths=('.//div[@class="pgLinks"]/a[contains(@class, "pageNext")]',), unique=True),
callback='parse_item', follow=True),
但是在我的目标网址中,第一个规则是有效的,并且抓取工具将重新抓取到已解析的网址,并将从开始开始。
我试图避免DownloaderMiddleware
的循环抓取class LocationsDownloaderMiddleware(object):
def process_request(self, request, spider):
if(request.url.encode('ascii', errors='ignore') in deny_domains):
return IgnoreRequest()
else: return None
并通过在响应解析中管理deny_domains list-
def parse_item(self, response):
deny_domains.append(response.url.encode('ascii', errors='ignore'))
但现在这个中间件阻止了我要解析的每个网址。
我该如何管理它? 感谢
答案 0 :(得分:2)
SgmlLinkExtractor
已停止使用,您应该使用scrapy.linkextractors.LinkExtractor
。
现在您的规则应如下所示:
rules = (
Rule(
LinkExtractor(
restrict_xpaths=['xpath_to_category'],
allow=('regex_for_links')
),
follow=True,
),
Rule(
LinkExtractor(
restrict_xpaths=['xpath_to_items'],
allow=('regex_to_links')
),
callback='some_parse_method',
),
)
当您指定follow=True
时,表示您没有使用callback
,而只是指定应该“遵循”这些链接并且规则仍然适用。您可以查看文档here。
此外,它不会发出重复请求,因为scrapy正在过滤它。