我想使用Scrapy
来抓取网站数据。每个页面内容中都有一个元素,即URL。
由于网站上的页面太多,我只想仅检索包含TXT文件中指定URL的页面。
因此,抓取工具会检查网站,提取响应元素,检查该文件中是否存在从页面内容中提取的URL ,然后将响应数据保存到JSON文件中。
这是我到目前为止的内容:
import scrapy
import json
import uuid
import os
from scrapy.linkextractors.lxmlhtml import LxmlLinkExtractor
from scrapy.spiders import CrawlSpider, Rule
class ItemSpider(CrawlSpider):
name = "items"
allowed_domains = ['example.com']
start_urls = ['http://www.example.com/template/template1.html']
rules = (Rule(LxmlLinkExtractor(allow = (), canonicalize=True, unique=True), callback = 'parse_obj', follow = True), )
def parse_obj(self, response):
for link in LxmlLinkExtractor(allow = self.allowed_domains, canonicalize=True, unique=True).extract_links(response):
with open("urls.txt", "r") as checkfile:
if response.xpath("//a[contains(text(),'example2.net')]/text()").extract() in checkfile.readlines():
response_obj = {}
counter = 1
for item in response.css("#dle-content"):
title = item.css(".storytitle::text").extract()
title_name = title[0]
response_obj[counter] = {
'demo': item.xpath("//a[contains(text(),'example2.net')]/text()").extract(),
'websiteurl': response.url,
'date': item.css(".copy > a:first-child::text").extract(),
}
counter += 1
filename = str(uuid.uuid4()) + ".json"
with open(os.path.join('C:/scrapy/tutorial/result/', filename), 'w') as fp:
json.dump(response_obj, fp)
第二个问题:
似乎搜寻器不会停止搜寻。该网站没有多少网页可供该搜寻器保存为结果。它根本没有停止,生成了超过15万个结果文件,然后我自己停止了命令。
我认为这是令人兴奋的结果。我对吗? 我知道scrapy不会抓取已抓取的url。但是我认为这可能是错误的,阻止了这种情况的发生。
答案 0 :(得分:0)
您是否考虑过将要抓取的URL存储在数据库中,并将其作为起始URL传递?