例如,我有一个网站"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文件
提前致谢
答案 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服务器。然后你可以将网址分配给像
这样的scrapyhttp://127.0.0.1/example.html