加载抓取一个巨大的网页与剪贴画

2024-10-02 18:27:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我的系统规格:Ubuntu17.10,4GB内存,50GB交换

简言之,我的目标

我想从https://www.sanego.de/Arzt/Allgemeine+Chirurgie/抓取所有24.453条记录。在

问题

我无法加载页面,似乎是因为它的大小

有关页面内容的更多详细信息

最初,网页只显示前30条记录。单击按钮“title=”Mehr anzeigen“'一次我可以加载另外30多条记录。可以重复此操作,直到加载所有记录。因此,它是用javascript动态生成的。在

我的总体策略

我的想法是按“title=”Mehr anzeigen“”按钮,直到24.453条记录显示在页面上所需的次数。一旦完成,我将能够解析页面并收集所有记录。在

刮屑+硒法

我试过两种不同的蜘蛛。首先,我尝试编写一个实现Selenium的Scrapy spider来呈现动态内容。然而,这个解决方案在内存使用方面成本太高。在加载大约1500条记录后,该进程会吃掉所有RAM并崩溃

刮泥+飞溅法

我假设这个解决方案可能比前一个更快,内存需求更少,但是页面加载超过了Splash的3600秒的最大超时限制,spider崩溃了。下面我只提供这个spider的代码,因为我觉得Splash可能是一个更好的解决方案。请问你要不要我加上另一个的。在

限制内存使用

我在cgroups中运行每一个spider,内存限制为1gb。spide保持在内存限制内,但无论如何在页面完全加载之前崩溃。在

问题

请给我提供一些关于如何实现目标的建议

代码

我就是这样开始泼水的:

sudo cgexec -g memory:limitmem docker run -it --memory="1024m"
--memory-swappiness="100" -p 8050:8050 scrapinghub/splash --max-timeout 3600

我就是这样管理蜘蛛的:

^{pr2}$

卡盘主要部件:

from scrapy_splash import SplashRequest
import time
import json     
import scrapy
from scrapy import Request
from sanego.items import PersonelItem

class SanegoSpider(scrapy.Spider):

    name = "spersonel_spider"

    start_urls = ['https://www.sanego.de/Arzt/Fachgebiete/','https://www.sanego.de/Zahnarzt/Fachgebiete/', 'https://www.sanego.de/Heilpraktiker/Fachgebiete/', 'https://www.sanego.de/Tierarzt/Fachgebiete/',]  

    def parse(self, response):

        search_urls = ["https://www.sanego.de" + url for url in response.xpath('//ul[@class="itemList"]/li[contains(@class,"col-md-4")]/a/@href').extract()]

        script = """
        function main(splash)

            local url = splash.args.url
            splash.images_enabled = false

            assert(splash:go(url))
            assert(splash:wait(1))

            local element = splash:select('.loadMore')
            while element ~= nil do
                assert(element:mouse_click())
                assert(splash:wait{2,cancel_on_error=true})
                element = splash:select('.loadMore')
            end
            return {
                html = splash:html(),
                --png = splash:png(),
                --har = splash:har(),
            }
        end
        """

        for url in search_urls:
            if url == 'https://www.sanego.de/Arzt/Allgemeine+Chirurgie/':
                yield SplashRequest(url, self.parse_search_results, args={'wait': 2, 'lua_source': script, 'timeout':3600},endpoint='execute', headers={'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.1.2 Safari/603.3.8'})

Tags: 内存httpsimporturlwww记录de页面
1条回答
网友
1楼 · 发布于 2024-10-02 18:27:15

该页面在AJAX上加载了更多的数据,因此使用简单的Scrapy模拟AJAX,而不使用Splash。在

import requests

cookies = {
    'sanego_sessid': 'meomk0luq31rcjl5qp38tsftp1',
    'AWSELB': '0D1143B71ECAB811932E9F0030D39880BEAC9BABBC8CD3C44A99B4B781E433D347A4C2A6FDF836A5F4A4BE16334FBDA671EC87316CB08EB740C12A444F7E4A1EE15E3F26E2',
    '_ga': 'GA1.2.882998560.1521622515',
    '_gid': 'GA1.2.2063658924.1521622515',
    '_gat': '1',
}

headers = {
    'Origin': 'https://www.sanego.de',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'en-US,en;q=0.9',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'Accept': 'text/javascript, text/html, application/xml, text/xml, */*',
    'Referer': 'https://www.sanego.de/Arzt/Allgemeine+Chirurgie/',
    'X-Requested-With': 'XMLHttpRequest',
    'Connection': 'keep-alive',
    'DNT': '1',
}

data = [
  ('doctorType', 'Arzt'),
  ('federalStateOrMedicalArea', 'Allgemeine Chirurgie'),
  ('p', '1'),
  ('sortBy', ''),
  ('sortOrder', ''),
]

response = FormRequest('https://www.sanego.de/ajax/load-more-doctors-for-search', headers=headers, cookies=cookies, formdata=data)

注意('p', '1')参数,并保持递增直到到达最后一页。在

相关问题 更多 >