我正在通过实施某种机制来抓取数据的网站,如果它检测到我的请求过于频繁,则该帐户被锁定,请求将被重定向到用户验证页面,其中需要用户滑动栏为了解锁。
可以通过硒ActionChain轻松解决滑动条,但我不知道在Scrapy中添加此功能的位置。
基本上,在我的scrapy蜘蛛中,对于我想要的每个请求:
如果是用户验证页面,
一个。我将启动一个selenium webdriver并再次发送请求。然后在webdriver中,我将解决滑动条以解锁我的帐户。
湾让蜘蛛再次使用相同的URL发送请求,然后蜘蛛不断从响应中抓取数据。
如果它不是用户验证页面,则蜘蛛像往常一样从响应中抓取数据。
您会看到,在第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 ---
我想我找到了一种更好的方法来实现这个功能。我最终创建了一个中间件类,以便它可以重用,代码库也很干净。
答案 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