由于url中的会话ID不同而无休止地进行爬网

时间:2014-10-14 11:11:24

标签: python scrapy

如何防止scrapy无休止地抓取网站,当只有网址特别是会话ID或类似的内容被更改并且网址背后的内容相同时。 有没有办法检测到它?

我已经阅读了这个Avoid Duplicate URL CrawlingScrapy - how to identify already scraped urls和那个how to filter duplicate requests based on url in scrapy,但是为了解决我的问题,这是不够的。

1 个答案:

答案 0 :(得分:0)

有两种方法可以做到这一点,两者都与你所链接的问题有关。

使用一个,您可以确定哪些URL参数使页面唯一,并告诉您的自定义重复请求过滤器忽略URL的其他部分。这类似于https://stackoverflow.com/a/13605919的答案。

示例:

url: http://www.example.org/path/getArticle.do?art=42&sessionId=99&referrerArticle=88
important bits: protocol, host, path, query parameter "art"
implementation:
def url_fingerprint(self, url):
    pr = urlparse.urlparse(url)
    queryparts = pr.query.split('&')
    for prt in queryparts:
        if prt.split("=")[0] != 'art':
            queryparts.remove(prt)
   return urlparse.urlunparse(ParseResult(scheme=pr.scheme, netloc=pr.netloc, path=pr.path, params=pr.params, query='&'.join(queryparts), fragment=pr.fragment))

另一种方法是确定页面上的哪些信息使其唯一,并使用IgnoreVisitedItems中间件(根据https://stackoverflow.com/a/4201553)或蜘蛛代码中的字典/集。如果你去字典/设置路线,你将从页面中获取蜘蛛提取物的一些信息并查看字典/设置以查看你之前是否已经看过该页面;如果是这样,你可以停止解析并返回。

您需要提取的信息取决于您的目标网站。它可能是文章的标题,OpenGraph <og:url>标签等。