使用scrapy提取大量着陆页的原始html内容

时间:2019-02-12 09:28:06

标签: python scrapy web-crawler

对于分类项目,我需要大约1000个网站的原始html内容。我只需要登录页面即可,不需要更多内容,因此搜寻器无需点击链接!我想使用scrapy,但无法将代码组合在一起。因为我在文档中读到JSON文件首先存储在内存中,然后保存(这在爬取大量页面时可能会导致问题),所以我想以“ .js”格式保存文件。我使用Anaconda promt执行我的代码。

我希望生成的文件具有两列,一列包含域名,第二列包含每个站点上的raw_html内容

domain, html_raw
 ..., ...
 ..., ...

我发现了许多Spider范例,但我想不出如何将所有内容放在一起。这就是我走了多远(:

启动项目:

scrapy startproject dragonball

实际的蜘蛛(可能是完全错误的):

import scrapy

class DragonSpider(scrapy.Spider):
    name = "dragonball"

    def start_requests(self):
        urls = [
            'https://www.faz.de',
            'https://www.spiegel.de',
            'https://www.stern.de',
            'https://www.brandeins.de',
        ]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        ???

我导航到Dragonball文件夹并使用以下命令执行文件:

scrapy crawl dragonball -o dragonball.jl

每一个帮助都会给您带来帮助:)

2 个答案:

答案 0 :(得分:1)

我建议您将html存储到文件中,并将文件名写入csv。将数据保留为domain, html_raw格式会更容易。

您可以使用通用的with open('%s.html' % domain, 'w') as f: f.write(response.body)下载文件,也可以使用FILES管道下载文件,请在此处查看文档:{​​{3}}

您可以得到的域:

from urllib.parse import urlparse
domain = urlparse(response.url).netloc

答案 1 :(得分:0)

如果您确实要将所有内容存储在一个文件中,则可以使用以下内容(包括vezunchikik答案的一部分):

    def parse(self, response):
        yield {
            'domain': urlparse(response.url).netloc,
            'html_raw': response.body.decode('utf-8'),
        }

如前所述,从长远来看,这不是一个好主意,因为您最终会得到一个巨大的文件。