我正在使用Scrapy temp = ptr[yearIndex].teams[j].fum;
抓取网站并处理其网页内容。为此,我使用的是Scrapy Docs Crawlspider Example。
链接上的特定页面通过GET请求(例如CrawlSpider
)接受参数target
,并且如果值是错误的,则重定向(302)。收到此302 HTTP响应后,scrapy会遵循重定向,但不会按照我的意图处理http://www.example.com?target=x
方法中的response
。
我遇到了一些建议parse_item
的解决方案,但似乎都没有生效。
请建议如何解析302重定向的响应,不在/之后在302重定向位置。
Scrapy版本:0.24.6
答案 0 :(得分:2)
要停用重定向,您应该将meta={'dont_redirect': True)
添加到已投降的scrapy.Request
所以你的蜘蛛看起来应该是这样的:
import scrapy
class MySpider(scrapy.Spider):
name = 'myspider'
start_urls = ['http://example.com',]
def start_requests(self):
for url in self.start_urls:
yield scrapy.Request(url, meta={'dont_redirect':True})
这里发生的事情是scrapy有一个名为RedirectMiddleware的默认下载中间件,它默认启用并处理所有重定向,通过提供这个meta参数,你告诉这个中间件不要为这个特定请求做这个工作。
如果您想为每个请求禁用重定向(通常不是最好的主意),您只需添加
REDIRECTS_ENABLED = False
到scrapy项目中的settings.py
。
有关scrapy文档的精彩插图,说明所有scrapy片段(如中间件和蜘蛛)如何协同工作: http://doc.scrapy.org/en/latest/topics/architecture.html
答案 1 :(得分:0)
class LagouSpider(CrawlSpider):
handle_httpstatus_list = [302]
meta = {'dont_redirect': True, "handle_httpstatus_list": [302]}
name = 'lagou'
allowed_domains = ['www.lagou.com']
start_urls = ['https://www.lagou.com']
login_url = "https://passport.lagou.com/login/login.html"
custom_settings = {'REDIRECT_ENABLED': False}
rules = (
Rule(LinkExtractor(allow=("zhaopin/.*",)), follow=True),
Rule(LinkExtractor(allow=("gongsi/j\d+.html",)), follow=True),
Rule(LinkExtractor(allow=r'jobs/\d+.html'), callback='parse_job', follow=True),
)
headers = {
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive',
'Host': 'www.lagou.com',
'Referer': 'https://www.lagou.com/',
'X-Anit-Forge-Code': '0',
'X-Anit-Forge-Token': 'None',
'Accept-Encoding': 'gzip, deflate, br',
'X-Requested-With': 'XMLHttpRequest'
}
def start_requests(self):
global rc, im
browser = webdriver.Chrome(executable_path="/home/wqh/下载/chromedriver")
browser.get(self.login_url)
# ··········(some code)
return [scrapy.Request(self.start_urls[0], cookies=cookie_dict,
meta=self.meta)]
def parse_job(self, response):
if response.status == 302:
print("302")
time.sleep(100)