在Scrapy spider

时间:2018-02-15 01:39:58

标签: python selenium scrapy

我正在通过实施某种机制来抓取数据的网站,如果它检测到我的请求过于频繁,则该帐户被锁定,请求将被重定向到用户验证页面,其中需要用户滑动栏为了解锁。

可以通过硒ActionChain轻松解决滑动条,但我不知道在Scrapy中添加此功能的位置。

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

  1. 检查响应是否为用户验证页面
  2. 如果是用户验证页面,

    一个。我将启动一个selenium webdriver并再次发送请求。然后在webdriver中,我将解决滑动条以解锁我的帐户。

    湾让蜘蛛再次使用相同的URL发送请求,然后蜘蛛不断从响应中抓取数据。

  3. 如果它不是用户验证页面,则蜘蛛像往常一样从响应中抓取数据。

  4. 您会看到,在第2步中,scrapy spider需要两次请求相同的url,而selenium webdriver将需要请求一次url。我不确定如何在scrapy框架中实现它。有什么想法吗?

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

    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 ---

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

1 个答案:

答案 0 :(得分:0)

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