使用保存在本地系统中的html来抓取文件

时间:2012-06-05 10:12:54

标签: python scrapy

例如,我有一个网站"www.example.com" 其实我想通过保存到本地系统来刮掉这个网站的HTML。 所以为了测试,我将该页面保存在我的桌面上example.html

现在我已经为此编写了蜘蛛代码,如下所示

class ExampleSpider(BaseSpider):
   name = "example"
   start_urls = ["example.html"]

   def parse(self, response):
       print response
       hxs = HtmlXPathSelector(response)

但是当我运行上面的代码时,我收到如下错误

ValueError: Missing scheme in request url: example.html

最后,我的意图是抓取由本地系统中保存的example.html html代码组成的www.example.com文件

任何人都可以建议我如何在start_urls中分配该example.html文件

提前致谢

7 个答案:

答案 0 :(得分:19)

您可以使用以下格式的网址抓取本地文件:

 file:///127.0.0.1/path/to/file.html

不需要在您的计算机上安装http服务器。

答案 1 :(得分:8)

您可以使用HTTPCacheMiddleware,它可以让您从缓存中运行蜘蛛。 HTTPCacheMiddleware设置的文档位于here

基本上,将以下设置添加到settings.py将使其正常工作:

HTTPCACHE_ENABLED = True
HTTPCACHE_EXPIRATION_SECS = 0 # Set to 0 to never expire

然而,这需要从Web执行初始蜘蛛运行以填充缓存。

答案 2 :(得分:1)

要抓取,您可以使用以下方式抓取本地文件:

    package com.cgi.edu.bootcamp.scoringserver.web;

import java.time.LocalDateTime;
import java.util.List;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.cgi.edu.bootcamp.scoringserver.model.AuditLog;
import com.cgi.edu.bootcamp.scoringserver.model.User;
import com.cgi.edu.bootcamp.scoringserver.model.enums.AuditActionType;
import com.cgi.edu.bootcamp.scoringserver.service.AuditLogService;

@RestController
@RequestMapping("/audit")
public class AuditLogRestController {

    @Autowired
    private AuditLogService auditLogService;

    @GetMapping("/action")
    public ResponseEntity<List<AuditLog>> getLogsByAction(@RequestParam("action") AuditActionType action){
        return ResponseEntity.ok(auditLogService.findByAction(action));
    }

}

我建议您使用刮擦的外壳'file:///path_of_directory/example.html'进行检查

答案 3 :(得分:1)

只需与本地文件共享我喜欢的抓取方式:

import scrapy
import os

LOCAL_FILENAME = 'example.html'
LOCAL_FOLDER = 'html_files'
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


class ExampleSpider(scrapy.Spider):
    name = "example"
    start_urls = [
        f"file://{BASE_DIR}/{LOCAL_FOLDER}/{LOCAL_FILENAME}"
    ]

我正在使用f字符串(python 3.6 +)(https://www.python.org/dev/peps/pep-0498/),但是您可以根据需要使用%-formatting或str.format()进行更改。

答案 4 :(得分:0)

scrapy shell "file:E:\folder\to\your\script\Scrapy\teste1\teste1.html"

这在Windows 10上对我今天有效。 我必须输入没有////的完整路径。

答案 5 :(得分:0)

你可以很简单

def start_requests(self):
    yield Request(url='file:///path_of_directory/example.html')

答案 6 :(得分:-5)

如果您查看scrapy的源代码请求示例github。您可以了解scrapy向http服务器发送请求的内容以及从服务器获取响应所需的页面。您的文件系统不是http服务器。对于scrapy的测试目的,您必须设置http服务器。然后你可以将网址分配给像

这样的scrapy
http://127.0.0.1/example.html