将处理后的结果写入 JSON 个文件
Write processed results in JSON files
我正在使用 Scrapy 进行广泛的爬取,并且有以下要求:
- Scrapy 会抓取 URL;
- Scrapy 将解析来自 URL 的响应并将解析结果写入文件,比如
file1.json
,当且仅当 file1.json
的大小小于 2GB
。否则,Scrapy 将创建一个新文件,比如 file2.json
并将响应写入这个新文件;
- 一旦响应返回,Scrapy 将从响应中提取 URL 并跟随提取的响应。然后从第2点开始。
下面是我的代码,我可以执行第 1 步和第 3 步,但无法理解我应该将 creating the new file
、checking the size
和 writing the response
的逻辑放在哪里.
def parse(self, response):
url = response.request.url
soup = BeautifulSoup(response.text, 'lxml')
d = {}
for element in soup.find_all():
if element.name in ["html", "body", "script", "footer"]:
pass
else:
x = element.find_all(text=True, recursive=False)
if x:
d[element.name] = x
yield d ---------> I want to write this dictionary in a file as per logic of step 2
for link in soup.find_all('a', href=True):
absoluteUrl = urllib.parse.urljoin(url, link['href'])
parsedUrl = urlparse(absoluteUrl)
if parsedUrl.scheme.strip().lower() != 'https' and parsedUrl.scheme.strip().lower() != 'http':
pass
else:
url = url.replace("'", r"\'")
absoluteUrl = absoluteUrl.replace("'", r"\'")
self.graph.run(
"MERGE (child:page{page_url:'" + url + "'}) " +
"On CREATE " +
"SET child.page_url='" + url + "', child.page_rank = 1.0 " +
"MERGE (parent:page{page_url:'" + absoluteUrl + "'}) " +
"On CREATE " +
"SET parent.page_url = '" + absoluteUrl + "' , parent.page_rank = 1.0 " +
"MERGE (child)-[:FOLLOWS]->(parent)"
)
yield response.follow(absoluteUrl, callback=self.parse). ---> Step 3 ( all good )
我的问题是我应该在哪里编写创建文件、检查文件大小以及将蜘蛛响应写入该文件的逻辑(应该在管道、中间件或蜘蛛的初始化函数中)?
如有任何帮助,我们将不胜感激。我尝试学习中间件、管道等,但无法弄清楚如何实现此功能。
如果您知道每个文件在不超过 2GB 限制大小的情况下应该包含的项目的大概数量,那么您可以开箱即用地使用 FEED_EXPORT_BATCH_ITEM_COUNT
设置,并且 scrapy 会在数量达到时自动创建新文件文件中的项目数达到上述限制。在 FEEDS 页面上阅读有关此设置的更多信息。
我正在使用 Scrapy 进行广泛的爬取,并且有以下要求:
- Scrapy 会抓取 URL;
- Scrapy 将解析来自 URL 的响应并将解析结果写入文件,比如
file1.json
,当且仅当file1.json
的大小小于2GB
。否则,Scrapy 将创建一个新文件,比如file2.json
并将响应写入这个新文件; - 一旦响应返回,Scrapy 将从响应中提取 URL 并跟随提取的响应。然后从第2点开始。
下面是我的代码,我可以执行第 1 步和第 3 步,但无法理解我应该将 creating the new file
、checking the size
和 writing the response
的逻辑放在哪里.
def parse(self, response):
url = response.request.url
soup = BeautifulSoup(response.text, 'lxml')
d = {}
for element in soup.find_all():
if element.name in ["html", "body", "script", "footer"]:
pass
else:
x = element.find_all(text=True, recursive=False)
if x:
d[element.name] = x
yield d ---------> I want to write this dictionary in a file as per logic of step 2
for link in soup.find_all('a', href=True):
absoluteUrl = urllib.parse.urljoin(url, link['href'])
parsedUrl = urlparse(absoluteUrl)
if parsedUrl.scheme.strip().lower() != 'https' and parsedUrl.scheme.strip().lower() != 'http':
pass
else:
url = url.replace("'", r"\'")
absoluteUrl = absoluteUrl.replace("'", r"\'")
self.graph.run(
"MERGE (child:page{page_url:'" + url + "'}) " +
"On CREATE " +
"SET child.page_url='" + url + "', child.page_rank = 1.0 " +
"MERGE (parent:page{page_url:'" + absoluteUrl + "'}) " +
"On CREATE " +
"SET parent.page_url = '" + absoluteUrl + "' , parent.page_rank = 1.0 " +
"MERGE (child)-[:FOLLOWS]->(parent)"
)
yield response.follow(absoluteUrl, callback=self.parse). ---> Step 3 ( all good )
我的问题是我应该在哪里编写创建文件、检查文件大小以及将蜘蛛响应写入该文件的逻辑(应该在管道、中间件或蜘蛛的初始化函数中)?
如有任何帮助,我们将不胜感激。我尝试学习中间件、管道等,但无法弄清楚如何实现此功能。
如果您知道每个文件在不超过 2GB 限制大小的情况下应该包含的项目的大概数量,那么您可以开箱即用地使用 FEED_EXPORT_BATCH_ITEM_COUNT
设置,并且 scrapy 会在数量达到时自动创建新文件文件中的项目数达到上述限制。在 FEEDS 页面上阅读有关此设置的更多信息。