Python 刮痕:避免循环重新爬行
我正在为tripAdvisor附近酒店的景点建造一个刮板, scraper将解析如下URL: 我编写了两条规则来获取这些URL,第二条规则用于目标URL的下一个景点页面:Python 刮痕:避免循环重新爬行,python,scrapy,Python,Scrapy,我正在为tripAdvisor附近酒店的景点建造一个刮板, scraper将解析如下URL: 我编写了两条规则来获取这些URL,第二条规则用于目标URL的下一个景点页面: Rule(SgmlLinkExtractor(allow=(".*AttractionsNear-g.*",), restrict_xpaths=('.//div[@class="nearby_links wrap"]/a',), unique=True),
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),
但是在我的目标url中,第一条规则是有效的,刮板将重新爬网到已经解析的url,并从一开始就开始这个过程
我试图通过下载电子邮件来避免循环爬行
class LocationsDownloaderMiddleware(object):
def process_request(self, request, spider):
if(request.url.encode('ascii', errors='ignore') in deny_domains):
return IgnoreRequest()
else: return None
通过管理响应解析中的拒绝域列表
def parse_item(self, response):
deny_domains.append(response.url.encode('ascii', errors='ignore'))
但是现在这个中间件阻止了我想要解析的每个url
我怎么办?
谢谢
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
时,这意味着您没有使用回调
,而只是指定应该“遵循”这些链接,并且规则仍然适用。你可以查看文件
此外,它不会重复请求,因为scrapy正在过滤这些请求。在我的情况下,我需要回调并一起跟踪,因为我解析了一些页面,并希望继续到下一页。如果scrapy正在筛选我的请求,则没有问题。谢谢