我正在使用Scrapy进行广泛的爬行,并有以下要求:
- Scrapy将抓取URL;
1.当且仅当file1.json
的大小小于2GB
时,Scrapy将解析来自URL的响应,并将解析的结果写入文件,例如file1.json
。否则,Scrapy将创建一个新文件,例如file2.json
,并将响应写入该新文件;
1.一旦返回响应,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 )
我的问题是,我应该在哪里编写创建文件、检查文件大小和将蜘蛛响应写入该文件的逻辑(应该在管道、中间件还是蜘蛛的init函数中)?
任何帮助都将不胜感激。我尝试学习中间件,管道等,但不能弄清楚如何实现这个功能。
1条答案
按热度按时间h5qlskok1#
如果您知道每个文件在不超过2GB限制大小的情况下所能容纳的大致项目数,那么您可以使用
FEED_EXPORT_BATCH_ITEM_COUNT
设置,当文件中的项目数达到上述限制时,Scrapy将自动创建新文件。