使用Scrapy进行爬网之前,请检查文件中是否存在URL

时间:2019-03-10 08:51:47

标签: python scrapy

我想使用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。但是我认为这可能是错误的,阻止了这种情况的发生。

1 个答案:

答案 0 :(得分:0)

您是否考虑过将要抓取的URL存储在数据库中,并将其作为起始URL传递?