这是我编写的用于抓取“blablacar”网站的代码。
# -*- coding: utf-8 -*-
import scrapy
class BlablaSpider(scrapy.Spider):
name = 'blabla'
allowed_domains = ['blablacar.in']
start_urls = ['http://www.blablacar.in/ride-sharing/new-delhi/chandigarh']
def parse(self, response):
print(response.text)
Run Code Online (Sandbox Code Playgroud)
运行上述程序时,我收到错误消息
2018-06-11 00:07:05 [scrapy.extensions.telnet] 调试:Telnet 控制台监听 127.0.0.1:6023 2018-06-11 00:07:06 [scrapy.core.engine] 调试:爬行 (403) ) http://www.blablacar.in/robots.txt> (referer: None) 2018-06-11 00:07:06 [scrapy.core.engine] DEBUG: Crawled (403) http://www.blablacar .in/ride-sharing/new-delhi/chandigarh> (referer: None) 2018-06-11 00:07:06 [scrapy.spidermiddlewares.httperror] INFO:忽略响应 <403 http://www.blablacar.in /ride-sharing/new-delhi/chandigarh >: HTTP 状态代码未处理或不允许 2018-06-11 00:07:06 [scrapy.core.engine] INFO: Closing spider (finished)
我正在尝试在python 2.7中运行scrapy项目,但我遇到了这个问题.我有其他问题,但解决了他们sudo pip install ...我在谷歌查找但无法找到任何解决这个问题.
我使用 scrapy 创建了一个脚本来从网页中获取一些字段。登陆页面的 url 和内部页面的 url 经常被重定向,因此我创建了一个中间件来处理该重定向。然而,当我看到这篇文章时,我明白我需要return request在process_request()用原始网址替换重定向网址后。
meta={'dont_redirect': True,"handle_httpstatus_list": [301,302,307,429]}当请求从蜘蛛发送时,它总是存在的。
由于所有请求都没有被重定向,我尝试替换_retry()方法中的重定向网址。
def process_request(self, request, spider):
request.headers['User-Agent'] = self.ua.random
def process_exception(self, request, exception, spider):
return self._retry(request, spider)
def _retry(self, request, spider):
request.dont_filter = True
if request.meta.get('redirect_urls'):
redirect_url = request.meta['redirect_urls'][0]
redirected = request.replace(url=redirect_url)
redirected.dont_filter = True
return redirected
return request
def process_response(self, request, response, spider):
if response.status in [301, 302, 307, 429]:
return self._retry(request, spider)
return response
Run Code Online (Sandbox Code Playgroud)
问题:使用中间件将重定向的 url 替换为原始 url 后如何发送请求?
我正在爬网数千页,需要一个解决方案。每个站点都有自己的html代码-它们都是唯一的站点。没有干净的数据源或API。我希望将捕获的数据加载到某种数据库中。
如果可能的话,有什么想法可以解决吗?