You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Scrapy爬取book24.ru时出现的520错误?

Book24.ru Scrapy爬虫520拦截问题及解决尝试

问题背景

我编写的Scrapy爬虫一年前可正常抓取book24.ru内容,现在网站会拦截爬虫请求,返回520错误。

Scrapy Shell返回的520错误日志

2023-01-20 22:10:23 [scrapy.utils.log] INFO: Scrapy 2.7.1 started (bot: bestsellers)
2023-01-20 22:10:23 [scrapy.utils.log] INFO: Versions: lxml 4.9.2.0, libxml2 2.9.14, cssselect 1.2.0, parsel 1.7.0, w3lib 2.1.1, Twisted 22.10.0, Python 3.10.6 (main, Nov 14 2022, 16:10:14) [GCC 11.3.0], pyOpenSSL 23.0.0 (OpenSSL 3.0.7 1 Nov 2022), cryptography 39.0.0, Platform Linux-5.15.0-58-generic-x86_64-with-glibc2.35
2023-01-20 22:10:23 [scrapy.crawler] INFO: Overridden settings:
{'BOT_NAME': 'bestsellers',
 'NEWSPIDER_MODULE': 'bestsellers.spiders',
 'REQUEST_FINGERPRINTER_IMPLEMENTATION': '2.7',
 'SPIDER_MODULES': ['bestsellers.spiders'],
 'TWISTED_REACTOR': 'twisted.internet.asyncioreactor.AsyncioSelectorReactor'}
2023-01-20 22:10:23 [asyncio] DEBUG: Using selector: EpollSelector
2023-01-20 22:10:23 [scrapy.utils.log] DEBUG: Using reactor: twisted.internet.asyncioreactor.AsyncioSelectorReactor
2023-01-20 22:10:23 [scrapy.utils.log] DEBUG: Using asyncio event loop: asyncio.unix_events._UnixSelectorEventLoop
2023-01-20 22:10:23 [scrapy.extensions.telnet] INFO: Telnet Password: cb384b87b1e215df
2023-01-20 22:10:23 [scrapy.middleware] INFO: Enabled extensions:
['scrapy.extensions.corestats.CoreStats',
 'scrapy.extensions.telnet.TelnetConsole',
 'scrapy.extensions.memusage.MemoryUsage',
 'scrapy.extensions.feedexport.FeedExporter',
 'scrapy.extensions.logstats.LogStats']
2023-01-20 22:10:23 [scrapy.middleware] INFO: Enabled downloader middlewares:
['scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware',
 'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware',
 'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware',
 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware',
 'scrapy.downloadermiddlewares.retry.RetryMiddleware',
 'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware',
 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware',
 'scrapy.downloadermiddlewares.redirect.RedirectMiddleware',
 'scrapy.downloadermiddlewares.cookies.CookiesMiddleware',
 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware',
 'scrapy.downloadermiddlewares.stats.DownloaderStats']
2023-01-20 22:10:23 [scrapy.middleware] INFO: Enabled spider middlewares:
['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware',
 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware',
 'scrapy.spidermiddlewares.referer.RefererMiddleware',
 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware',
 'scrapy.spidermiddlewares.depth.DepthMiddleware']
2023-01-20 22:10:23 [scrapy.middleware] INFO: Enabled item pipelines:
[]
2023-01-20 22:10:23 [scrapy.core.engine] INFO: Spider opened
2023-01-20 22:10:23 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2023-01-20 22:10:23 [scrapy.extensions.telnet] INFO: Telnet console listening on 127.0.0.1:6023
2023-01-20 22:10:23 [filelock] DEBUG: Attempting to acquire lock 140382385887728 on /home/user/.cache/python-tldextract/3.10.6.final__first_scrapy-rekTiTXv__400173__tldextract-3.4.0/publicsuffix.org-tlds/de84b5ca2167d4c83e38fb162f2e8738.tldextract.json.lock
2023-01-20 22:10:23 [filelock] DEBUG: Lock 140382385887728 acquired on /home/user/.cache/python-tldextract/3.10.6.final__first_scrapy-rekTiTXv__400173__tldextract-3.4.0/publicsuffix.org-tlds/de84b5ca2167d4c83e38fb162f2e8738.tldextract.json.lock
2023-01-20 22:10:23 [filelock] DEBUG: Attempting to release lock 140382385887728 on /home/user/.cache/python-tldextract/3.10.6.final__first_scrapy-rekTiTXv__400173__tldextract-3.4.0/publicsuffix.org-tlds/de84b5ca2167d4c83e38fb162f2e8738.tldextract.json.lock
2023-01-20 22:10:23 [filelock] DEBUG: Lock 140382385887728 released on /home/user/.cache/python-tldextract/3.10.6.final__first_scrapy-rekTiTXv__400173__tldextract-3.4.0/publicsuffix.org-tlds/de84b5ca2167d4c83e38fb162f2e8738.tldextract.json.lock
2023-01-20 22:10:23 [scrapy.core.engine] DEBUG: Crawled (520) <GET https://book24.ru/product/transhumanism-inc-6015821/> (referer: None)
2023-01-20 22:10:23 [scrapy.spidermiddlewares.httperror] INFO: Ignoring response <520 https://book24.ru/product/transhumanism-inc-6015821/>: HTTP status code is not handled or not allowed
2023-01-20 22:10:23 [scrapy.core.engine] INFO: Closing spider (finished)
2023-01-20 22:10:23 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 243,
 'downloader/request_count': 1,
 'downloader/request_method_count/GET': 1,
 'downloader/response_bytes': 7640,
 'downloader/response_count': 1,
 'downloader/response_status_count/520': 1,
 'elapsed_time_seconds': 0.364996,
 'finish_reason': 'finished',
 'finish_time': datetime.datetime(2023, 1, 20, 19, 10, 23, 800623),
 'httperror/response_ignored_count': 1,
 'httperror/response_ignored_status_count/520': 1,
 'log_count/DEBUG': 8,
 'log_count/INFO': 11,
 'memusage/max': 65613824,
 'memusage/startup': 65613824,
 'response_received_count': 1,
 'scheduler/dequeued': 1,
 'scheduler/dequeued/memory': 1,
 'scheduler/enqueued': 1,
 'scheduler/enqueued/memory': 1,
 'start_time': datetime.datetime(2023, 1, 20, 19, 10, 23, 435627)}
2023-01-20 22:10:23 [scrapy.core.engine] INFO: Spider closed (finished)

解决尝试

第一次尝试:添加请求头

尝试添加自定义headers伪装成浏览器请求,仍返回520错误。代码如下:

import scrapy

class BookSpider(scrapy.Spider):
    name = 'book24-2'
    start_urls = ['https://book24.ru/knigi-bestsellery/']
    
    def parse(self, response):
        headers = {
        'user-agent' : 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
        }
        
        for link in response.css('div.product-card__image-holder a::attr(href)', headers=headers).get():
            yield response.follow(link, callback=self.parse_book, headers=headers)

        for i in range(1, 25):
            next_page = f'https://book24.ru/knigi-bestsellery/page-{i}/'
            yield response.follow(next_page, callback=self.parse, headers=headers)

    def parse_book(self, response):
        yield{
            'name': response.css('h1.product-detail-page__title::text').get(),
            'buy': response.css('p.product-detail-page__purchased-text::text').get().split()[1],
            'type': response.css('div.product-characteristic__value a::attr(title)')[2].get()
        }

第二次尝试:关闭ROBOTSTXT_OBEY

将settings.py中的ROBOTSTXT_OBEY = True改为False,520错误依旧存在。

第三次尝试:使用fake_useragent库

引入fake_useragent库随机生成User-Agent,问题未解决。代码如下:

import scrapy
from fake_useragent import UserAgent

class BookSpider(scrapy.Spider):
    name = 'book24-2'
    start_urls = ['https://book24.ru/knigi-bestsellery/']
    
    def parse(self, response):
        headers = {
        'user-agent' : UserAgent().random
        }
        
        for link in response.css('div.product-card__image-holder a::attr(href)', headers=headers).get():
            yield response.follow(link, callback=self.parse_book, headers=headers)

        for i in range(1, 25):
            next_page = f'https://book24.ru/knigi-bestsellery/page-{i}/'
            yield response.follow(next_page, callback=self.parse, headers=headers)

    def parse_book(self, response):
        headers = {
        'user-agent' : UserAgent().random
        }
        
        yield{
            'name': response.css('h1.product-detail-page__title::text', headers=headers).get(),
            'buy': response.css('p.product-detail-page__purchased-text::text', headers=headers).get().split()[1],
            'type': response.css('div.product-characteristic__value a::attr(title)', headers=headers)[2].get()
        }

内容的提问来源于stack exchange,提问作者4www44

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 22:10:41