首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scrapy蜘蛛解析前检查响应

Scrapy蜘蛛解析前检查响应
EN

Stack Overflow用户
提问于 2018-02-15 01:39:58
回答 1查看 1.1K关注 0票数 0

我正在从实现的某个机制中抓取数据的网站,如果它检测到我的请求太频繁,那么帐户就会被锁定,请求将被重定向到一个用户验证页面,在该页面中,它需要用户滑动一个条才能解锁。

selenium ActionChain很容易解决滑动条的问题,但是我不知道在Scrapy中添加这个功能的位置。

基本上,在我的抓取蜘蛛中,对于我想要的每一个请求:

  1. 检查响应是否是用户验证页面。
  2. 如果是用户验证页面, 我将启动一个selenium webdriver并再次发送请求。然后在网络驱动程序中,我将解决滑动条解锁我的帐户。 再次要求蜘蛛用相同的url发送请求,然后蜘蛛继续从响应中抓取数据。
  3. 如果不是用户验证页面,那么蜘蛛就会像往常一样从响应中刮取数据。

您可以看到,在步骤2中,刮伤蜘蛛将需要两次请求相同的url,selenium webdriver则需要请求一次url。我不知道如何在scrapy框架中实现这一点。有什么想法吗?

下面是我的蜘蛛结构,我不知道在哪里添加上述功能。还是应该使用中间件?

代码语言:javascript
复制
class MySpider(scrapy.Spider):
    name = 'my_spider'

    def start_request(self):
        # read urls from external file
        urls = [...] 
        for url in urls:
            yield scrapy.Request(url)  # the response could be a user validation page

    def parse(self, response):
        # parse a valid page and scrape data
        yield item

- 2018-03-19更新

我想我找到了一个更好的方法来实现这个功能。最后,我创建了一个中间件类,以便它是可重用的,并且代码库是干净的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-15 02:01:55

代码语言:javascript
复制
class MySpider(scrapy.Spider):
    name = 'my_spider'

    def start_request(self):
        # read urls from external file
        urls = [...] 
        for url in urls:
            yield scrapy.Request(url)  # the response could be a user validation page

    def parse(self, response):
        # check if it's the user validation page
        # here i assume you know how to judge if it's a user validation page
        if validation page:
            #Selenium goes here
            browser = webdriver.PhantomJS()
            ...
            yield scrapy.Request(browser.current_url)  # send the request again

        # not the validation page
        else:
            #parse the data
        yield item
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48798903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档