对于分类项目,我需要大约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
每一个帮助都会给您带来帮助:)
答案 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'),
}
如前所述,从长远来看,这不是一个好主意,因为您最终会得到一个巨大的文件。