【问题标题】:Scrapy keeps crawling and never stops... CrawlSpider rulesScrapy 不断爬行,永不停息…… CrawlSpider 规则
【发布时间】:2020-10-24 22:48:27
【问题描述】:

我对 python 和 scrapy 非常陌生,因此决定尝试构建一个蜘蛛,而不是仅仅害怕新的/具有挑战性的语言。

所以这是第一个蜘蛛,它的目的:

  • 它贯穿网站的页面(通过它在每个页面上找到的链接) 页)
  • 列出每个页面上存在的所有链接(a>href)
  • 在每一行中写下:找到链接的页面,链接本身 (解码+语言)、每个页面上的链接数以及每个链接的 http 响应代码。

我遇到的问题是它永远不会停止抓取,它似乎陷入了一个循环,并且总是重新抓取每个页面不止一次......

我做错了什么? (显然很多事情,因为我以前从未写过python代码,但仍然如此) 如何让蜘蛛只抓取每个页面一次?

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
import urllib.parse
import requests
import threading


class TestSpider(CrawlSpider):
    name = "test"
    allowed_domains = ["cerve.co"]
    start_urls = ["https://cerve.co"]
        rules = [Rule (LinkExtractor(allow=['.*'], tags='a', attrs='href'), callback='parse_item', follow=True)]
    
        def parse_item(self, response):
             alllinks = response.css('a::attr(href)').getall()
             for link in alllinks:
                 link = response.urljoin(link)
                 yield {
                    'page': urllib.parse.unquote(response.url),
                    'links': urllib.parse.unquote(link),
                    'number of links': len(alllinks),
                    'status': requests.get(link).status_code
                 }

【问题讨论】:

  • 你可以试试链接提取器的这个属性:唯一(布尔值)——是否应该对提取的链接应用重复过滤。如果不起作用,您可以使用“process_links”回调过滤链接
  • 感谢@akash,我尝试添加这样的独特部分:rules = [Rule (LinkExtractor(allow=['.*'], tags='a', attrs='href', unique =True), callback='parse_item', follow=True)] 它不起作用。关于使用流程链接,您如何使用它来过滤重复项?或者如果有一个很好的教程或指南可以帮助我,我很感激:)

标签: python web-scraping scrapy


【解决方案1】:

Scrapy 说: 默认情况下,Scrapy 会过滤掉对已经访问过的 URL 的重复请求。这可以通过设置DUPEFILTER_CLASS进行配置。

解决方案 1: https://docs.scrapy.org/en/latest/topics/settings.html#std-setting-DUPEFILTER_CLASS

我对您的代码的体验: 有很多链接。而且我没有看到任何重复的 url 被访问了两次。

最坏情况下的解决方案 2
settings.py 中设置DEPTH_LIMIT= 一些您选择的数字

【讨论】:

  • 谢谢朋友,按你说的做,只是需要很长时间。如果我将使用增加每个域/IP 请求和降低下载延迟的代理,那么抓取速度会更快吗?
  • 当然可以。你也可以增加并发请求。但是您必须确保该站点允许来自 bot 的如此频繁的请求
  • 谢谢@akash,我很感激。
猜你喜欢
  • 2014-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多